xref: /openbsd/sys/sys/disklabel.h (revision 294cebc4)
1 /*	$OpenBSD: disklabel.h,v 1.86 2022/11/07 10:33:22 krw Exp $	*/
2 /*	$NetBSD: disklabel.h,v 1.41 1996/05/10 23:07:37 mark Exp $	*/
3 
4 /*
5  * Copyright (c) 1987, 1988, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  *	@(#)disklabel.h	8.2 (Berkeley) 7/10/94
33  */
34 
35 /*
36  * Disk description table, see disktab(5)
37  */
38 #define	_PATH_DISKTAB	"/etc/disktab"
39 #define	DISKTAB		"/etc/disktab"		/* deprecated */
40 
41 /*
42  * Each disk has a label which includes information about the hardware
43  * disk geometry, filesystem partitions, and drive specific information.
44  * The location of the label, as well as the number of partitions the
45  * label can describe and the number of the "whole disk" (raw)
46  * partition are machine dependent.
47  */
48 #include <machine/disklabel.h>
49 
50 #include <sys/uuid.h>
51 
52 /*
53  * The absolute maximum number of disk partitions allowed.
54  * This is the maximum value of MAXPARTITIONS for which 'struct disklabel'
55  * is <= DEV_BSIZE bytes long.  If MAXPARTITIONS is greater than this, beware.
56  */
57 #define	MAXMAXPARTITIONS	22
58 #if MAXPARTITIONS > MAXMAXPARTITIONS
59 #warn beware: MAXPARTITIONS bigger than MAXMAXPARTITIONS
60 #endif
61 
62 /*
63  * Translate between device numbers and major/disk unit/disk partition.
64  */
65 #define	DISKUNIT(dev)	(minor(dev) / MAXPARTITIONS)
66 #define	DISKPART(dev)	(minor(dev) % MAXPARTITIONS)
67 #define	RAW_PART	2	/* 'c' partition */
68 #define	DISKMINOR(unit, part) \
69     (((unit) * MAXPARTITIONS) + (part))
70 #define	MAKEDISKDEV(maj, unit, part) \
71     (makedev((maj), DISKMINOR((unit), (part))))
72 #define	DISKLABELDEV(dev) \
73     (MAKEDISKDEV(major(dev), DISKUNIT(dev), RAW_PART))
74 
75 #define DISKMAGIC	((u_int32_t)0x82564557)	/* The disk magic number */
76 
77 #define MAXDISKSIZE	0x7fffffffffffLL	/* 47 bits of reach */
78 
79 #ifndef _LOCORE
80 struct disklabel {
81 	u_int32_t d_magic;		/* the magic number */
82 	u_int16_t d_type;		/* drive type */
83 	u_int16_t d_subtype;		/* controller/d_type specific */
84 	char	  d_typename[16];	/* type name, e.g. "eagle" */
85 	char	  d_packname[16];	/* pack identifier */
86 
87 			/* disk geometry: */
88 	u_int32_t d_secsize;		/* # of bytes per sector */
89 	u_int32_t d_nsectors;		/* # of data sectors per track */
90 	u_int32_t d_ntracks;		/* # of tracks per cylinder */
91 	u_int32_t d_ncylinders;		/* # of data cylinders per unit */
92 	u_int32_t d_secpercyl;		/* # of data sectors per cylinder */
93 	u_int32_t d_secperunit;		/* # of data sectors (low part) */
94 
95 	u_char	d_uid[8];		/* Unique label identifier. */
96 
97 	/*
98 	 * Alternate cylinders include maintenance, replacement, configuration
99 	 * description areas, etc.
100 	 */
101 	u_int32_t d_acylinders;		/* # of alt. cylinders per unit */
102 
103 			/* hardware characteristics: */
104 	u_int16_t d_bstarth;		/* start of useable region (high part) */
105 	u_int16_t d_bendh;		/* size of useable region (high part) */
106 	u_int32_t d_bstart;		/* start of useable region */
107 	u_int32_t d_bend;		/* end of useable region */
108 	u_int32_t d_flags;		/* generic flags */
109 #define NDDATA 5
110 	u_int32_t d_spare4[NDDATA];
111 	u_int16_t d_secperunith;	/* # of data sectors (high part) */
112 	u_int16_t d_version;		/* version # (1=48 bit addressing) */
113 #define NSPARE 4
114 	u_int32_t d_spare[NSPARE];	/* reserved for future use */
115 	u_int32_t d_magic2;		/* the magic number (again) */
116 	u_int16_t d_checksum;		/* xor of data incl. partitions */
117 
118 			/* filesystem and partition information: */
119 	u_int16_t d_npartitions;	/* number of partitions in following */
120 	u_int32_t d_spare2;
121 	u_int32_t d_spare3;
122 	struct	partition {		/* the partition table */
123 		u_int32_t p_size;	/* number of sectors (low part) */
124 		u_int32_t p_offset;	/* starting sector (low part) */
125 		u_int16_t p_offseth;	/* starting sector (high part) */
126 		u_int16_t p_sizeh;	/* number of sectors (high part) */
127 		u_int8_t p_fstype;	/* filesystem type, see below */
128 		u_int8_t p_fragblock;	/* encoded filesystem frag/block */
129 		u_int16_t p_cpg;	/* UFS: FS cylinders per group */
130 	} d_partitions[MAXPARTITIONS];	/* actually may be more */
131 };
132 
133 
134 struct	__partitionv0 {		/* old (v0) partition table entry */
135 	u_int32_t p_size;	/* number of sectors in partition */
136 	u_int32_t p_offset;	/* starting sector */
137 	u_int32_t p_fsize;	/* filesystem basic fragment size */
138 	u_int8_t p_fstype;	/* filesystem type, see below */
139 	u_int8_t p_frag;	/* filesystem fragments per block */
140 	union {
141 		u_int16_t cpg;	/* UFS: FS cylinders per group */
142 		u_int16_t sgs;	/* LFS: FS segment shift */
143 	} __partitionv0_u1;
144 };
145 #endif /* _LOCORE */
146 
147 
148 #define DISKLABELV1_FFS_FRAGBLOCK(fsize, frag) 			\
149 	((fsize) * (frag) == 0 ? 0 :				\
150 	(((ffs((fsize) * (frag)) - 13) << 3) | (ffs(frag))))
151 
152 #define DISKLABELV1_FFS_BSIZE(i) ((i) == 0 ? 0 : (1 << (((i) >> 3) + 12)))
153 #define DISKLABELV1_FFS_FRAG(i) ((i) == 0 ? 0 : (1 << (((i) & 0x07) - 1)))
154 #define DISKLABELV1_FFS_FSIZE(i) (DISKLABELV1_FFS_FRAG(i) == 0 ? 0 : \
155 	(DISKLABELV1_FFS_BSIZE(i) / DISKLABELV1_FFS_FRAG(i)))
156 
157 #define DL_GETPSIZE(p)		(((u_int64_t)(p)->p_sizeh << 32) + (p)->p_size)
158 #define DL_SETPSIZE(p, n)	do { \
159 					u_int64_t __x = (n); \
160 					(p)->p_sizeh = __x >> 32; \
161 					(p)->p_size = __x; \
162 				} while (0)
163 #define DL_GETPOFFSET(p)	(((u_int64_t)(p)->p_offseth << 32) + (p)->p_offset)
164 #define DL_SETPOFFSET(p, n)	do { \
165 					u_int64_t __x = (n); \
166 					(p)->p_offseth = __x >> 32; \
167 					(p)->p_offset = __x; \
168 				} while (0)
169 
170 #define DL_GETDSIZE(d)		(((u_int64_t)(d)->d_secperunith << 32) + \
171 				    (d)->d_secperunit)
172 #define DL_SETDSIZE(d, n)	do { \
173 					u_int64_t __x = (n); \
174 					(d)->d_secperunith = __x >> 32; \
175 					(d)->d_secperunit = __x; \
176 				} while (0)
177 #define DL_GETBSTART(d)		(((u_int64_t)(d)->d_bstarth << 32) + \
178 				    (d)->d_bstart)
179 #define DL_SETBSTART(d, n)	do { \
180 					u_int64_t __x = (n); \
181 					(d)->d_bstarth = __x >> 32; \
182 					(d)->d_bstart = __x; \
183 				} while (0)
184 #define DL_GETBEND(d)		(((u_int64_t)(d)->d_bendh << 32) + \
185 				    (d)->d_bend)
186 #define DL_SETBEND(d, n)	do { \
187 					u_int64_t __x = (n); \
188 					(d)->d_bendh = __x >> 32; \
189 					(d)->d_bend = __x; \
190 				} while (0)
191 
192 #define DL_BLKSPERSEC(d)	((d)->d_secsize / DEV_BSIZE)
193 #define DL_SECTOBLK(d, n)	((n) * DL_BLKSPERSEC(d))
194 #define DL_BLKTOSEC(d, n)	((n) / DL_BLKSPERSEC(d))
195 #define DL_BLKOFFSET(d, n)	(((n) % DL_BLKSPERSEC(d)) * DEV_BSIZE)
196 
197 /* d_type values: */
198 #define	DTYPE_SMD		1		/* SMD, XSMD; VAX hp/up */
199 #define	DTYPE_MSCP		2		/* MSCP */
200 #define	DTYPE_DEC		3		/* other DEC (rk, rl) */
201 #define	DTYPE_SCSI		4		/* SCSI */
202 #define	DTYPE_ESDI		5		/* ESDI interface */
203 #define	DTYPE_ST506		6		/* ST506 etc. */
204 #define	DTYPE_HPIB		7		/* CS/80 on HP-IB */
205 #define	DTYPE_HPFL		8		/* HP Fiber-link */
206 #define	DTYPE_FLOPPY		10		/* floppy */
207 #define	DTYPE_CCD		11		/* was: concatenated disk device */
208 #define	DTYPE_VND		12		/* vnode pseudo-disk */
209 #define	DTYPE_ATAPI		13		/* ATAPI */
210 #define DTYPE_RAID		14		/* was: RAIDframe */
211 #define DTYPE_RDROOT		15		/* ram disk root */
212 
213 #ifdef DKTYPENAMES
214 static const char * const dktypenames[] = {
215 	"unknown",
216 	"SMD",
217 	"MSCP",
218 	"old DEC",
219 	"SCSI",
220 	"ESDI",
221 	"ST506",
222 	"HP-IB",
223 	"HP-FL",
224 	"type 9",
225 	"floppy",
226 	"ccd",			/* deprecated */
227 	"vnd",
228 	"ATAPI",
229 	"RAID",
230 	"rdroot",
231 	NULL
232 };
233 #define DKMAXTYPES	(sizeof(dktypenames) / sizeof(dktypenames[0]) - 1)
234 #endif
235 
236 /*
237  * Filesystem type and version.
238  * Used to interpret other filesystem-specific
239  * per-partition information.
240  */
241 #define	FS_UNUSED	0		/* unused */
242 #define	FS_SWAP		1		/* swap */
243 #define	FS_V6		2		/* Sixth Edition */
244 #define	FS_V7		3		/* Seventh Edition */
245 #define	FS_SYSV		4		/* System V */
246 #define	FS_V71K		5		/* V7 with 1K blocks (4.1, 2.9) */
247 #define	FS_V8		6		/* Eighth Edition, 4K blocks */
248 #define	FS_BSDFFS	7		/* 4.2BSD fast file system */
249 #define	FS_MSDOS	8		/* MSDOS file system */
250 #define	FS_BSDLFS	9		/* 4.4BSD log-structured file system */
251 #define	FS_OTHER	10		/* in use, but unknown/unsupported */
252 #define	FS_HPFS		11		/* OS/2 high-performance file system */
253 #define	FS_ISO9660	12		/* ISO 9660, normally CD-ROM */
254 #define	FS_BOOT		13		/* partition contains bootstrap */
255 #define	FS_ADOS		14		/* AmigaDOS fast file system */
256 #define	FS_HFS		15		/* Macintosh HFS */
257 #define	FS_ADFS		16		/* Acorn Disk Filing System */
258 #define FS_EXT2FS	17		/* ext2fs */
259 #define FS_CCD		18		/* ccd component */
260 #define FS_RAID		19		/* RAIDframe or softraid */
261 #define FS_NTFS		20		/* Windows/NT file system */
262 #define FS_UDF		21		/* UDF (DVD) filesystem */
263 
264 #ifdef DKTYPENAMES
265 static const char * const fstypenames[] = {
266 	"unused",
267 	"swap",
268 	"Version6",
269 	"Version7",
270 	"SystemV",
271 	"4.1BSD",
272 	"Eighth-Edition",
273 	"4.2BSD",
274 	"MSDOS",
275 	"4.4LFS",
276 	"unknown",
277 	"HPFS",
278 	"ISO9660",
279 	"boot",
280 	"ADOS",
281 	"HFS",
282 	"ADFS",
283 	"ext2fs",
284 	"ccd",
285 	"RAID",
286 	"NTFS",
287 	"UDF",
288 	NULL
289 };
290 
291 /* Similar to the above, but used for things like the mount command. */
292 static char *fstypesnames[] = {
293 	"",		/* 0 */
294 	"",		/* 1 */
295 	"",		/* 2 */
296 	"",		/* 3 */
297 	"",		/* 4 */
298 	"",		/* 5 */
299 	"",		/* 6 */
300 	"ffs",		/* 7 */
301 	"msdos",	/* 8 */
302 	"lfs",		/* 9 */
303 	"",		/* 10 */
304 	"",		/* 11 */
305 	"cd9660",	/* 12 */
306 	"",		/* 13 */
307 	"ados",		/* 14 */
308 	"",		/* 15 */
309 	"",		/* 16 */
310 	"ext2fs",	/* 17 */
311 	"",		/* 18 */
312 	"",		/* 19 */
313 	"ntfs",		/* 20 */
314 	"udf",		/* 21 */
315 	NULL
316 };
317 
318 #define FSMAXTYPES	(sizeof(fstypenames) / sizeof(fstypenames[0]) - 1)
319 #endif
320 
321 /*
322  * flags shared by various drives:
323  */
324 #define		D_VENDOR	0x08		/* vendor disklabel */
325 
326 #ifndef _LOCORE
327 /*
328  * Structure used internally to retrieve information about a partition
329  * on a disk.
330  */
331 struct partinfo {
332 	struct disklabel *disklab;
333 	struct partition *part;
334 };
335 
336 /* GUID partition table -- located at sector 1 of some disks. */
337 #define	GPTSECTOR		1	/* DOS boot block relative sector # */
338 #define	GPTSIGNATURE		0x5452415020494645LL
339 				/* ASCII string "EFI PART" encoded as 64-bit */
340 #define	GPTREVISION		0x10000		/* GPT header version 1.0 */
341 #define	NGPTPARTITIONS		128
342 #define	GPTPARTATTR_REQUIRED		(1ULL << 0)
343 #define	GPTPARTATTR_IGNORE		(1ULL << 1)
344 #define	GPTPARTATTR_BOOTABLE		(1ULL << 2)
345 #define	GPTPARTATTR_MS_READONLY		(1ULL << 60)
346 #define	GPTPARTATTR_MS_SHADOW		(1ULL << 61)
347 #define	GPTPARTATTR_MS_HIDDEN		(1ULL << 62)
348 #define	GPTPARTATTR_MS_NOAUTOMOUNT	(1ULL << 63)
349 
350 #define	GPTMINHDRSIZE		92
351 #define	GPTMINPARTSIZE		128
352 #define	GPTPARTNAMESIZE		36
353 
354 /* all values in the GPT need to be little endian as per UEFI specification */
355 struct gpt_header {
356 	u_int64_t gh_sig;	/* "EFI PART" */
357 	u_int32_t gh_rev;	/* GPT Version 1.0: 0x00000100 */
358 	u_int32_t gh_size;	/* Little-Endian */
359 	u_int32_t gh_csum;	/* CRC32: with this field as 0 */
360 	u_int32_t gh_rsvd;	/* always zero */
361 	u_int64_t gh_lba_self;	/* LBA of this header */
362 	u_int64_t gh_lba_alt;	/* LBA of alternate header */
363 	u_int64_t gh_lba_start;	/* first usable LBA */
364 	u_int64_t gh_lba_end;	/* last usable LBA */
365 	struct uuid gh_guid;	/* disk GUID used to identify the disk */
366 	u_int64_t gh_part_lba;	/* starting LBA of GPT partition entries */
367 	u_int32_t gh_part_num;	/* # of partition entries */
368 	u_int32_t gh_part_size;	/* size per entry, shall be 128*(2**n)
369 				   with n >= 0 */
370 	u_int32_t gh_part_csum;	/* CRC32 checksum of all partition entries:
371 				 * starts at gh_part_lba and is computed over
372 				 * a byte length of gh_part_num*gh_part_size */
373 	/* the rest of the block is reserved by UEFI and must be zero */
374 };
375 
376 struct gpt_partition {
377 	struct uuid gp_type;	/* partition type GUID */
378 	struct uuid gp_guid;	/* unique partition GUID */
379 	u_int64_t gp_lba_start;	/* starting LBA of this partition */
380 	u_int64_t gp_lba_end;	/* ending LBA of this partition, inclusive,
381 				   usually odd */
382 	u_int64_t gp_attrs;	/* attribute flags */
383 	u_int16_t gp_name[GPTPARTNAMESIZE]; /* partition name, utf-16le */
384 	/* the rest of the GPT partition entry, if any, is reserved by UEFI
385 	   and must be zero */
386 };
387 
388 #define GPT_UUID_UNUSED \
389     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
390       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
391 #define GPT_UUID_MSDOS \
392     { 0xeb, 0xd0, 0xa0, 0xa2, 0xb9, 0xe5, 0x44, 0x33, \
393       0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 }
394 #define GPT_UUID_EFI_SYSTEM \
395     { 0xc1, 0x2a, 0x73, 0x28, 0xf8, 0x1f, 0x11, 0xd2, \
396       0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b }
397 #define GPT_UUID_LEGACY_MBR \
398     { 0x02, 0x4d, 0xee, 0x41, 0x33, 0x37, 0x11, 0xd3, \
399       0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f }
400 #define GPT_UUID_OPENBSD \
401     { 0x82, 0x4c, 0xc7, 0xa0, 0x36, 0xa8, 0x11, 0xe3, \
402       0x89, 0x0a, 0x95, 0x25, 0x19, 0xad, 0x3f, 0x61 }
403 #define GPT_UUID_CHROMEROOTFS \
404     { 0x3c, 0xb8, 0xe2, 0x02, 0x3b, 0x7e, 0x47, 0xdd, \
405       0x8a, 0x3c, 0x7f, 0xf2, 0xa1, 0x3c, 0xfc, 0xec }
406 #define GPT_UUID_LINUX \
407     { 0x0f, 0xc6, 0x3d, 0xaf, 0x84, 0x83, 0x47, 0x72, \
408       0x8e, 0x79, 0x3d, 0x69, 0xd8, 0x47, 0x7d, 0xe4 }
409 #define GPT_UUID_LINUX_HOME \
410     { 0x93, 0x3a, 0xc7, 0xe1, 0x2e, 0xb4, 0x4f, 0x13, \
411       0xb8, 0x44, 0x0e, 0x14, 0xe2, 0xae, 0xf9, 0x15 }
412 #define GPT_UUID_LINUX_SRV \
413     { 0x3b, 0x8f, 0x84, 0x25, 0x20, 0xe0, 0x4f, 0x3b, \
414       0x90, 0x7f, 0x1a, 0x25, 0xa7, 0x6f, 0x98, 0xe8 }
415 #define GPT_UUID_FBSD_DATA \
416     { 0x51, 0x6e, 0x7c, 0xb4, 0x6e, 0xcf, 0x11, 0xd6, \
417       0x8f, 0xf8, 0x00, 0x02, 0x2d, 0x09, 0x71, 0x2b }
418 #define GPT_UUID_FBSD_UFS \
419     { 0x51, 0x6e, 0x7c, 0xb6, 0x6e, 0xcf, 0x11, 0xd6, \
420       0x8f, 0xf8, 0x00, 0x02, 0x2d, 0x09, 0x71, 0x2b }
421 #define GPT_UUID_NBSD_UFS \
422     { 0x49, 0xf4, 0x8d, 0x5a, 0xb1, 0x0e, 0x11, 0xdc, \
423       0xb9, 0x9b, 0x00, 0x19, 0xd1, 0x87, 0x96, 0x48 }
424 #define GPT_UUID_APPLE_HFS \
425     { 0x48, 0x46, 0x53, 0x00, 0x00, 0x00, 0x11, 0xaa, \
426       0xaa, 0x11, 0x00, 0x30, 0x65, 0x43, 0xec, 0xac }
427 #define GPT_UUID_APPLE_UFS \
428     { 0x55, 0x46, 0x53, 0x00, 0x00, 0x00, 0x11, 0xaa, \
429       0xaa, 0x11, 0x00, 0x30, 0x65, 0x43, 0xec, 0xac }
430 #define GPT_UUID_BIOS_BOOT \
431     { 0x21, 0x68, 0x61, 0x48, 0x64, 0x49, 0x6e, 0x6f, \
432       0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 }
433 
434 /* DOS partition table -- located at start of some disks. */
435 #define	DOS_LABELSECTOR 1
436 #define	DOSBBSECTOR	0		/* DOS boot block relative sector # */
437 #define	DOSPARTOFF	446
438 #define	DOSDISKOFF	444
439 #define	NDOSPART	4
440 #define	DOSACTIVE	0x80		/* active partition */
441 
442 #define	DOSMBR_SIGNATURE	(0xaa55)
443 #define	DOSMBR_SIGNATURE_OFF	(0x1fe)
444 
445 /* Maximum number of Extended Boot Records (EBRs) to traverse. */
446 #define	DOS_MAXEBR	256
447 
448 struct dos_partition {
449 	u_int8_t	dp_flag;	/* bootstrap flags */
450 	u_int8_t	dp_shd;		/* starting head */
451 	u_int8_t	dp_ssect;	/* starting sector */
452 	u_int8_t	dp_scyl;	/* starting cylinder */
453 	u_int8_t	dp_typ;		/* partition type (see below) */
454 	u_int8_t	dp_ehd;		/* end head */
455 	u_int8_t	dp_esect;	/* end sector */
456 	u_int8_t	dp_ecyl;	/* end cylinder */
457 	u_int32_t	dp_start;	/* absolute starting sector number */
458 	u_int32_t	dp_size;	/* partition size in sectors */
459 };
460 
461 /* Isolate the relevant bits to get sector and cylinder. */
462 #define	DPSECT(s)	((s) & 0x3f)
463 #define	DPCYL(c, s)	((c) + (((s) & 0xc0) << 2))
464 
465 /* Known DOS partition types. */
466 #define	DOSPTYP_UNUSED	0x00		/* Unused partition */
467 #define	DOSPTYP_FAT12	0x01		/* 12-bit FAT */
468 #define	DOSPTYP_FAT16S	0x04		/* 16-bit FAT, less than 32M */
469 #define	DOSPTYP_EXTEND	0x05		/* Extended; contains sub-partitions */
470 #define	DOSPTYP_FAT16B	0x06		/* 16-bit FAT, more than 32M */
471 #define	DOSPTYP_NTFS	0x07		/* NTFS */
472 #define	DOSPTYP_FAT32	0x0b		/* 32-bit FAT */
473 #define	DOSPTYP_FAT32L	0x0c		/* 32-bit FAT, LBA-mapped */
474 #define	DOSPTYP_FAT16L	0x0e		/* 16-bit FAT, LBA-mapped */
475 #define	DOSPTYP_EXTENDL 0x0f		/* Extended, LBA-mapped; (sub-partitions) */
476 #define	DOSPTYP_ONTRACK	0x54
477 #define	DOSPTYP_LINUX	0x83		/* That other thing */
478 #define	DOSPTYP_FREEBSD	0xa5		/* FreeBSD partition type */
479 #define	DOSPTYP_OPENBSD	0xa6		/* OpenBSD partition type */
480 #define	DOSPTYP_NETBSD	0xa9		/* NetBSD partition type */
481 #define	DOSPTYP_EFI	0xee		/* EFI Protective Partition */
482 #define	DOSPTYP_EFISYS	0xef		/* EFI System Partition */
483 
484 struct dos_mbr {
485 	u_int8_t		dmbr_boot[DOSPARTOFF];
486 	struct dos_partition	dmbr_parts[NDOSPART];
487 	u_int16_t		dmbr_sign;
488 } __packed;
489 
490 #ifdef _KERNEL
491 void	 diskerr(struct buf *, char *, char *, int, int, struct disklabel *);
492 u_int	 dkcksum(struct disklabel *);
493 int	 initdisklabel(struct disklabel *);
494 int	 checkdisklabel(dev_t, void *, struct disklabel *, u_int64_t, u_int64_t);
495 int	 setdisklabel(struct disklabel *, struct disklabel *, u_int);
496 int	 readdisklabel(dev_t, void (*)(struct buf *), struct disklabel *, int);
497 int	 writedisklabel(dev_t, void (*)(struct buf *), struct disklabel *);
498 int	 bounds_check_with_label(struct buf *, struct disklabel *);
499 int	 readdisksector(struct buf *, void (*)(struct buf *),
500 	    struct disklabel *, u_int64_t);
501 int	 readdoslabel(struct buf *, void (*)(struct buf *),
502 	    struct disklabel *, daddr_t *, int);
503 #ifdef CD9660
504 int iso_disklabelspoof(dev_t dev, void (*strat)(struct buf *),
505 	struct disklabel *lp);
506 #endif
507 #ifdef UDF
508 int udf_disklabelspoof(dev_t dev, void (*strat)(struct buf *),
509 	struct disklabel *lp);
510 #endif
511 #endif
512 #endif /* _LOCORE */
513 
514 #if !defined(_KERNEL) && !defined(_LOCORE)
515 
516 #include <sys/cdefs.h>
517 
518 __BEGIN_DECLS
519 struct disklabel *getdiskbyname(const char *);
520 __END_DECLS
521 
522 #endif
523