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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
2 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
3 // disk.c
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
4 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
5 // RedBoot disk support
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
6 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 200
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
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