1 /* $OpenBSD: disklabel.h,v 1.87 2024/10/29 03:17:10 jsg 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 /* Known DOS partition types. */ 462 #define DOSPTYP_UNUSED 0x00 /* Unused partition */ 463 #define DOSPTYP_FAT12 0x01 /* 12-bit FAT */ 464 #define DOSPTYP_FAT16S 0x04 /* 16-bit FAT, less than 32M */ 465 #define DOSPTYP_EXTEND 0x05 /* Extended; contains sub-partitions */ 466 #define DOSPTYP_FAT16B 0x06 /* 16-bit FAT, more than 32M */ 467 #define DOSPTYP_NTFS 0x07 /* NTFS */ 468 #define DOSPTYP_FAT32 0x0b /* 32-bit FAT */ 469 #define DOSPTYP_FAT32L 0x0c /* 32-bit FAT, LBA-mapped */ 470 #define DOSPTYP_FAT16L 0x0e /* 16-bit FAT, LBA-mapped */ 471 #define DOSPTYP_EXTENDL 0x0f /* Extended, LBA-mapped; (sub-partitions) */ 472 #define DOSPTYP_ONTRACK 0x54 473 #define DOSPTYP_LINUX 0x83 /* That other thing */ 474 #define DOSPTYP_FREEBSD 0xa5 /* FreeBSD partition type */ 475 #define DOSPTYP_OPENBSD 0xa6 /* OpenBSD partition type */ 476 #define DOSPTYP_NETBSD 0xa9 /* NetBSD partition type */ 477 #define DOSPTYP_EFI 0xee /* EFI Protective Partition */ 478 #define DOSPTYP_EFISYS 0xef /* EFI System Partition */ 479 480 struct dos_mbr { 481 u_int8_t dmbr_boot[DOSPARTOFF]; 482 struct dos_partition dmbr_parts[NDOSPART]; 483 u_int16_t dmbr_sign; 484 } __packed; 485 486 #ifdef _KERNEL 487 void diskerr(struct buf *, char *, char *, int, int, struct disklabel *); 488 u_int dkcksum(struct disklabel *); 489 int initdisklabel(struct disklabel *); 490 int checkdisklabel(dev_t, void *, struct disklabel *, u_int64_t, u_int64_t); 491 int setdisklabel(struct disklabel *, struct disklabel *, u_int); 492 int readdisklabel(dev_t, void (*)(struct buf *), struct disklabel *, int); 493 int writedisklabel(dev_t, void (*)(struct buf *), struct disklabel *); 494 int bounds_check_with_label(struct buf *, struct disklabel *); 495 int readdisksector(struct buf *, void (*)(struct buf *), 496 struct disklabel *, u_int64_t); 497 int readdoslabel(struct buf *, void (*)(struct buf *), 498 struct disklabel *, daddr_t *, int); 499 #ifdef CD9660 500 int iso_disklabelspoof(dev_t dev, void (*strat)(struct buf *), 501 struct disklabel *lp); 502 #endif 503 #ifdef UDF 504 int udf_disklabelspoof(dev_t dev, void (*strat)(struct buf *), 505 struct disklabel *lp); 506 #endif 507 #endif 508 #endif /* _LOCORE */ 509 510 #if !defined(_KERNEL) && !defined(_LOCORE) 511 512 #include <sys/cdefs.h> 513 514 __BEGIN_DECLS 515 struct disklabel *getdiskbyname(const char *); 516 __END_DECLS 517 518 #endif 519