annotate packages/redboot/current/src/fs/disk.c @ 1725:e0ebd07e25f3

* cdl/redboot.cdl: Change CYGNUM_REDBOOT_FLASH_BASE to a booldata so we don't always look at address 0 for the flash!
author asl
date Tue, 14 Sep 2004 14:02:47 +0000
parents a6660704f7a6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
2 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
3 // disk.c
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
4 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
5 // RedBoot disk support
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
6 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
12 // Copyright (C) 2002 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
41 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
43 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
44 // Author(s): msalter
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
45 // Contributors: msalter
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
46 // Date: 2001-07-14
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
47 // Purpose:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
48 // Description:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
49 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
50 // This code is part of RedBoot (tm).
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
51 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
53 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
54 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
55
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
56 #include <redboot.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
57 #include <fs/disk.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
58
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
59 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
60 #include <fs/e2fs.h>
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
61 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
62 #ifdef CYGSEM_REDBOOT_DISK_ISO9660
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
63 #include <fs/iso9660fs.h>
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
64 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
65
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
66 static void do_disks(int argc, char *argv[]);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
67
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
68 RedBoot_cmd("disks",
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
69 "Display disks/partitions.",
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
70 "",
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
71 do_disks
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
72 );
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
73
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
74 static disk_t disk_table[CYGNUM_REDBOOT_MAX_DISKS];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
75 static int disk_count = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
76
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
77 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
78 find_dos_partitions(disk_t *d, cyg_uint8 *mbr)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
79 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
80 cyg_uint32 s, n, tmp;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
81 struct mbr_partition *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
82 int i, found = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
83
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
84 p = (struct mbr_partition *)(mbr + MBR_PTABLE_OFFSET);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
85
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
86 // Look for primary partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
87 for (i = 0; i < 4 && i < CYGNUM_REDBOOT_MAX_PARTITIONS; i++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
88
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
89 // Have to use memcpy because of alignment
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
90 memcpy(&tmp, p->start_sect, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
91 s = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
92 memcpy(&tmp, p->nr_sects, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
93 n = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
94
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
95 if (s && n) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
96 ++found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
97 d->partitions[i].disk = d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
98 d->partitions[i].start_sector = s;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
99 d->partitions[i].nr_sectors = n;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
100 d->partitions[i].systype = p->sys_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
101 d->partitions[i].bootflag = p->boot_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
102 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
103 p++;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
104 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
105
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
106 #if CYGNUM_REDBOOT_MAX_PARTITIONS > 4
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
107 {
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
108 cyg_uint32 buf[SECTOR_SIZE/sizeof(cyg_uint32)], xoffset;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
109 cyg_uint16 magic;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
110 int nextp;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
111
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
112 // Go back through and find extended partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
113 for (i = 0, nextp = 4; i < 4 && nextp < CYGNUM_REDBOOT_MAX_PARTITIONS; i++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
114 if (d->partitions[i].systype == SYSTYPE_EXTENDED) {
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
115 // sector offsets in partition tables are relative to start
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
116 // of extended partition.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
117 xoffset = d->partitions[i].start_sector;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
118 for ( ; nextp < CYGNUM_REDBOOT_MAX_PARTITIONS; ++nextp) {
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
119
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
120 // read partition boot record (same format as mbr except
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
121 // there should only be 2 entries max: a normal partition
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
122 // and another extended partition
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
123 if (DISK_READ(d, xoffset, buf, 1) <= 0)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
124 break;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
125
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
126 magic = *(cyg_uint16 *)((char *)buf + MBR_MAGIC_OFFSET);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
127 if (SWAB_LE16(magic) != MBR_MAGIC)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
128 break;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
129
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
130 p = (struct mbr_partition *)((char *)buf + MBR_PTABLE_OFFSET);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
131
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
132 // Have to use memcpy because of alignment
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
133 memcpy(&tmp, p->start_sect, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
134 s = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
135 memcpy(&tmp, p->nr_sects, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
136 n = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
137
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
138 if (s && n) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
139 ++found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
140 d->partitions[nextp].disk = d;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
141 d->partitions[nextp].start_sector = s + xoffset;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
142 d->partitions[nextp].nr_sectors = n;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
143 d->partitions[nextp].systype = p->sys_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
144 d->partitions[nextp].bootflag = p->boot_ind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
145 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
146 ++p;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
147
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
148 memcpy(&tmp, p->start_sect, 4);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
149 s = SWAB_LE32(tmp);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
150 memcpy(&tmp, p->nr_sects, 4);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
151 n = SWAB_LE32(tmp);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
152
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
153 // more extended partitions?
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
154 if (p->sys_ind != SYSTYPE_EXTENDED || !s || !n)
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
155 break;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
156
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
157 xoffset += s;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
158 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
159 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
160 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
161 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
162 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
163 return found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
164 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
165
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
166
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
167 // Find partitions on given disk.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
168 // Return number of partitions found
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
169 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
170 find_partitions(disk_t *d)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
171 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
172 cyg_uint32 buf[SECTOR_SIZE/sizeof(cyg_uint32)];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
173 cyg_uint16 magic;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
174 partition_t *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
175 int i, found = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
176
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
177
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
178 if (d->kind == DISK_IDE_CDROM) {
186
d60da272beeb Merge from eCos master repository on 2001-10-05-06:43:03-BST
jlarmour
parents: 182
diff changeset
179 #ifdef CYGSEM_REDBOOT_DISK_ISO9660
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
180 // no partition table, so fake it
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
181 p = d->partitions;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
182 p->disk = d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
183 p->start_sector = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
184 p->nr_sectors = d->nr_sectors;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
185 p->funs = &redboot_iso9660fs_funs;
186
d60da272beeb Merge from eCos master repository on 2001-10-05-06:43:03-BST
jlarmour
parents: 182
diff changeset
186 return 1;
d60da272beeb Merge from eCos master repository on 2001-10-05-06:43:03-BST
jlarmour
parents: 182
diff changeset
187 #else
d60da272beeb Merge from eCos master repository on 2001-10-05-06:43:03-BST
jlarmour
parents: 182
diff changeset
188 return 0;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 176
diff changeset
189 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
190 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
191
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
192 // read Master Boot Record
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
193 if (DISK_READ(d, 0, buf, 1) <= 0)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
194 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
195
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
196 // Check for DOS MBR
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
197 magic = *(cyg_uint16 *)((char *)buf + MBR_MAGIC_OFFSET);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
198 if (SWAB_LE16(magic) == MBR_MAGIC) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
199 found = find_dos_partitions(d, (cyg_uint8 *)buf);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
200 } else {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
201 // Might want to handle other MBR types, here...
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
202 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
203
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
204 // Now go through all partitions and install the correct
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
205 // funcs for supported filesystems.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
206 for (i = 0, p = d->partitions; i < CYGNUM_REDBOOT_MAX_PARTITIONS; i++, p++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
207 switch (p->systype) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
208 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
209 case SYSTYPE_LINUX:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
210 p->funs = &redboot_e2fs_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
211 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
212 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
213 #ifdef CYGSEM_REDBOOT_DISK_FAT16
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
214 case SYSTYPE_FAT16:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
215 p->funs = &redboot_fat16_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
216 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
217 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
218 #ifdef CYGSEM_REDBOOT_DISK_FAT32
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
219 case SYSTYPE_FAT32:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
220 p->funs = &redboot_fat32_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
221 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
222 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
223 default:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
224 break; // ignore unsupported filesystems
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
225 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
226 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
227
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
228 return found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
229 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
230
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
231 // Add a disk to the disk table.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
232 // Return zero if no more room in table.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
233 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
234 disk_register(disk_t *d)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
235 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
236 int i;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
237
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
238 // make sure we have room for it
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
239 if (disk_count >= CYGNUM_REDBOOT_MAX_DISKS)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
240 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
241
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
242 // Set the index
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
243 d->index = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
244 for (i = 0; i < disk_count; i++)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
245 if (disk_table[i].kind == d->kind)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
246 d->index++;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
247
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
248 // put it in the table
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
249 disk_table[disk_count] = *d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
250
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
251 // fill in partition info
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
252 find_partitions(&disk_table[disk_count++]);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
253
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
254 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
255 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
256
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
257 // Convert a filename in the form <partition_name>:<filename> into
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
258 // a partition and path.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
259 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
260 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
261 disk_parse_filename(const char *name, partition_t **part, const char **path)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
262 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
263 int i, kind, index, pindex;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
264
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
265 kind = index = pindex = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
266
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
267 if (name[0] == 'h' && name[1] == 'd') {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
268 // IDE hard drives
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
269 kind = DISK_IDE_HD;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
270 if (name[2] < 'a' || name[2] > 'z')
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
271 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
272 index = name[2] - 'a';
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
273 if (name[3] < '1' || name[3] >= ('1' + CYGNUM_REDBOOT_MAX_PARTITIONS))
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
274 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
275 pindex = name[3] - '1';
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
276 if (name[4] != ':')
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
277 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
278 *path = &name[5];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
279 }
200
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
280 #ifdef CYGSEM_REDBOOT_DISK_ISO9660
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
281 else if (name[0] == 'c' && name[1] == 'd') {
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
282 // CD drives
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
283 kind = DISK_IDE_CDROM;
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
284 if (name[2] < '0' || name[2] > '9')
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
285 return 0;
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
286 index = name[2] - '0';
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
287 if (name[3] != ':')
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
288 return 0;
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
289 *path = &name[4];
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
290 }
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
291 #endif
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
292
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
293 if (kind) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
294 for (i = 0; i < CYGNUM_REDBOOT_MAX_DISKS; i++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
295 if (disk_table[i].kind == kind && disk_table[i].index == index) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
296 *part = &disk_table[i].partitions[pindex];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
297 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
298 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
299 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
300 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
301 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
302 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
303
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
304 static const struct {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
305 int kind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
306 const char *str;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
307 } systype_names[] = {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
308 { SYSTYPE_FAT12, "FAT12" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
309 { SYSTYPE_FAT16_32M, "FAT16 <32M" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
310 { SYSTYPE_FAT16, "FAT16" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
311 { SYSTYPE_EXTENDED, "Extended" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
312 { SYSTYPE_LINUX_SWAP, "Linux Swap" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
313 { SYSTYPE_LINUX, "Linux" }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
314 };
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
315
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
316 static const char *
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
317 systype_name(int systype)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
318 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
319 int i;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
320
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
321 for (i = 0; i < sizeof(systype_names)/sizeof(systype_names[0]); i++)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
322 if (systype_names[i].kind == systype)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
323 return systype_names[i].str;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
324 return "Unknown";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
325 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
326
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
327 // List disk partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
328 static void
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
329 do_disks(int argc, char *argv[])
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
330 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
331 int i, j;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
332 disk_t *d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
333 partition_t *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
334 char name[16];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
335
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
336 for (i = 0, d = disk_table; i < disk_count; i++, d++) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
337 switch (d->kind) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
338 case DISK_IDE_HD:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
339 for (j = 0, p = d->partitions;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
340 j < CYGNUM_REDBOOT_MAX_PARTITIONS;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
341 j++, p++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
342 if (p->systype) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
343 diag_sprintf(name, "hd%c%d", 'a' + d->index, j+1);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
344 diag_printf("%-8s %s\n", name, systype_name(p->systype));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
345 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
346 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
347 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
348 case DISK_IDE_CDROM:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
349 diag_sprintf(name, "cd%d", d->index);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
350 diag_printf("%-8s ISO9660\n", name);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
351 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
352 }
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
353 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
354 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
355
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
356 static void *fileptr;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
357 static partition_t *file_part;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
358
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
359 externC int
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
360 disk_stream_open(connection_info_t *info, int *err)
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
361 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
362 const char *filepath;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
363 char *filename = info->filename;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
364
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
365 // The filename is in <disk>:<path> format.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
366 // Convert to a partition and path.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
367 if (!disk_parse_filename(filename, &file_part, &filepath)) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
368 *err = diskerr_badname;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
369 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
370 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
371
200
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
372 if (file_part->disk->kind != DISK_IDE_CDROM && file_part->systype == 0) {
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
373 *err = diskerr_partition;
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
374 return -1;
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
375 }
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
376
8147f1c99f15 Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents: 186
diff changeset
377 if (file_part->funs == (fs_funs_t *)0) {
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
378 *err = diskerr_partition;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
379 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
380 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
381
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
382 fileptr = (file_part->funs->open)(file_part, filepath);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
383 if (fileptr == NULL) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
384 *err = diskerr_open;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
385 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
386 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
387 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
388 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
389
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
390 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
391 disk_stream_read(char *buf, int size, int *err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
392 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
393 int nread;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
394
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
395 if ((nread = (file_part->funs->read)(fileptr, buf, size)) < 0) {
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
396 *err = diskerr_read;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
397 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
398 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
399 return nread;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
400 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
401
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
402 externC void
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
403 disk_stream_close(int *err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
404 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
405 fileptr = NULL;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
406 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
407
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
408 externC char *
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
409 disk_error(int err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
410 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
411 switch (err) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
412 case diskerr_badname:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
413 return "Bad filename";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
414 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
415 case diskerr_partition:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
416 return "Unsupported filesystem";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
417 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
418 case diskerr_open:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
419 return "Can't open file";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
420 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
421 case diskerr_read:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
422 return "Can't read file";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
423 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
424 default:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
425 return "Unknown error";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
426 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
427 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
428 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
429
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
430 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
431 // RedBoot interface
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
432 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
433 GETC_IO_FUNCS(disk_io, disk_stream_open, disk_stream_close,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
434 0, disk_stream_read, disk_error);
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
435 RedBoot_load(disk, disk_io, true, true, 0);