annotate packages/redboot/current/src/fs/disk.c @ 176:3902ef905c9c

Merge from eCos master repository on 2001-08-03-06:43:13-BST
author jlarmour
date Fri, 03 Aug 2001 12:27:32 +0000
parents 38892b97b685
children 4c750ce71ae3
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
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 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
54
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
55 RedBoot_cmd("disks",
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
56 "Display disks/partitions.",
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 do_disks
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
59 );
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 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
62 static int disk_count = 0;
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 int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
65 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
66 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
67 cyg_uint32 s, n, tmp;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
68 struct mbr_partition *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
69 int i, found = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
70
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
71 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
72
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
73 // Look for primary partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
74 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
75
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
76 // 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
77 memcpy(&tmp, p->start_sect, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
78 s = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
79 memcpy(&tmp, p->nr_sects, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
80 n = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
81
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
82 if (s && n) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
83 ++found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
84 d->partitions[i].disk = d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
85 d->partitions[i].start_sector = s;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
86 d->partitions[i].nr_sectors = n;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
87 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
88 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
89 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
90 p++;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
91 }
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 #if CYGNUM_REDBOOT_MAX_PARTITIONS > 4
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
94 {
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
95 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
96 cyg_uint16 magic;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
97 int nextp;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
98
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
99 // 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
100 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
101 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
102 // 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
103 // of extended partition.
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
104 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
105 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
106
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
107 // 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
108 // 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
109 // and another extended partition
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
110 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
111 break;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
112
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
113 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
114 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
115 break;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
116
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
117 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
118
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
119 // 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
120 memcpy(&tmp, p->start_sect, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
121 s = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
122 memcpy(&tmp, p->nr_sects, 4);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
123 n = SWAB_LE32(tmp);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
124
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
125 if (s && n) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
126 ++found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
127 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
128 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
129 d->partitions[nextp].nr_sectors = n;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
130 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
131 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
132 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
133 ++p;
176
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
134
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
135 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
136 s = SWAB_LE32(tmp);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
137 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
138 n = SWAB_LE32(tmp);
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
139
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
140 // more extended partitions?
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
141 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
142 break;
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
143
3902ef905c9c Merge from eCos master repository on 2001-08-03-06:43:13-BST
jlarmour
parents: 174
diff changeset
144 xoffset += s;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
145 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
146 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
147 }
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 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
150 return found;
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
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
153
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
154 // Find partitions on given disk.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
155 // Return number of partitions found
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
156 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
157 find_partitions(disk_t *d)
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 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
160 cyg_uint16 magic;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
161 partition_t *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
162 int i, found = 0;
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 if (d->kind == DISK_IDE_CDROM) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
166 // no partition table, so fake it
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
167 p = d->partitions;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
168 p->disk = d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
169 p->start_sector = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
170 p->nr_sectors = d->nr_sectors;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
171 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
172 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
173
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
174 // read Master Boot Record
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
175 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
176 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
177
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
178 // Check for DOS MBR
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
179 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
180 if (SWAB_LE16(magic) == MBR_MAGIC) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
181 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
182 } else {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
183 // 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
184 }
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 #ifdef CYGSEM_REDBOOT_DISK_ISO9660
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
187 if (d->kind == DISK_IDE_CDROM) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
188 p->funs = &redboot_iso9660_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
189 return found;
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 #endif
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 // 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
194 // funcs for supported filesystems.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
195 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
196 switch (p->systype) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
197 #ifdef CYGSEM_REDBOOT_DISK_EXT2FS
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
198 case SYSTYPE_LINUX:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
199 p->funs = &redboot_e2fs_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
200 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
201 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
202 #ifdef CYGSEM_REDBOOT_DISK_FAT16
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
203 case SYSTYPE_FAT16:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
204 p->funs = &redboot_fat16_funs;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
205 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
206 #endif
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
207 #ifdef CYGSEM_REDBOOT_DISK_FAT32
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
208 case SYSTYPE_FAT32:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
209 p->funs = &redboot_fat32_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 default:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
213 break; // ignore unsupported filesystems
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
214 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
215 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
216
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
217 return found;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
218 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
219
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
220 // 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
221 // 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
222 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
223 disk_register(disk_t *d)
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 int i;
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 // 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
228 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
229 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
230
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
231 // Set the index
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
232 d->index = 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
233 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
234 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
235 d->index++;
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 // put it in the table
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
238 disk_table[disk_count] = *d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
239
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
240 // fill in partition info
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
241 find_partitions(&disk_table[disk_count++]);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
242
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
243 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
244 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
245
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
246 // 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
247 // a partition and path.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
248 //
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
249 static int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
250 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
251 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
252 int i, kind, index, pindex;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
253
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
254 kind = index = pindex = 0;
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 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
257 // IDE hard drives
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
258 kind = DISK_IDE_HD;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
259 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
260 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
261 index = name[2] - 'a';
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
262 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
263 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
264 pindex = name[3] - '1';
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
265 if (name[4] != ':')
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
266 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
267 *path = &name[5];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
268 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
269
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
270 if (kind) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
271 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
272 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
273 *part = &disk_table[i].partitions[pindex];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
274 return 1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
275 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
276 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
277 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
278 return 0;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
279 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
280
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
281 static const struct {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
282 int kind;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
283 const char *str;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
284 } systype_names[] = {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
285 { SYSTYPE_FAT12, "FAT12" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
286 { SYSTYPE_FAT16_32M, "FAT16 <32M" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
287 { SYSTYPE_FAT16, "FAT16" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
288 { SYSTYPE_EXTENDED, "Extended" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
289 { SYSTYPE_LINUX_SWAP, "Linux Swap" },
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
290 { SYSTYPE_LINUX, "Linux" }
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
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
293 static const char *
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
294 systype_name(int systype)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
295 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
296 int i;
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 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
299 if (systype_names[i].kind == systype)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
300 return systype_names[i].str;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
301 return "Unknown";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
302 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
303
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
304 // List disk partitions
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
305 static void
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
306 do_disks(int argc, char *argv[])
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
307 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
308 int i, j;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
309 disk_t *d;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
310 partition_t *p;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
311 char name[16];
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
312
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
313 for (i = 0, d = disk_table; i < disk_count; i++, d++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
314 switch (d->kind) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
315 case DISK_IDE_HD:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
316 for (j = 0, p = d->partitions; j < CYGNUM_REDBOOT_MAX_PARTITIONS; j++, p++) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
317 if (p->systype) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
318 sprintf(name, "hd%c%d", 'a' + d->index, j+1);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
319 printf("%-8s %s\n", name, systype_name(p->systype));
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
320 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
321 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
322 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
323 case DISK_IDE_CDROM:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
324 sprintf(name, "cd%d", d->index);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
325 printf("%-8s ISO9660\n", name);
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
326 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
327 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
328 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
329 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
330
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
331 static void *fileptr;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
332 static partition_t *file_part;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
333
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
334 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
335 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
336 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
337 const char *filepath;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
338
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
339 // 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
340 // Convert to a partition and path.
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
341 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
342 *err = diskerr_badname;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
343 return -1;
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 if (file_part->systype == 0 || file_part->funs == (fs_funs_t *)0) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
347 *err = diskerr_partition;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
348 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
349 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
350
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
351 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
352 if (fileptr == NULL) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
353 *err = diskerr_open;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
354 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
355 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
356 return 0;
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
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
359 externC int
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
360 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
361 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
362 int nread;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
363
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
364 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
365 *err = diskerr_read;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
366 return -1;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
367 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
368 return nread;
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 externC void
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
372 disk_stream_close(int *err)
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
373 {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
374 fileptr = NULL;
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
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
377 externC char *
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
378 disk_error(int err)
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 switch (err) {
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
381 case diskerr_badname:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
382 return "Bad filename";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
383 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
384 case diskerr_partition:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
385 return "Unsupported filesystem";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
386 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
387 case diskerr_open:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
388 return "Can't open file";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
389 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
390 case diskerr_read:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
391 return "Can't read file";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
392 break;
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
393 default:
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
394 return "Unknown error";
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
395 break;
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 }
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents:
diff changeset
398