Mercurial > ecos
annotate packages/redboot/current/src/fs/disk.c @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | 8147f1c99f15 |
| children | d2c90368aeef |
| 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. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
12 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
13 // 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
|
14 // 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
|
15 // 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
|
16 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
17 // 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
|
18 // 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
|
19 // 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
|
20 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
21 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
22 // 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
|
23 // 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
|
24 // 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
|
25 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
26 // 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
|
27 // 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
|
28 // 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
|
29 // 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
|
30 // 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
|
31 // 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
|
32 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
33 // 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
|
34 // 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
|
35 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
37 // at http://sources.redhat.com/ecos/ecos-license |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
38 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
39 //####ECOSGPLCOPYRIGHTEND#### |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
40 //========================================================================== |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
41 //#####DESCRIPTIONBEGIN#### |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
42 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
43 // Author(s): msalter |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
44 // Contributors: msalter |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
45 // Date: 2001-07-14 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
46 // Purpose: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
47 // Description: |
|
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 // 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
|
50 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
51 //####DESCRIPTIONEND#### |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
52 // |
|
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 #include <redboot.h> |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
56 #include <fs/disk.h> |
|
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 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
59 #include <fs/e2fs.h> |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
60 #endif |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
61 #ifdef CYGSEM_REDBOOT_DISK_ISO9660 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
62 #include <fs/iso9660fs.h> |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
63 #endif |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
64 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
65 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
|
66 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
67 RedBoot_cmd("disks", |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
68 "Display disks/partitions.", |
|
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 do_disks |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
71 ); |
|
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 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
|
74 static int disk_count = 0; |
|
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 static int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
77 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
|
78 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
79 cyg_uint32 s, n, tmp; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
80 struct mbr_partition *p; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
81 int i, found = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
82 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
83 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
|
84 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
85 // Look for primary partitions |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
86 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
|
87 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
88 // 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
|
89 memcpy(&tmp, p->start_sect, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
90 s = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
91 memcpy(&tmp, p->nr_sects, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
92 n = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
93 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
94 if (s && n) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
95 ++found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
96 d->partitions[i].disk = d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
97 d->partitions[i].start_sector = s; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
98 d->partitions[i].nr_sectors = n; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
99 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
|
100 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
|
101 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
102 p++; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
103 } |
|
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 #if CYGNUM_REDBOOT_MAX_PARTITIONS > 4 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
106 { |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
107 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
|
108 cyg_uint16 magic; |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
109 int nextp; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
110 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
111 // 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
|
112 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
|
113 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
|
114 // 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
|
115 // of extended partition. |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
116 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
|
117 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
|
118 |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
119 // 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
|
120 // 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
|
121 // and another extended partition |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
122 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
|
123 break; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
124 |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
125 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
|
126 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
|
127 break; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
128 |
|
176
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
129 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
|
130 |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
131 // 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
|
132 memcpy(&tmp, p->start_sect, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
133 s = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
134 memcpy(&tmp, p->nr_sects, 4); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
135 n = SWAB_LE32(tmp); |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
136 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
137 if (s && n) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
138 ++found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
139 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
|
140 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
|
141 d->partitions[nextp].nr_sectors = n; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
142 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
|
143 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
|
144 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
145 ++p; |
|
176
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 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
|
148 s = SWAB_LE32(tmp); |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
149 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
|
150 n = SWAB_LE32(tmp); |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
151 |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
152 // more extended partitions? |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
153 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
|
154 break; |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
155 |
|
3902ef905c9c
Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents:
174
diff
changeset
|
156 xoffset += s; |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
157 } |
|
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 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
162 return found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
163 } |
|
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 // Find partitions on given disk. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
167 // Return number of partitions found |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
168 static int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
169 find_partitions(disk_t *d) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
170 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
171 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
|
172 cyg_uint16 magic; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
173 partition_t *p; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
174 int i, found = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
175 |
|
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 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
|
178 #ifdef CYGSEM_REDBOOT_DISK_ISO9660 |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
179 // no partition table, so fake it |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
180 p = d->partitions; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
181 p->disk = d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
182 p->start_sector = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
183 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
|
184 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
|
185 return 1; |
|
d60da272beeb
Merge from eCos master repository on 2001-10-05-06:43:03-BST
jlarmour
parents:
182
diff
changeset
|
186 #else |
|
d60da272beeb
Merge from eCos master repository on 2001-10-05-06:43:03-BST
jlarmour
parents:
182
diff
changeset
|
187 return 0; |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
176
diff
changeset
|
188 #endif |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
189 } |
|
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 // read Master Boot Record |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
192 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
|
193 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
194 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
195 // Check for DOS MBR |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
196 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
|
197 if (SWAB_LE16(magic) == MBR_MAGIC) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
198 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
|
199 } else { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
200 // 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
|
201 } |
|
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 // 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
|
204 // funcs for supported filesystems. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
205 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
|
206 switch (p->systype) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
207 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
208 case SYSTYPE_LINUX: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
209 p->funs = &redboot_e2fs_funs; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
210 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
211 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
212 #ifdef CYGSEM_REDBOOT_DISK_FAT16 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
213 case SYSTYPE_FAT16: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
214 p->funs = &redboot_fat16_funs; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
215 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
216 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
217 #ifdef CYGSEM_REDBOOT_DISK_FAT32 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
218 case SYSTYPE_FAT32: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
219 p->funs = &redboot_fat32_funs; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
220 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
221 #endif |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
222 default: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
223 break; // ignore unsupported filesystems |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
224 } |
|
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 return found; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
228 } |
|
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 // 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
|
231 // 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
|
232 externC int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
233 disk_register(disk_t *d) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
234 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
235 int i; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
236 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
237 // 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
|
238 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
|
239 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
240 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
241 // Set the index |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
242 d->index = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
243 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
|
244 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
|
245 d->index++; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
246 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
247 // put it in the table |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
248 disk_table[disk_count] = *d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
249 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
250 // fill in partition info |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
251 find_partitions(&disk_table[disk_count++]); |
|
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 return 1; |
|
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 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
256 // 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
|
257 // a partition and path. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
258 // |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
259 static int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
260 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
|
261 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
262 int i, kind, index, pindex; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
263 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
264 kind = index = pindex = 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
265 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
266 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
|
267 // IDE hard drives |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
268 kind = DISK_IDE_HD; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
269 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
|
270 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
271 index = name[2] - 'a'; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
272 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
|
273 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
274 pindex = name[3] - '1'; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
275 if (name[4] != ':') |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
276 return 0; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
277 *path = &name[5]; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
278 } |
|
200
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
279 #ifdef CYGSEM_REDBOOT_DISK_ISO9660 |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
280 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
|
281 // CD drives |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
282 kind = DISK_IDE_CDROM; |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
283 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
|
284 return 0; |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
285 index = name[2] - '0'; |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
286 if (name[3] != ':') |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
287 return 0; |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
288 *path = &name[4]; |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
289 } |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
290 #endif |
|
174
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 if (kind) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
293 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
|
294 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
|
295 *part = &disk_table[i].partitions[pindex]; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
296 return 1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
297 } |
|
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 return 0; |
|
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 static const struct { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
304 int kind; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
305 const char *str; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
306 } systype_names[] = { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
307 { SYSTYPE_FAT12, "FAT12" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
308 { SYSTYPE_FAT16_32M, "FAT16 <32M" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
309 { SYSTYPE_FAT16, "FAT16" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
310 { SYSTYPE_EXTENDED, "Extended" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
311 { SYSTYPE_LINUX_SWAP, "Linux Swap" }, |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
312 { SYSTYPE_LINUX, "Linux" } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
313 }; |
|
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 static const char * |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
316 systype_name(int systype) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
317 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
318 int i; |
|
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 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
|
321 if (systype_names[i].kind == systype) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
322 return systype_names[i].str; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
323 return "Unknown"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
324 } |
|
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 // List disk partitions |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
327 static void |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
328 do_disks(int argc, char *argv[]) |
|
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 int i, j; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
331 disk_t *d; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
332 partition_t *p; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
333 char name[16]; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
334 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
335 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
|
336 switch (d->kind) { |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
337 case DISK_IDE_HD: |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
338 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
|
339 j < CYGNUM_REDBOOT_MAX_PARTITIONS; |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
340 j++, p++) { |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
341 if (p->systype) { |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
342 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
|
343 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
|
344 } |
|
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 break; |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
347 case DISK_IDE_CDROM: |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
348 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
|
349 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
|
350 break; |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
177
diff
changeset
|
351 } |
|
174
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
352 } |
|
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 static void *fileptr; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
356 static partition_t *file_part; |
|
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_open(char *filename, 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 const char *filepath; |
|
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 // 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
|
364 // Convert to a partition and path. |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
365 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
|
366 *err = diskerr_badname; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
367 return -1; |
|
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 |
|
200
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
370 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
|
371 *err = diskerr_partition; |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
372 return -1; |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
373 } |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
374 |
|
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
186
diff
changeset
|
375 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
|
376 *err = diskerr_partition; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
377 return -1; |
|
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 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
380 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
|
381 if (fileptr == NULL) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
382 *err = diskerr_open; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
383 return -1; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
384 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
385 return 0; |
|
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 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
388 externC int |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
389 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
|
390 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
391 int nread; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
392 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
393 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
|
394 *err = diskerr_read; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
395 return -1; |
|
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 return nread; |
|
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 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
400 externC void |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
401 disk_stream_close(int *err) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
402 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
403 fileptr = NULL; |
|
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 |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
406 externC char * |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
407 disk_error(int err) |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
408 { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
409 switch (err) { |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
410 case diskerr_badname: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
411 return "Bad filename"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
412 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
413 case diskerr_partition: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
414 return "Unsupported filesystem"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
415 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
416 case diskerr_open: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
417 return "Can't open file"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
418 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
419 case diskerr_read: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
420 return "Can't read file"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
421 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
422 default: |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
423 return "Unknown error"; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
424 break; |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
425 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
426 } |
|
38892b97b685
Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff
changeset
|
427 |
