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
80struct 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
134struct	__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
214static 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
265static 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. */
292static 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 */
331struct 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 */
355struct 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
376struct 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
448struct 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
484struct 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
491void	 diskerr(struct buf *, char *, char *, int, int, struct disklabel *);
492u_int	 dkcksum(struct disklabel *);
493int	 initdisklabel(struct disklabel *);
494int	 checkdisklabel(dev_t, void *, struct disklabel *, u_int64_t, u_int64_t);
495int	 setdisklabel(struct disklabel *, struct disklabel *, u_int);
496int	 readdisklabel(dev_t, void (*)(struct buf *), struct disklabel *, int);
497int	 writedisklabel(dev_t, void (*)(struct buf *), struct disklabel *);
498int	 bounds_check_with_label(struct buf *, struct disklabel *);
499int	 readdisksector(struct buf *, void (*)(struct buf *),
500	    struct disklabel *, u_int64_t);
501int	 readdoslabel(struct buf *, void (*)(struct buf *),
502	    struct disklabel *, daddr_t *, int);
503#ifdef CD9660
504int iso_disklabelspoof(dev_t dev, void (*strat)(struct buf *),
505	struct disklabel *lp);
506#endif
507#ifdef UDF
508int 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
519struct disklabel *getdiskbyname(const char *);
520__END_DECLS
521
522#endif
523