1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
|
/*
* Mach Operating System
* Copyright (c) 1991,1990,1989 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/*
* File: rz_labels.h
* Author: Alessandro Forin, Carnegie Mellon University
* Date: 10/90
*
* Definitions of various vendor's disk label formats.
*/
/* modified by Kevin T. Van Maren for the unified partition code */
#ifndef _RZ_LABELS_H_
#define _RZ_LABELS_H_
/*
* This function looks for, and converts to BSD format
* a vendor's label. It is only called if we did not
* find a standard BSD label on the disk pack.
*/
extern boolean_t rz_vendor_label();
/*
* Definition of the DEC disk label,
* which is located (you guessed it)
* at the end of the 4.3 superblock.
*/
struct dec_partition_info {
unsigned int n_sectors; /* how big the partition is */
unsigned int offset; /* sector no. of start of part. */
};
typedef struct {
int magic;
# define DEC_LABEL_MAGIC 0x032957
int in_use;
struct dec_partition_info partitions[8];
} dec_label_t;
/*
* Physical location on disk.
* This is independent of the filesystem we use,
* although of course we'll be in trouble if we
* screwup the 4.3 SBLOCK..
*/
#define DEC_LABEL_BYTE_OFFSET ((2*8192)-sizeof(dec_label_t))
/*
* Definitions for the primary boot information
* This is common, cuz the prom knows it.
*/
typedef struct {
int pad[2];
unsigned int magic;
# define DEC_BOOT0_MAGIC 0x2757a
int mode;
unsigned int phys_base;
unsigned int virt_base;
unsigned int n_sectors;
unsigned int start_sector;
} dec_boot0_t;
typedef struct {
dec_boot0_t vax_boot;
/* BSD label still fits in pad */
char pad[0x1e0-sizeof(dec_boot0_t)];
unsigned long block_count;
unsigned long starting_lbn;
unsigned long flags;
unsigned long checksum; /* add cmpl-2 all but here */
} alpha_boot0_t;
/*
* Definition of the Omron disk label,
* which is located at sector 0. It
* _is_ sector 0, actually.
*/
struct omron_partition_info {
unsigned long offset;
unsigned long n_sectors;
};
typedef struct {
char packname[128]; /* in ascii */
char pad[512-(128+8*8+11*2+4)];
unsigned short badchk; /* checksum of bad track */
unsigned long maxblk; /* # of total logical blocks */
unsigned short dtype; /* disk drive type */
unsigned short ndisk; /* # of disk drives */
unsigned short ncyl; /* # of data cylinders */
unsigned short acyl; /* # of alternate cylinders */
unsigned short nhead; /* # of heads in this partition */
unsigned short nsect; /* # of 512 byte sectors per track */
unsigned short bhead; /* identifies proper label locations */
unsigned short ppart; /* physical partition # */
struct omron_partition_info
partitions[8];
unsigned short magic; /* identifies this label format */
# define OMRON_LABEL_MAGIC 0xdabe
unsigned short cksum; /* xor checksum of sector */
} omron_label_t;
/*
* Physical location on disk.
*/
#define OMRON_LABEL_BYTE_OFFSET 0
/*
* Definition of the i386AT disk label, which lives inside sector 0.
* This is the info the BIOS knows about, which we use for bootstrapping.
* It is common across all disks known to BIOS.
*/
struct bios_partition_info {
unsigned char bootid; /* bootable or not */
# define BIOS_BOOTABLE 128
unsigned char beghead;/* beginning head, sector, cylinder */
unsigned char begsect;/* begcyl is a 10-bit number. High 2 bits */
unsigned char begcyl; /* are in begsect. */
unsigned char systid; /* filesystem type */
# define UNIXOS 99 /* GNU HURD? */
# define BSDOS 165 /* 386BSD */
# define LINUXSWAP 130
# define LINUXOS 131
# define DOS_EXTENDED 05 /* container for logical partitions */
# define HPFS 07 /* OS/2 Native */
# define OS_2_BOOT 10 /* OS/2 Boot Manager */
# define DOS_12 01 /* 12 bit FAT */
# define DOS_16_OLD 04 /* < 32MB */
# define DOS_16 06 /* >= 32MB (#4 not used anymore) */
/* these numbers can't be trusted because */
/* of newer, larger drives */
unsigned char endhead;/* ending head, sector, cylinder */
unsigned char endsect;/* endcyl is a 10-bit number. High 2 bits */
unsigned char endcyl; /* are in endsect. */
unsigned long offset;
unsigned long n_sectors;
};
typedef struct {
/* struct bios_partition_info bogus compiler alignes wrong
partitions[4];
*/
char partitions[4*sizeof(struct bios_partition_info)];
unsigned short magic;
# define BIOS_LABEL_MAGIC 0xaa55
} bios_label_t;
/*
* Physical location on disk.
*/
#define BIOS_LABEL_BYTE_OFFSET 446
/*
* Definitions for the primary boot information
* This _is_ block 0
*/
#define BIOS_BOOT0_SIZE BIOS_LABEL_BYTE_OFFSET
typedef struct {
char boot0[BIOS_BOOT0_SIZE]; /* boot code */
/* bios_label_t label; bogus compiler alignes wrong */
char label[sizeof(bios_label_t)];
} bios_boot0_t;
/* Moved from i386at/nhdreg.h */
#define PDLOCATION 29 /* VTOC sector */
/* these are the partition types that can contain sub-partitions */
/* enum types... */
#define DISKPART_NONE 0 /* smallest piece flag !?! */
#define DISKPART_DOS 1
#define DISKPART_BSD 2
#define DISKPART_VTOC 3
#define DISKPART_OMRON 4
#define DISKPART_DEC 5 /* VAX disks? */
#define DISKPART_UNKNOWN 99
/* for NEW partition code */
/* this is the basic partition structure. an array of these is
filled, with element 0 being the whole drive, element 1-n being
the n top-level partitions, followed by 0+ groups of 1+ sub-partitions. */
typedef struct diskpart {
short type; /* DISKPART_xxx (see above) */
short fsys; /* file system (if known) */
int nsubs; /* number of sub-slices */
struct diskpart *subs; /* pointer to the sub-partitions */
int start; /* relative to the start of the DRIVE */
int size; /* # sectors in this piece */
} diskpart;
int get_only_partition(void *driver_info, int (*bottom_read_fun)(),
struct diskpart *array, int array_size,
int disk_size, char *drive_name);
struct diskpart *lookup_part(struct diskpart *array, int dev_number);
#endif _RZ_LABELS_H_
|