annotate packages/redboot/current/src/fs/disk.c @ 200:8147f1c99f15

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