386BSD 0.1 development
[unix-history] / usr / src / sys.386bsd / sys / disklabel.h
CommitLineData
42c6c359
WJ
1/*
2 * Copyright (c) 1987, 1988 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)disklabel.h 7.19 (Berkeley) 5/7/91
34 */
35
36/*
37 * Disk description table, see disktab(5)
38 */
39#define _PATH_DISKTAB "/etc/disktab"
40#define DISKTAB "/etc/disktab" /* deprecated */
41
42/*
43 * Each disk has a label which includes information about the hardware
44 * disk geometry, filesystem partitions, and drive specific information.
45 * The label is in block 0 or 1, possibly offset from the beginning
46 * to leave room for a bootstrap, etc.
47 */
48
49/* XXX these should be defined per controller (or drive) elsewhere, not here! */
50#ifdef i386
51#define LABELSECTOR 1 /* sector containing label */
52#define LABELOFFSET 0 /* offset of label in sector */
53#endif
54
55#ifndef LABELSECTOR
56#define LABELSECTOR 0 /* sector containing label */
57#endif
58
59#ifndef LABELOFFSET
60#define LABELOFFSET 64 /* offset of label in sector */
61#endif
62
63#define DISKMAGIC ((u_long) 0x82564557) /* The disk magic number */
64#ifndef MAXPARTITIONS
65#define MAXPARTITIONS 8
66#endif
67
68
69#ifndef LOCORE
70struct disklabel {
71 u_long d_magic; /* the magic number */
72 short d_type; /* drive type */
73 short d_subtype; /* controller/d_type specific */
74 char d_typename[16]; /* type name, e.g. "eagle" */
75 /*
76 * d_packname contains the pack identifier and is returned when
77 * the disklabel is read off the disk or in-core copy.
78 * d_boot0 and d_boot1 are the (optional) names of the
79 * primary (block 0) and secondary (block 1-15) bootstraps
80 * as found in /usr/mdec. These are returned when using
81 * getdiskbyname(3) to retrieve the values from /etc/disktab.
82 */
83#if defined(KERNEL) || defined(STANDALONE)
84 char d_packname[16]; /* pack identifier */
85#else
86 union {
87 char un_d_packname[16]; /* pack identifier */
88 struct {
89 char *un_d_boot0; /* primary bootstrap name */
90 char *un_d_boot1; /* secondary bootstrap name */
91 } un_b;
92 } d_un;
93#define d_packname d_un.un_d_packname
94#define d_boot0 d_un.un_b.un_d_boot0
95#define d_boot1 d_un.un_b.un_d_boot1
96#endif /* ! KERNEL or STANDALONE */
97 /* disk geometry: */
98 u_long d_secsize; /* # of bytes per sector */
99 u_long d_nsectors; /* # of data sectors per track */
100 u_long d_ntracks; /* # of tracks per cylinder */
101 u_long d_ncylinders; /* # of data cylinders per unit */
102 u_long d_secpercyl; /* # of data sectors per cylinder */
103 u_long d_secperunit; /* # of data sectors per unit */
104 /*
105 * Spares (bad sector replacements) below
106 * are not counted in d_nsectors or d_secpercyl.
107 * Spare sectors are assumed to be physical sectors
108 * which occupy space at the end of each track and/or cylinder.
109 */
110 u_short d_sparespertrack; /* # of spare sectors per track */
111 u_short d_sparespercyl; /* # of spare sectors per cylinder */
112 /*
113 * Alternate cylinders include maintenance, replacement,
114 * configuration description areas, etc.
115 */
116 u_long d_acylinders; /* # of alt. cylinders per unit */
117
118 /* hardware characteristics: */
119 /*
120 * d_interleave, d_trackskew and d_cylskew describe perturbations
121 * in the media format used to compensate for a slow controller.
122 * Interleave is physical sector interleave, set up by the formatter
123 * or controller when formatting. When interleaving is in use,
124 * logically adjacent sectors are not physically contiguous,
125 * but instead are separated by some number of sectors.
126 * It is specified as the ratio of physical sectors traversed
127 * per logical sector. Thus an interleave of 1:1 implies contiguous
128 * layout, while 2:1 implies that logical sector 0 is separated
129 * by one sector from logical sector 1.
130 * d_trackskew is the offset of sector 0 on track N
131 * relative to sector 0 on track N-1 on the same cylinder.
132 * Finally, d_cylskew is the offset of sector 0 on cylinder N
133 * relative to sector 0 on cylinder N-1.
134 */
135 u_short d_rpm; /* rotational speed */
136 u_short d_interleave; /* hardware sector interleave */
137 u_short d_trackskew; /* sector 0 skew, per track */
138 u_short d_cylskew; /* sector 0 skew, per cylinder */
139 u_long d_headswitch; /* head switch time, usec */
140 u_long d_trkseek; /* track-to-track seek, usec */
141 u_long d_flags; /* generic flags */
142#define NDDATA 5
143 u_long d_drivedata[NDDATA]; /* drive-type specific information */
144#define NSPARE 5
145 u_long d_spare[NSPARE]; /* reserved for future use */
146 u_long d_magic2; /* the magic number (again) */
147 u_short d_checksum; /* xor of data incl. partitions */
148
149 /* filesystem and partition information: */
150 u_short d_npartitions; /* number of partitions in following */
151 u_long d_bbsize; /* size of boot area at sn0, bytes */
152 u_long d_sbsize; /* max size of fs superblock, bytes */
153 struct partition { /* the partition table */
154 u_long p_size; /* number of sectors in partition */
155 u_long p_offset; /* starting sector */
156 u_long p_fsize; /* filesystem basic fragment size */
157 u_char p_fstype; /* filesystem type, see below */
158 u_char p_frag; /* filesystem fragments per block */
159 u_short p_cpg; /* filesystem cylinders per group */
160 } d_partitions[MAXPARTITIONS]; /* actually may be more */
161};
162#else LOCORE
163 /*
164 * offsets for asm boot files.
165 */
166 .set d_secsize,40
167 .set d_nsectors,44
168 .set d_ntracks,48
169 .set d_ncylinders,52
170 .set d_secpercyl,56
171 .set d_secperunit,60
172 .set d_end_,276 /* size of disk label */
173#endif LOCORE
174
175/* d_type values: */
176#define DTYPE_SMD 1 /* SMD, XSMD; VAX hp/up */
177#define DTYPE_MSCP 2 /* MSCP */
178#define DTYPE_DEC 3 /* other DEC (rk, rl) */
179#define DTYPE_SCSI 4 /* SCSI */
180#define DTYPE_ESDI 5 /* ESDI interface */
181#define DTYPE_ST506 6 /* ST506 etc. */
182#define DTYPE_FLOPPY 10 /* floppy */
183
184/* d_subtype values: */
185#define DSTYPE_INDOSPART 0x8 /* is inside dos partition */
186#define DSTYPE_DOSPART(s) ((s) & 3) /* dos partition number */
187#define DSTYPE_GEOMETRY 0x10 /* drive params in label */
188
189#ifdef DKTYPENAMES
190static char *dktypenames[] = {
191 "unknown",
192 "SMD",
193 "MSCP",
194 "old DEC",
195 "SCSI",
196 "ESDI",
197 "ST506",
198 "type 7",
199 "type 8",
200 "type 9",
201 "floppy",
202 0
203};
204#define DKMAXTYPES (sizeof(dktypenames) / sizeof(dktypenames[0]) - 1)
205#endif
206
207/*
208 * Filesystem type and version.
209 * Used to interpret other filesystem-specific
210 * per-partition information.
211 */
212#define FS_UNUSED 0 /* unused */
213#define FS_SWAP 1 /* swap */
214#define FS_V6 2 /* Sixth Edition */
215#define FS_V7 3 /* Seventh Edition */
216#define FS_SYSV 4 /* System V */
217#define FS_V71K 5 /* V7 with 1K blocks (4.1, 2.9) */
218#define FS_V8 6 /* Eighth Edition, 4K blocks */
219#define FS_BSDFFS 7 /* 4.2BSD fast file system */
220#define FS_MSDOS 8 /* MSDOS file system */
221
222#ifdef DKTYPENAMES
223static char *fstypenames[] = {
224 "unused",
225 "swap",
226 "Version 6",
227 "Version 7",
228 "System V",
229 "4.1BSD",
230 "Eighth Edition",
231 "4.2BSD",
232 "MSDOS",
233 0
234};
235#define FSMAXTYPES (sizeof(fstypenames) / sizeof(fstypenames[0]) - 1)
236#endif
237
238/*
239 * flags shared by various drives:
240 */
241#define D_REMOVABLE 0x01 /* removable media */
242#define D_ECC 0x02 /* supports ECC */
243#define D_BADSECT 0x04 /* supports bad sector forw. */
244#define D_RAMDISK 0x08 /* disk emulator */
245#define D_CHAIN 0x10 /* can do back-back transfers */
246#define D_DOSPART 0x20 /* within MSDOS partition */
247
248/*
249 * Drive data for SMD.
250 */
251#define d_smdflags d_drivedata[0]
252#define D_SSE 0x1 /* supports skip sectoring */
253#define d_mindist d_drivedata[1]
254#define d_maxdist d_drivedata[2]
255#define d_sdist d_drivedata[3]
256
257/*
258 * Drive data for ST506.
259 */
260#define d_precompcyl d_drivedata[0]
261#define d_gap3 d_drivedata[1] /* used only when formatting */
262
263/*
264 * Drive data for SCSI.
265 */
266#define d_blind d_drivedata[0]
267
268#ifndef LOCORE
269/*
270 * Structure used to perform a format
271 * or other raw operation, returning data
272 * and/or register values.
273 * Register identification and format
274 * are device- and driver-dependent.
275 */
276struct format_op {
277 char *df_buf;
278 int df_count; /* value-result */
279 daddr_t df_startblk;
280 int df_reg[8]; /* result */
281};
282
283/*
284 * Structure used internally to retrieve
285 * information about a partition on a disk.
286 */
287struct partinfo {
288 struct disklabel *disklab;
289 struct partition *part;
290};
291
292/* DOS partition table -- located in boot block */
293
294#define DOSBBSECTOR 0 /* DOS boot block relative sector number */
295#define DOSPARTOFF 446
296#define NDOSPART 4
297
298struct dos_partition {
299 unsigned char dp_flag; /* bootstrap flags */
300 unsigned char dp_shd; /* starting head */
301 unsigned char dp_ssect; /* starting sector */
302 unsigned char dp_scyl; /* starting cylinder */
303 unsigned char dp_typ; /* partition type */
304#define DOSPTYP_386BSD 0xa5 /* 386BSD partition type */
305 unsigned char dp_ehd; /* end head */
306 unsigned char dp_esect; /* end sector */
307 unsigned char dp_ecyl; /* end cylinder */
308 unsigned long dp_start; /* absolute starting sector number */
309 unsigned long dp_size; /* partition size in sectors */
310} dos_partitions[NDOSPART];
311
312#define DPSECT(s) ((s) & 0x3f) /* isolate relevant bits of sector */
313#define DPCYL(c, s) ((c) + (((s) & 0xc0)<<2)) /* and those that are cylinder */
314
315/*
316 * Disk-specific ioctls.
317 */
318 /* get and set disklabel; DIOCGPART used internally */
319#define DIOCGDINFO _IOR('d', 101, struct disklabel)/* get */
320#define DIOCSDINFO _IOW('d', 102, struct disklabel)/* set */
321#define DIOCWDINFO _IOW('d', 103, struct disklabel)/* set, update disk */
322#define DIOCGPART _IOW('d', 104, struct partinfo) /* get partition */
323
324/* do format operation, read or write */
325#define DIOCRFORMAT _IOWR('d', 105, struct format_op)
326#define DIOCWFORMAT _IOWR('d', 106, struct format_op)
327
328#define DIOCSSTEP _IOW('d', 107, int) /* set step rate */
329#define DIOCSRETRIES _IOW('d', 108, int) /* set # of retries */
330#define DIOCWLABEL _IOW('d', 109, int) /* write en/disable label */
331
332#define DIOCSBAD _IOW('d', 110, struct dkbad) /* set kernel dkbad */
333
334#if defined(KERNEL)
335
336
337void diskerr(struct buf *, char *, char *, int, int, struct disklabel *);
338
339int dkcksum(struct disklabel *);
340
341int setdisklabel(struct disklabel *, struct disklabel *, u_long,
342 struct dos_partition *);
343
344char *readdisklabel(int, int (*)(), struct disklabel *,
345 struct dos_partition *, struct dkbad *, struct buf **);
346
347void disksort(struct buf *, struct buf *);
348
349int writedisklabel(int, int (*)(), struct disklabel *,
350 struct dos_partition *);
351
352int bounds_check_with_label(struct buf *, struct disklabel *, int);
353#endif
354#endif LOCORE
355
356#if !defined(KERNEL) && !defined(LOCORE)
357
358#include <sys/cdefs.h>
359
360__BEGIN_DECLS
361struct disklabel *getdiskbyname __P((const char *));
362__END_DECLS
363
364#endif