Mercurial > nand-ecoscentric
annotate packages/redboot/current/src/fs/disk.c @ 177:4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
| author | jlarmour |
|---|---|
| date | Fri, 10 Aug 2001 19:27:55 +0000 |
| parents | 3902ef905c9c |
| children | f62680ef1804 |
| 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 //========================================================================== |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
8 //####COPYRIGHTBEGIN#### |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
9 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
10 // ------------------------------------------- |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
11 // The contents of this file are subject to the Red Hat eCos Public License |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
12 // Version 1.1 (the "License"); you may not use this file except in |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
13 // compliance with the License. You may obtain a copy of the License at |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
14 // http://www.redhat.com/ |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
15 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
18 // License for the specific language governing rights and limitations under |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
19 // the License. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
20 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
21 // The Original Code is eCos - Embedded Configurable Operating System, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
22 // released September 30, 1998. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
23 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
24 // The Initial Developer of the Original Code is Red Hat. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
25 // Portions created by Red Hat are |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
27 // All Rights Reserved. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
28 // ------------------------------------------- |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
29 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
30 //####COPYRIGHTEND#### |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
31 //========================================================================== |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
32 //#####DESCRIPTIONBEGIN#### |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
33 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
34 // Author(s): msalter |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
35 // Contributors: msalter |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
36 // Date: 2001-07-14 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
37 // Purpose: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
38 // Description: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
39 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
40 // 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
|
41 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
42 //####DESCRIPTIONEND#### |
|
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 //========================================================================== |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
45 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
46 #include <redboot.h> |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
47 #include <fs/disk.h> |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
48 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
49 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
50 #include <fs/e2fs.h> |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
51 #endif |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
52 #ifdef CYGSEM_REDBOOT_DISK_ISO9660 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
53 #include <fs/iso9660fs.h> |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
54 #endif |
|
174
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 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
|
57 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
58 RedBoot_cmd("disks", |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
59 "Display disks/partitions.", |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
60 "", |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
61 do_disks |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
62 ); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
63 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
64 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
|
65 static int disk_count = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
66 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
67 static int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
68 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
|
69 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
70 cyg_uint32 s, n, tmp; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
71 struct mbr_partition *p; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
72 int i, found = 0; |
|
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 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
|
75 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
76 // Look for primary partitions |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
77 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
|
78 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
79 // 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
|
80 memcpy(&tmp, p->start_sect, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
81 s = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
82 memcpy(&tmp, p->nr_sects, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
83 n = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
84 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
85 if (s && n) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
86 ++found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
87 d->partitions[i].disk = d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
88 d->partitions[i].start_sector = s; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
89 d->partitions[i].nr_sectors = n; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
90 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
|
91 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
|
92 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
93 p++; |
|
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 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
96 #if CYGNUM_REDBOOT_MAX_PARTITIONS > 4 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
97 { |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
98 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
|
99 cyg_uint16 magic; |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
100 int nextp; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
101 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
102 // 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
|
103 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
|
104 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
|
105 // 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
|
106 // of extended partition. |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
107 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
|
108 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
|
109 |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
110 // 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
|
111 // 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
|
112 // and another extended partition |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
113 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
|
114 break; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
115 |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
116 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
|
117 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
|
118 break; |
|
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 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
|
121 |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
122 // 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
|
123 memcpy(&tmp, p->start_sect, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
124 s = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
125 memcpy(&tmp, p->nr_sects, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
126 n = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
127 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
128 if (s && n) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
129 ++found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
130 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
|
131 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
|
132 d->partitions[nextp].nr_sectors = n; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
133 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
|
134 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
|
135 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
136 ++p; |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
137 |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
138 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
|
139 s = SWAB_LE32(tmp); |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
140 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
|
141 n = SWAB_LE32(tmp); |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
142 |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
143 // more extended partitions? |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
144 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
|
145 break; |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
146 |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
147 xoffset += s; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
148 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
149 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
150 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
151 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
152 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
153 return found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
154 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
155 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
156 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
157 // Find partitions on given disk. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
158 // Return number of partitions found |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
159 static int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
160 find_partitions(disk_t *d) |
|
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 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
|
163 cyg_uint16 magic; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
164 partition_t *p; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
165 int i, found = 0; |
|
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 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
168 if (d->kind == DISK_IDE_CDROM) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
169 // no partition table, so fake it |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
170 p = d->partitions; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
171 p->disk = d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
172 p->start_sector = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
173 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
|
174 #ifdef CYGSEM_REDBOOT_DISK_ISO9660 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
175 p->funs = &redboot_iso9660fs_funs; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
176 #endif |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
177 return 1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
178 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
179 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
180 // read Master Boot Record |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
181 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
|
182 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
183 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
184 // Check for DOS MBR |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
185 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
|
186 if (SWAB_LE16(magic) == MBR_MAGIC) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
187 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
|
188 } else { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
189 // 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
|
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 // 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
|
193 // funcs for supported filesystems. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
194 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
|
195 switch (p->systype) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
196 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
197 case SYSTYPE_LINUX: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
198 p->funs = &redboot_e2fs_funs; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
199 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
200 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
201 #ifdef CYGSEM_REDBOOT_DISK_FAT16 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
202 case SYSTYPE_FAT16: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
203 p->funs = &redboot_fat16_funs; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
204 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
205 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
206 #ifdef CYGSEM_REDBOOT_DISK_FAT32 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
207 case SYSTYPE_FAT32: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
208 p->funs = &redboot_fat32_funs; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
209 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
210 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
211 default: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
212 break; // ignore unsupported filesystems |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
213 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
214 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
215 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
216 return found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
217 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
218 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
219 // 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
|
220 // 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
|
221 externC int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
222 disk_register(disk_t *d) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
223 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
224 int i; |
|
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 // 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
|
227 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
|
228 return 0; |
|
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 // Set the index |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
231 d->index = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
232 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
|
233 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
|
234 d->index++; |
|
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 // put it in the table |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
237 disk_table[disk_count] = *d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
238 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
239 // fill in partition info |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
240 find_partitions(&disk_table[disk_count++]); |
|
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 return 1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
243 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
244 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
245 // 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
|
246 // a partition and path. |
|
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 static int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
249 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
|
250 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
251 int i, kind, index, pindex; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
252 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
253 kind = index = pindex = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
254 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
255 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
|
256 // IDE hard drives |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
257 kind = DISK_IDE_HD; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
258 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
|
259 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
260 index = name[2] - 'a'; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
261 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
|
262 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
263 pindex = name[3] - '1'; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
264 if (name[4] != ':') |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
265 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
266 *path = &name[5]; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
267 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
268 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
269 if (kind) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
270 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
|
271 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
|
272 *part = &disk_table[i].partitions[pindex]; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
273 return 1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
274 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
275 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
276 } |
|
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 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
279 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
280 static const struct { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
281 int kind; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
282 const char *str; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
283 } systype_names[] = { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
284 { SYSTYPE_FAT12, "FAT12" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
285 { SYSTYPE_FAT16_32M, "FAT16 <32M" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
286 { SYSTYPE_FAT16, "FAT16" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
287 { SYSTYPE_EXTENDED, "Extended" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
288 { SYSTYPE_LINUX_SWAP, "Linux Swap" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
289 { SYSTYPE_LINUX, "Linux" } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
290 }; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
291 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
292 static const char * |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
293 systype_name(int systype) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
294 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
295 int i; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
296 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
297 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
|
298 if (systype_names[i].kind == systype) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
299 return systype_names[i].str; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
300 return "Unknown"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
301 } |
|
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 // List disk partitions |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
304 static void |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
305 do_disks(int argc, char *argv[]) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
306 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
307 int i, j; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
308 disk_t *d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
309 partition_t *p; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
310 char name[16]; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
311 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
312 for (i = 0, d = disk_table; i < disk_count; i++, d++) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
313 switch (d->kind) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
314 case DISK_IDE_HD: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
315 for (j = 0, p = d->partitions; j < CYGNUM_REDBOOT_MAX_PARTITIONS; j++, p++) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
316 if (p->systype) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
317 sprintf(name, "hd%c%d", 'a' + d->index, j+1); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
318 printf("%-8s %s\n", name, systype_name(p->systype)); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
319 } |
|
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 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
322 case DISK_IDE_CDROM: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
323 sprintf(name, "cd%d", d->index); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
324 printf("%-8s ISO9660\n", name); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
325 break; |
|
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 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
328 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
329 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
330 static void *fileptr; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
331 static partition_t *file_part; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
332 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
333 externC int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
334 disk_stream_open(char *filename, int *err) |
|
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 const char *filepath; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
337 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
338 // 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
|
339 // Convert to a partition and path. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
340 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
|
341 *err = diskerr_badname; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
342 return -1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
343 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
344 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
345 if (file_part->systype == 0 || file_part->funs == (fs_funs_t *)0) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
346 *err = diskerr_partition; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
347 return -1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
348 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
349 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
350 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
|
351 if (fileptr == NULL) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
352 *err = diskerr_open; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
353 return -1; |
|
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 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
356 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
357 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
358 externC int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
359 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
|
360 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
361 int nread; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
362 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
363 if ((nread = (file_part->funs->read)(fileptr, buf, size)) != size) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
364 *err = diskerr_read; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
365 return -1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
366 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
367 return nread; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
368 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
369 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
370 externC void |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
371 disk_stream_close(int *err) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
372 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
373 fileptr = NULL; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
374 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
375 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
376 externC char * |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
377 disk_error(int err) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
378 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
379 switch (err) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
380 case diskerr_badname: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
381 return "Bad filename"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
382 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
383 case diskerr_partition: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
384 return "Unsupported filesystem"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
385 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
386 case diskerr_open: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
387 return "Can't open file"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
388 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
389 case diskerr_read: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
390 return "Can't read file"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
391 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
392 default: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
393 return "Unknown error"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
394 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
395 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
396 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
397 |
