Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: bootblock.h,v 1.61 2025/04/05 19:57:47 tsutsui Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2002-2004 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  * POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 /*-
     29  * Copyright (C) 1993	Allen K. Briggs, Chris P. Caputo,
     30  *			Michael L. Finch, Bradley A. Grantham, and
     31  *			Lawrence A. Kesteloot
     32  * All rights reserved.
     33  *
     34  * Redistribution and use in source and binary forms, with or without
     35  * modification, are permitted provided that the following conditions
     36  * are met:
     37  * 1. Redistributions of source code must retain the above copyright
     38  *    notice, this list of conditions and the following disclaimer.
     39  * 2. Redistributions in binary form must reproduce the above copyright
     40  *    notice, this list of conditions and the following disclaimer in the
     41  *    documentation and/or other materials provided with the distribution.
     42  * 3. All advertising materials mentioning features or use of this software
     43  *    must display the following acknowledgement:
     44  *	This product includes software developed by the Alice Group.
     45  * 4. The names of the Alice Group or any of its members may not be used
     46  *    to endorse or promote products derived from this software without
     47  *    specific prior written permission.
     48  *
     49  * THIS SOFTWARE IS PROVIDED BY THE ALICE GROUP ``AS IS'' AND ANY EXPRESS OR
     50  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     51  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     52  * IN NO EVENT SHALL THE ALICE GROUP BE LIABLE FOR ANY DIRECT, INDIRECT,
     53  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     54  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     55  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     56  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     57  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     58  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     59  *
     60  */
     61 /*
     62  * Copyright (c) 1994, 1999 Christopher G. Demetriou
     63  * All rights reserved.
     64  *
     65  * Redistribution and use in source and binary forms, with or without
     66  * modification, are permitted provided that the following conditions
     67  * are met:
     68  * 1. Redistributions of source code must retain the above copyright
     69  *    notice, this list of conditions and the following disclaimer.
     70  * 2. Redistributions in binary form must reproduce the above copyright
     71  *    notice, this list of conditions and the following disclaimer in the
     72  *    documentation and/or other materials provided with the distribution.
     73  * 3. All advertising materials mentioning features or use of this software
     74  *    must display the following acknowledgement:
     75  *      This product includes software developed by Christopher G. Demetriou
     76  *      for the NetBSD Project.
     77  * 4. The name of the author may not be used to endorse or promote products
     78  *    derived from this software without specific prior written permission
     79  *
     80  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     81  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     82  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     83  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     84  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     85  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     86  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     87  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     88  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     89  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     90  */
     91 /*
     92  * Copyright (c) 1994 Rolf Grossmann
     93  * All rights reserved.
     94  *
     95  * Redistribution and use in source and binary forms, with or without
     96  * modification, are permitted provided that the following conditions
     97  * are met:
     98  * 1. Redistributions of source code must retain the above copyright
     99  *    notice, this list of conditions and the following disclaimer.
    100  * 2. Redistributions in binary form must reproduce the above copyright
    101  *    notice, this list of conditions and the following disclaimer in the
    102  *    documentation and/or other materials provided with the distribution.
    103  * 3. All advertising materials mentioning features or use of this software
    104  *    must display the following acknowledgement:
    105  *      This product includes software developed by Rolf Grossmann.
    106  * 4. The name of the author may not be used to endorse or promote products
    107  *    derived from this software without specific prior written permission
    108  *
    109  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
    110  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    111  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    112  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
    113  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
    114  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    115  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    116  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    117  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
    118  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    119  */
    120 
    121 #ifndef _SYS_BOOTBLOCK_H
    122 #define	_SYS_BOOTBLOCK_H
    123 
    124 #if !defined(__ASSEMBLER__)
    125 #include <sys/cdefs.h>
    126 #if defined(_KERNEL) || defined(_STANDALONE)
    127 #include <sys/stdint.h>
    128 #else
    129 #include <stdint.h>
    130 #endif
    131 #endif	/* !defined(__ASSEMBLER__) */
    132 
    133 /* ------------------------------------------
    134  * MBR (Master Boot Record) --
    135  *	definitions for systems that use MBRs
    136  */
    137 
    138 /*
    139  * Layout of boot records:
    140  *
    141  *	Byte range	Use	Description
    142  *	----------	---	-----------
    143  *
    144  *	0 - 2		FMP	JMP xxx, NOP
    145  *	3 - 10		FP	OEM Name
    146  *
    147  *	11 - 61		FMP	FAT12/16 BPB
    148  *				Whilst not strictly necessary for MBR,
    149  *				GRUB reserves this area
    150  *
    151  *	11 - 89		P	FAT32 BPB
    152  *				(are we ever going to boot off this?)
    153  *
    154  *
    155  *	62 - 217	FMP	Boot code
    156  *
    157  *	90 - 217	P	FAT32 boot code
    158  *
    159  *	218 - 223	M	Win95b/98/me "drive time"
    160  *		http://www.geocities.com/thestarman3/asm/mbr/95BMEMBR.htm#MYST
    161  *				only changed if all 6 bytes are 0
    162  *
    163  *	224 - 436	FMP	boot code (continued)
    164  *
    165  *	437 - 439	M	WinNT/2K/XP MBR "boot language"
    166  *		http://www.geocities.com/thestarman3/asm/mbr/Win2kmbr.htm
    167  *				not needed by us
    168  *
    169  *	400 - 439	MP	NetBSD: mbr_bootsel
    170  *
    171  *	424 - 439	M	NetBSD: bootptn_guid (in GPT PMBR only)
    172  *
    173  *	440 - 443	M	WinNT/2K/XP Drive Serial Number (NT DSN)
    174  *		http://www.geocities.com/thestarman3/asm/mbr/Win2kmbr.htm
    175  *
    176  *	444 - 445	FMP	bootcode or unused
    177  *				NetBSD: mbr_bootsel_magic
    178  *
    179  *	446 - 509	M	partition table
    180  *
    181  *	510 - 511	FMP	magic number (0xAA55)
    182  *
    183  *	Use:
    184  *	----
    185  *	F	Floppy boot sector
    186  *	M	Master Boot Record
    187  *	P	Partition Boot record
    188  *
    189  */
    190 
    191 /*
    192  * MBR (Master Boot Record)
    193  */
    194 #define	MBR_BBSECTOR		0	/* MBR relative sector # */
    195 #define	MBR_BPB_OFFSET		11	/* offsetof(mbr_sector, mbr_bpb) */
    196 #define	MBR_BOOTCODE_OFFSET	90	/* offsetof(mbr_sector, mbr_bootcode) */
    197 #define	MBR_BS_OFFSET		400	/* offsetof(mbr_sector, mbr_bootsel) */
    198 #define	MBR_BS_OLD_OFFSET	404	/* where mbr_bootsel used to be */
    199 #define	MBR_GPT_GUID_OFFSET	424	/* location of partition GUID to boot */
    200 #define	MBR_GPT_GUID_DEFAULT		/* default uninitialized GUID */ \
    201 	{0xeee69d04,0x02f4,0x11e0,0x8f,0x5d,{0x00,0xe0,0x81,0x52,0x9a,0x6b}}
    202 #define	MBR_DSN_OFFSET		440	/* offsetof(mbr_sector, mbr_dsn) */
    203 #define	MBR_BS_MAGIC_OFFSET	444	/* offsetof(mbr_sector, mbr_bootsel_magic) */
    204 #define	MBR_PART_OFFSET		446	/* offsetof(mbr_sector, mbr_part[0]) */
    205 #define	MBR_MAGIC_OFFSET	510	/* offsetof(mbr_sector, mbr_magic) */
    206 #define	MBR_MAGIC		0xaa55	/* MBR magic number */
    207 #define	MBR_BS_MAGIC		0xb5e1	/* mbr_bootsel magic number */
    208 #define	MBR_PART_COUNT		4	/* Number of partitions in MBR */
    209 #define	MBR_BS_PARTNAMESIZE	8	/* Size of name mbr_bootsel nametab */
    210 					/* (excluding trailing NUL) */
    211 
    212 		/* values for mbr_partition.mbrp_flag */
    213 #define	MBR_PFLAG_ACTIVE	0x80	/* The active partition */
    214 
    215 		/* values for mbr_partition.mbrp_type */
    216 #define	MBR_PTYPE_UNUSED	0x00	/* Unused */
    217 #define	MBR_PTYPE_FAT12		0x01	/* 12-bit FAT */
    218 #define	MBR_PTYPE_XENIX_ROOT	0x02	/* XENIX / */
    219 #define	MBR_PTYPE_XENIX_USR	0x03	/* XENIX /usr */
    220 #define	MBR_PTYPE_FAT16S	0x04	/* 16-bit FAT, less than 32M */
    221 #define	MBR_PTYPE_EXT		0x05	/* extended partition */
    222 #define	MBR_PTYPE_FAT16B	0x06	/* 16-bit FAT, more than 32M */
    223 #define	MBR_PTYPE_NTFS		0x07	/* OS/2 HPFS, NTFS, QNX2, Adv. UNIX */
    224 #define	MBR_PTYPE_DELL		0x08	/* AIX or os, or etc. */
    225 #define MBR_PTYPE_AIX_BOOT	0x09	/* AIX boot partition or Coherent */
    226 #define MBR_PTYPE_OS2_BOOT	0x0a	/* O/2 boot manager or Coherent swap */
    227 #define	MBR_PTYPE_FAT32		0x0b	/* 32-bit FAT */
    228 #define	MBR_PTYPE_FAT32L	0x0c	/* 32-bit FAT, LBA-mapped */
    229 #define	MBR_PTYPE_7XXX		0x0d	/* 7XXX, LBA-mapped */
    230 #define	MBR_PTYPE_FAT16L	0x0e	/* 16-bit FAT, LBA-mapped */
    231 #define	MBR_PTYPE_EXT_LBA	0x0f	/* extended partition, LBA-mapped */
    232 #define	MBR_PTYPE_OPUS		0x10	/* OPUS */
    233 #define MBR_PTYPE_OS2_DOS12	0x11 	/* OS/2 DOS 12-bit FAT */
    234 #define MBR_PTYPE_COMPAQ_DIAG	0x12 	/* Compaq diagnostics */
    235 #define MBR_PTYPE_OS2_DOS16S	0x14 	/* OS/2 DOS 16-bit FAT <32M */
    236 #define MBR_PTYPE_OS2_DOS16B	0x16 	/* OS/2 DOS 16-bit FAT >=32M */
    237 #define MBR_PTYPE_OS2_IFS	0x17 	/* OS/2 hidden IFS */
    238 #define MBR_PTYPE_AST_SWAP	0x18 	/* AST Windows swapfile */
    239 #define MBR_PTYPE_WILLOWTECH	0x19 	/* Willowtech Photon coS */
    240 #define MBR_PTYPE_HID_FAT32	0x1b 	/* hidden win95 fat 32 */
    241 #define MBR_PTYPE_HID_FAT32_LBA	0x1c 	/* hidden win95 fat 32 lba */
    242 #define MBR_PTYPE_HID_FAT16_LBA	0x1d	/* hidden win95 fat 16 lba */
    243 #define MBR_PTYPE_WILLOWSOFT	0x20 	/* Willowsoft OFS1 */
    244 #define MBR_PTYPE_RESERVED_x21	0x21 	/* reserved */
    245 #define MBR_PTYPE_RESERVED_x23	0x23 	/* reserved */
    246 #define MBR_PTYPE_RESERVED_x24	0x24	/* NEC DOS */
    247 #define MBR_PTYPE_RESERVED_x26	0x26 	/* reserved */
    248 #define MBR_PTYPE_RESERVED_x31	0x31 	/* reserved */
    249 #define MBR_PTYPE_NOS		0x32	/* Alien Internet Services NOS */
    250 #define MBR_PTYPE_RESERVED_x33	0x33 	/* reserved */
    251 #define MBR_PTYPE_RESERVED_x34	0x34 	/* reserved */
    252 #define MBR_PTYPE_OS2_JFS	0x35 	/* JFS on OS2 */
    253 #define MBR_PTYPE_RESERVED_x36	0x36 	/* reserved */
    254 #define MBR_PTYPE_THEOS		0x38 	/* Theos */
    255 #define MBR_PTYPE_PLAN9		0x39 	/* Plan 9, or Theos spanned */
    256 #define MBR_PTYPE_THEOS_4GB	0x3a 	/* Theos ver 4 4gb partition */
    257 #define MBR_PTYPE_THEOS_EXT	0x3b 	/* Theos ve 4 extended partition */
    258 #define MBR_PTYPE_PMRECOVERY	0x3c 	/* PartitionMagic recovery */
    259 #define MBR_PTYPE_HID_NETWARE	0x3d 	/* Hidden Netware */
    260 #define MBR_PTYPE_VENIX		0x40 	/* VENIX 286 or LynxOS */
    261 #define	MBR_PTYPE_PREP		0x41	/* PReP */
    262 #define	MBR_PTYPE_DRDOS_LSWAP	0x42	/* linux swap sharing DRDOS disk */
    263 #define	MBR_PTYPE_DRDOS_LINUX	0x43	/* linux sharing DRDOS disk */
    264 #define	MBR_PTYPE_GOBACK	0x44	/* GoBack change utility */
    265 #define	MBR_PTYPE_BOOT_US	0x45	/* Boot US Boot manager */
    266 #define	MBR_PTYPE_EUMEL_x46	0x46	/* EUMEL/Elan or Ergos 3 */
    267 #define	MBR_PTYPE_EUMEL_x47	0x47	/* EUMEL/Elan or Ergos 3 */
    268 #define	MBR_PTYPE_EUMEL_x48	0x48	/* EUMEL/Elan or Ergos 3 */
    269 #define	MBR_PTYPE_ALFS_THIN	0x4a	/* ALFX/THIN filesystem for DOS */
    270 #define	MBR_PTYPE_OBERON	0x4c	/* Oberon partition */
    271 #define MBR_PTYPE_QNX4X		0x4d 	/* QNX4.x */
    272 #define MBR_PTYPE_QNX4X_2	0x4e 	/* QNX4.x 2nd part */
    273 #define MBR_PTYPE_QNX4X_3	0x4f 	/* QNX4.x 3rd part */
    274 #define MBR_PTYPE_DM		0x50 	/* DM (disk manager) */
    275 #define MBR_PTYPE_DM6_AUX1	0x51 	/* DM6 Aux1 (or Novell) */
    276 #define MBR_PTYPE_CPM		0x52 	/* CP/M or Microport SysV/AT */
    277 #define MBR_PTYPE_DM6_AUX3	0x53 	/* DM6 Aux3 */
    278 #define	MBR_PTYPE_DM6_DDO	0x54	/* DM6 DDO */
    279 #define MBR_PTYPE_EZDRIVE	0x55	/* EZ-Drive (disk manager) */
    280 #define MBR_PTYPE_GOLDEN_BOW	0x56	/* Golden Bow (disk manager) */
    281 #define MBR_PTYPE_DRIVE_PRO	0x57	/* Drive PRO */
    282 #define MBR_PTYPE_PRIAM_EDISK	0x5c	/* Priam Edisk (disk manager) */
    283 #define MBR_PTYPE_SPEEDSTOR	0x61	/* SpeedStor */
    284 #define MBR_PTYPE_HURD		0x63	/* GNU HURD or Mach or Sys V/386 */
    285 #define MBR_PTYPE_NOVELL_2XX	0x64	/* Novell Netware 2.xx or Speedstore */
    286 #define MBR_PTYPE_NOVELL_3XX	0x65	/* Novell Netware 3.xx */
    287 #define MBR_PTYPE_NOVELL_386	0x66	/* Novell 386 Netware */
    288 #define MBR_PTYPE_NOVELL_x67	0x67	/* Novell */
    289 #define MBR_PTYPE_NOVELL_x68	0x68	/* Novell */
    290 #define MBR_PTYPE_NOVELL_x69	0x69	/* Novell */
    291 #define MBR_PTYPE_DISKSECURE	0x70	/* DiskSecure Multi-Boot */
    292 #define MBR_PTYPE_RESERVED_x71	0x71	/* reserved */
    293 #define MBR_PTYPE_RESERVED_x73	0x73	/* reserved */
    294 #define MBR_PTYPE_RESERVED_x74	0x74	/* reserved */
    295 #define MBR_PTYPE_PCIX		0x75	/* PC/IX */
    296 #define MBR_PTYPE_RESERVED_x76	0x76	/* reserved */
    297 #define MBR_PTYPE_M2FS_M2CS	0x77	/* M2FS/M2CS partition */
    298 #define MBR_PTYPE_XOSL_FS	0x78	/* XOSL boot loader filesystem */
    299 #define MBR_PTYPE_MINIX_14A	0x80	/* MINIX until 1.4a */
    300 #define MBR_PTYPE_MINIX_14B	0x81	/* MINIX since 1.4b */
    301 #define	MBR_PTYPE_LNXSWAP	0x82	/* Linux swap or Solaris */
    302 #define	MBR_PTYPE_LNXEXT2	0x83	/* Linux native */
    303 #define MBR_PTYPE_OS2_C		0x84	/* OS/2 hidden C: drive */
    304 #define	MBR_PTYPE_EXT_LNX	0x85	/* Linux extended partition */
    305 #define	MBR_PTYPE_NTFATVOL 	0x86	/* NT FAT volume set */
    306 #define	MBR_PTYPE_NTFSVOL	0x87	/* NTFS volume set or HPFS mirrored */
    307 #define	MBR_PTYPE_LNX_KERNEL	0x8a	/* Linux Kernel AiR-BOOT partition */
    308 #define	MBR_PTYPE_FT_FAT32	0x8b	/* Legacy Fault tolerant FAT32 */
    309 #define	MBR_PTYPE_FT_FAT32_EXT	0x8c	/* Legacy Fault tolerant FAT32 ext */
    310 #define	MBR_PTYPE_HID_FR_FD_12	0x8d	/* Hidden free FDISK FAT12 */
    311 #define	MBR_PTYPE_LNX_LVM	0x8e	/* Linux Logical Volume Manager */
    312 #define	MBR_PTYPE_HID_FR_FD_16	0x90	/* Hidden free FDISK FAT16 */
    313 #define	MBR_PTYPE_HID_FR_FD_EXT	0x91	/* Hidden free FDISK DOS EXT */
    314 #define	MBR_PTYPE_HID_FR_FD_16B	0x92	/* Hidden free FDISK FAT16 Big */
    315 #define MBR_PTYPE_AMOEBA_FS 	0x93	/* Amoeba filesystem */
    316 #define MBR_PTYPE_AMOEBA_BAD 	0x94	/* Amoeba bad block table */
    317 #define MBR_PTYPE_MIT_EXOPC 	0x95	/* MIT EXOPC native partitions */
    318 #define	MBR_PTYPE_HID_FR_FD_32	0x97	/* Hidden free FDISK FAT32 */
    319 #define	MBR_PTYPE_DATALIGHT	0x98	/* Datalight ROM-DOS Super-Boot */
    320 #define MBR_PTYPE_MYLEX 	0x99	/* Mylex EISA SCSI */
    321 #define	MBR_PTYPE_HID_FR_FD_16L	0x9a	/* Hidden free FDISK FAT16 LBA */
    322 #define	MBR_PTYPE_HID_FR_FD_EXL	0x9b	/* Hidden free FDISK EXT LBA */
    323 #define MBR_PTYPE_BSDI	 	0x9f	/* BSDI? */
    324 #define MBR_PTYPE_IBM_HIB	0xa0	/* IBM Thinkpad hibernation */
    325 #define MBR_PTYPE_HP_VOL_xA1	0xa1	/* HP Volume expansion (SpeedStor) */
    326 #define MBR_PTYPE_HP_VOL_xA3	0xa3	/* HP Volume expansion (SpeedStor) */
    327 #define MBR_PTYPE_HP_VOL_xA4	0xa4	/* HP Volume expansion (SpeedStor) */
    328 #define	MBR_PTYPE_386BSD	0xa5	/* 386BSD partition type */
    329 #define	MBR_PTYPE_OPENBSD	0xa6	/* OpenBSD partition type */
    330 #define	MBR_PTYPE_NEXTSTEP_486 	0xa7	/* NeXTSTEP 486 */
    331 #define	MBR_PTYPE_APPLE_UFS 	0xa8	/* Apple UFS */
    332 #define	MBR_PTYPE_NETBSD	0xa9	/* NetBSD partition type */
    333 #define MBR_PTYPE_OLIVETTI	0xaa	/* Olivetty Fat12 1.44MB Service part */
    334 #define MBR_PTYPE_APPLE_BOOT	0xab	/* Apple Boot */
    335 #define MBR_PTYPE_SHAG_OS	0xae	/* SHAG OS filesystem */
    336 #define MBR_PTYPE_APPLE_HFS	0xaf	/* Apple HFS */
    337 #define MBR_PTYPE_BOOTSTAR_DUM	0xb0	/* BootStar Dummy */
    338 #define MBR_PTYPE_RESERVED_xB1	0xb1	/* reserved */
    339 #define MBR_PTYPE_RESERVED_xB3	0xb3	/* reserved */
    340 #define MBR_PTYPE_RESERVED_xB4	0xb4	/* reserved */
    341 #define MBR_PTYPE_RESERVED_xB6	0xb6	/* reserved */
    342 #define MBR_PTYPE_BSDI_386	0xb7	/* BSDI BSD/386 filesystem */
    343 #define MBR_PTYPE_BSDI_SWAP	0xb8	/* BSDI BSD/386 swap */
    344 #define	MBR_PTYPE_BOOT_WIZARD	0xbb	/* Boot Wizard Hidden */
    345 #define	MBR_PTYPE_SOLARIS_8	0xbe	/* Solaris 8 partition type */
    346 #define	MBR_PTYPE_SOLARIS	0xbf	/* Solaris partition type */
    347 #define MBR_PTYPE_CTOS		0xc0 	/* CTOS */
    348 #define MBR_PTYPE_DRDOS_FAT12	0xc1 	/* DRDOS/sec (FAT-12) */
    349 #define MBR_PTYPE_HID_LNX	0xc2 	/* Hidden Linux */
    350 #define MBR_PTYPE_HID_LNX_SWAP	0xc3 	/* Hidden Linux swap */
    351 #define MBR_PTYPE_DRDOS_FAT16S	0xc4 	/* DRDOS/sec (FAT-16, < 32M) */
    352 #define MBR_PTYPE_DRDOS_EXT	0xc5 	/* DRDOS/sec (EXT) */
    353 #define MBR_PTYPE_DRDOS_FAT16B	0xc6 	/* DRDOS/sec (FAT-16, >= 32M) */
    354 #define MBR_PTYPE_SYRINX	0xc7 	/* Syrinx (Cyrnix?) or HPFS disabled */
    355 #define MBR_PTYPE_DRDOS_8_xC8	0xc8 	/* Reserved for DR-DOS 8.0+ */
    356 #define MBR_PTYPE_DRDOS_8_xC9	0xc9 	/* Reserved for DR-DOS 8.0+ */
    357 #define MBR_PTYPE_DRDOS_8_xCA	0xca 	/* Reserved for DR-DOS 8.0+ */
    358 #define MBR_PTYPE_DRDOS_74_CHS	0xcb 	/* DR-DOS 7.04+ Secured FAT32 CHS */
    359 #define MBR_PTYPE_DRDOS_74_LBA	0xcc 	/* DR-DOS 7.04+ Secured FAT32 LBA */
    360 #define MBR_PTYPE_CTOS_MEMDUMP	0xcd	/* CTOS Memdump */
    361 #define MBR_PTYPE_DRDOS_74_16X	0xce 	/* DR-DOS 7.04+ FAT16X LBA */
    362 #define MBR_PTYPE_DRDOS_74_EXT	0xcf 	/* DR-DOS 7.04+ EXT LBA */
    363 #define MBR_PTYPE_REAL32	0xd0 	/* REAL/32 secure big partition */
    364 #define MBR_PTYPE_MDOS_FAT12	0xd1 	/* Old Multiuser DOS FAT12 */
    365 #define MBR_PTYPE_MDOS_FAT16S	0xd4 	/* Old Multiuser DOS FAT16 Small */
    366 #define MBR_PTYPE_MDOS_EXT	0xd5 	/* Old Multiuser DOS Extended */
    367 #define MBR_PTYPE_MDOS_FAT16B	0xd6 	/* Old Multiuser DOS FAT16 Big */
    368 #define MBR_PTYPE_CPM_86	0xd8 	/* CP/M 86 */
    369 #define MBR_PTYPE_CONCURRENT	0xdb 	/* CP/M or Concurrent CP/M */
    370 #define MBR_PTYPE_HID_CTOS_MEM	0xdd 	/* Hidden CTOS Memdump */
    371 #define MBR_PTYPE_DELL_UTIL	0xde 	/* Dell PowerEdge Server utilities */
    372 #define MBR_PTYPE_DGUX_VIRTUAL	0xdf 	/* DG/UX virtual disk manager */
    373 #define MBR_PTYPE_STMICROELEC	0xe0 	/* STMicroelectronics ST AVFS */
    374 #define MBR_PTYPE_DOS_ACCESS	0xe1 	/* DOS access or SpeedStor 12-bit */
    375 #define MBR_PTYPE_STORDIM	0xe3 	/* DOS R/O or Storage Dimensions */
    376 #define MBR_PTYPE_SPEEDSTOR_16S	0xe4 	/* SpeedStor 16-bit FAT < 1024 cyl. */
    377 #define MBR_PTYPE_RESERVED_xE5	0xe5	/* reserved */
    378 #define MBR_PTYPE_RESERVED_xE6	0xe6	/* reserved */
    379 #define MBR_PTYPE_BEOS		0xeb 	/* BeOS */
    380 #define	MBR_PTYPE_PMBR		0xee	/* GPT Protective MBR */
    381 #define	MBR_PTYPE_EFI		0xef	/* EFI system partition */
    382 #define MBR_PTYPE_LNX_PA_RISC	0xf0 	/* Linux PA-RISC boot loader */
    383 #define MBR_PTYPE_SPEEDSTOR_X	0xf1 	/* SpeedStor or Storage Dimensions */
    384 #define MBR_PTYPE_DOS33_SEC	0xf2 	/* DOS 3.3+ Secondary */
    385 #define MBR_PTYPE_RESERVED_xF3	0xf3	/* reserved */
    386 #define MBR_PTYPE_SPEEDSTOR_L	0xf4	/* SpeedStor large partition */
    387 #define MBR_PTYPE_PROLOGUE	0xf5	/* Prologue multi-volumen partition */
    388 #define MBR_PTYPE_RESERVED_xF6	0xf6 	/* reserved */
    389 #define MBR_PTYPE_PCACHE	0xf9 	/* pCache: ext2/ext3 persistent cache */
    390 #define MBR_PTYPE_BOCHS		0xfa 	/* Bochs x86 emulator */
    391 #define MBR_PTYPE_VMWARE	0xfb 	/* VMware File System */
    392 #define MBR_PTYPE_VMWARE_SWAP	0xfc 	/* VMware Swap */
    393 #define MBR_PTYPE_LNX_RAID	0xfd 	/* Linux RAID partition persistent sb */
    394 #define MBR_PTYPE_LANSTEP	0xfe	/* LANstep or IBM PS/2 IML */
    395 #define MBR_PTYPE_XENIX_BAD	0xff 	/* Xenix Bad Block Table */
    396 
    397 #ifdef MBRPTYPENAMES
    398 static const struct mbr_ptype {
    399 	int id;
    400 	const char *name;
    401 } mbr_ptypes[] = {
    402 	{ MBR_PTYPE_UNUSED, "<UNUSED>" },
    403 	{ MBR_PTYPE_FAT12, "Primary DOS with 12 bit FAT" },
    404 	{ MBR_PTYPE_XENIX_ROOT, "XENIX / filesystem" },
    405 	{ MBR_PTYPE_XENIX_USR, "XENIX /usr filesystem" },
    406 	{ MBR_PTYPE_FAT16S, "Primary DOS with 16 bit FAT <32M" },
    407 	{ MBR_PTYPE_EXT, "Extended partition" },
    408 	{ MBR_PTYPE_FAT16B, "Primary 'big' DOS, 16-bit FAT (> 32MB)" },
    409 	{ MBR_PTYPE_NTFS, "NTFS, OS/2 HPFS, QNX2 or Advanced UNIX" },
    410 	{ MBR_PTYPE_DELL, "AIX filesystem or OS/2 (thru v1.3) or DELL "
    411 			  "multiple drives or Commodore DOS or SplitDrive" },
    412 	{ MBR_PTYPE_AIX_BOOT, "AIX boot partition or Coherent" },
    413 	{ MBR_PTYPE_OS2_BOOT, "OS/2 Boot Manager or Coherent swap or OPUS" },
    414 	{ MBR_PTYPE_FAT32, "Primary DOS with 32 bit FAT" },
    415 	{ MBR_PTYPE_FAT32L, "Primary DOS with 32 bit FAT - LBA" },
    416 	{ MBR_PTYPE_7XXX, "Type 7??? - LBA" },
    417 	{ MBR_PTYPE_FAT16L, "DOS (16-bit FAT) - LBA" },
    418 	{ MBR_PTYPE_EXT_LBA, "Ext. partition - LBA" },
    419 	{ MBR_PTYPE_OPUS, "OPUS" },
    420 	{ MBR_PTYPE_OS2_DOS12, "OS/2 BM: hidden DOS 12-bit FAT" },
    421 	{ MBR_PTYPE_COMPAQ_DIAG, "Compaq diagnostics" },
    422 	{ MBR_PTYPE_OS2_DOS16S, "OS/2 BM: hidden DOS 16-bit FAT <32M "
    423 				"or Novell DOS 7.0 bug" },
    424 	{ MBR_PTYPE_OS2_DOS16B, "OS/2 BM: hidden DOS 16-bit FAT >=32M" },
    425 	{ MBR_PTYPE_OS2_IFS, "OS/2 BM: hidden IFS" },
    426 	{ MBR_PTYPE_AST_SWAP, "AST Windows swapfile" },
    427 	{ MBR_PTYPE_WILLOWTECH, "Willowtech Photon coS" },
    428 	{ MBR_PTYPE_HID_FAT32, "hidden Windows/95 FAT32" },
    429 	{ MBR_PTYPE_HID_FAT32_LBA, "hidden Windows/95 FAT32 LBA" },
    430 	{ MBR_PTYPE_HID_FAT16_LBA, "hidden Windows/95 FAT16 LBA" },
    431 	{ MBR_PTYPE_WILLOWSOFT, "Willowsoft OFS1" },
    432 	{ MBR_PTYPE_RESERVED_x21, "reserved" },
    433 	{ MBR_PTYPE_RESERVED_x23, "reserved" },
    434 	{ MBR_PTYPE_RESERVED_x24, "NEC DOS"},
    435 	{ MBR_PTYPE_RESERVED_x26, "reserved" },
    436 	{ MBR_PTYPE_RESERVED_x31, "reserved" },
    437 	{ MBR_PTYPE_NOS, "Alien Internet Services NOS" },
    438 	{ MBR_PTYPE_RESERVED_x33, "reserved" },
    439 	{ MBR_PTYPE_RESERVED_x34, "reserved" },
    440 	{ MBR_PTYPE_OS2_JFS, "JFS on OS2" },
    441 	{ MBR_PTYPE_RESERVED_x36, "reserved" },
    442 	{ MBR_PTYPE_THEOS, "Theos" },
    443 	{ MBR_PTYPE_PLAN9, "Plan 9" },
    444 	{ MBR_PTYPE_PLAN9, "Plan 9, or Theos spanned" },
    445 	{ MBR_PTYPE_THEOS_4GB,	"Theos ver 4 4gb partition" },
    446 	{ MBR_PTYPE_THEOS_EXT,	"Theos ve 4 extended partition" },
    447 	{ MBR_PTYPE_PMRECOVERY, "PartitionMagic recovery" },
    448 	{ MBR_PTYPE_HID_NETWARE, "Hidden Netware" },
    449 	{ MBR_PTYPE_VENIX, "VENIX 286 or LynxOS" },
    450 	{ MBR_PTYPE_PREP, "Linux/MINIX (sharing disk with DRDOS) "
    451 			  "or Personal RISC boot" },
    452 	{ MBR_PTYPE_DRDOS_LSWAP, "SFS or Linux swap "
    453 				 "(sharing disk with DRDOS)" },
    454 	{ MBR_PTYPE_DRDOS_LINUX, "Linux native (sharing disk with DRDOS)" },
    455 	{ MBR_PTYPE_GOBACK, "GoBack change utility" },
    456 	{ MBR_PTYPE_BOOT_US, "Boot US Boot manager" },
    457 	{ MBR_PTYPE_EUMEL_x46, "EUMEL/Elan or Ergos 3" },
    458 	{ MBR_PTYPE_EUMEL_x47, "EUMEL/Elan or Ergos 3" },
    459 	{ MBR_PTYPE_EUMEL_x48, "EUMEL/Elan or Ergos 3" },
    460 	{ MBR_PTYPE_ALFS_THIN, "ALFX/THIN filesystem for DOS" },
    461 	{ MBR_PTYPE_OBERON, "Oberon partition" },
    462 	{ MBR_PTYPE_QNX4X, "QNX4.x" },
    463 	{ MBR_PTYPE_QNX4X_2, "QNX4.x 2nd part" },
    464 	{ MBR_PTYPE_QNX4X_3, "QNX4.x 3rd part" },
    465 	{ MBR_PTYPE_DM, "DM (disk manager)" },
    466 	{ MBR_PTYPE_DM6_AUX1, "DM6 Aux1 (or Novell)" },
    467 	{ MBR_PTYPE_CPM, "CP/M or Microport SysV/AT" },
    468 	{ MBR_PTYPE_DM6_AUX3, "DM6 Aux3" },
    469 	{ MBR_PTYPE_DM6_DDO, "DM6 DDO" },
    470 	{ MBR_PTYPE_EZDRIVE, "EZ-Drive (disk manager)" },
    471 	{ MBR_PTYPE_GOLDEN_BOW, "Golden Bow (disk manager)" },
    472 	{ MBR_PTYPE_DRIVE_PRO, "Drive PRO" },
    473 	{ MBR_PTYPE_PRIAM_EDISK, "Priam Edisk (disk manager)" },
    474 	{ MBR_PTYPE_SPEEDSTOR, "SpeedStor" },
    475 	{ MBR_PTYPE_HURD, "GNU HURD or Mach or Sys V/386 "
    476 			  "(such as ISC UNIX) or MtXinu" },
    477 	{ MBR_PTYPE_NOVELL_2XX, "Novell Netware 2.xx or Speedstore" },
    478 	{ MBR_PTYPE_NOVELL_3XX, "Novell Netware 3.xx" },
    479 	{ MBR_PTYPE_NOVELL_386, "Novell 386 Netware" },
    480 	{ MBR_PTYPE_NOVELL_x67, "Novell" },
    481 	{ MBR_PTYPE_NOVELL_x68, "Novell" },
    482 	{ MBR_PTYPE_NOVELL_x69, "Novell" },
    483 	{ MBR_PTYPE_DISKSECURE, "DiskSecure Multi-Boot" },
    484 	{ MBR_PTYPE_RESERVED_x71, "reserved" },
    485 	{ MBR_PTYPE_RESERVED_x73, "reserved" },
    486 	{ MBR_PTYPE_RESERVED_x74, "reserved" },
    487 	{ MBR_PTYPE_PCIX, "PC/IX" },
    488 	{ MBR_PTYPE_RESERVED_x76, "reserved" },
    489 	{ MBR_PTYPE_M2FS_M2CS,	"M2FS/M2CS partition" },
    490 	{ MBR_PTYPE_XOSL_FS, "XOSL boot loader filesystem" },
    491 	{ MBR_PTYPE_MINIX_14A, "MINIX until 1.4a" },
    492 	{ MBR_PTYPE_MINIX_14B, "MINIX since 1.4b, early Linux, Mitac dmgr" },
    493 	{ MBR_PTYPE_LNXSWAP, "Linux swap or Prime or Solaris" },
    494 	{ MBR_PTYPE_LNXEXT2, "Linux native" },
    495 	{ MBR_PTYPE_OS2_C, "OS/2 hidden C: drive" },
    496 	{ MBR_PTYPE_EXT_LNX, "Linux extended" },
    497 	{ MBR_PTYPE_NTFATVOL, "NT FAT volume set" },
    498 	{ MBR_PTYPE_NTFSVOL, "NTFS volume set or HPFS mirrored" },
    499 	{ MBR_PTYPE_LNX_KERNEL,	"Linux Kernel AiR-BOOT partition" },
    500 	{ MBR_PTYPE_FT_FAT32, "Legacy Fault tolerant FAT32" },
    501 	{ MBR_PTYPE_FT_FAT32_EXT, "Legacy Fault tolerant FAT32 ext" },
    502 	{ MBR_PTYPE_HID_FR_FD_12, "Hidden free FDISK FAT12" },
    503 	{ MBR_PTYPE_LNX_LVM, "Linux Logical Volume Manager" },
    504 	{ MBR_PTYPE_HID_FR_FD_16, "Hidden free FDISK FAT16" },
    505 	{ MBR_PTYPE_HID_FR_FD_EXT, "Hidden free FDISK DOS EXT" },
    506 	{ MBR_PTYPE_HID_FR_FD_16L, "Hidden free FDISK FAT16 Large" },
    507 	{ MBR_PTYPE_AMOEBA_FS, "Amoeba filesystem" },
    508 	{ MBR_PTYPE_AMOEBA_BAD, "Amoeba bad block table" },
    509 	{ MBR_PTYPE_MIT_EXOPC, "MIT EXOPC native partitions" },
    510 	{ MBR_PTYPE_HID_FR_FD_32, "Hidden free FDISK FAT32" },
    511 	{ MBR_PTYPE_DATALIGHT, "Datalight ROM-DOS Super-Boot" },
    512 	{ MBR_PTYPE_MYLEX, "Mylex EISA SCSI" },
    513 	{ MBR_PTYPE_HID_FR_FD_16L, "Hidden free FDISK FAT16 LBA" },
    514 	{ MBR_PTYPE_HID_FR_FD_EXL, "Hidden free FDISK EXT LBA" },
    515 	{ MBR_PTYPE_BSDI, "BSDI?" },
    516 	{ MBR_PTYPE_IBM_HIB, "IBM Thinkpad hibernation" },
    517 	{ MBR_PTYPE_HP_VOL_xA1, "HP Volume expansion (SpeedStor)" },
    518 	{ MBR_PTYPE_HP_VOL_xA3, "HP Volume expansion (SpeedStor)" },
    519 	{ MBR_PTYPE_HP_VOL_xA4, "HP Volume expansion (SpeedStor)" },
    520 	{ MBR_PTYPE_386BSD, "FreeBSD or 386BSD or old NetBSD" },
    521 	{ MBR_PTYPE_OPENBSD, "OpenBSD" },
    522 	{ MBR_PTYPE_NEXTSTEP_486, "NeXTSTEP 486" },
    523 	{ MBR_PTYPE_APPLE_UFS, "Apple UFS" },
    524 	{ MBR_PTYPE_NETBSD, "NetBSD" },
    525 	{ MBR_PTYPE_OLIVETTI, "Olivetty Fat12 1.44MB Service part" },
    526 	{ MBR_PTYPE_SHAG_OS, "SHAG OS filesystem" },
    527 	{ MBR_PTYPE_BOOTSTAR_DUM, "BootStar Dummy" },
    528 	{ MBR_PTYPE_BOOT_WIZARD, "Boot Wizard Hidden" },
    529 	{ MBR_PTYPE_APPLE_BOOT, "Apple Boot" },
    530 	{ MBR_PTYPE_APPLE_HFS, "Apple HFS" },
    531 	{ MBR_PTYPE_RESERVED_xB6, "reserved" },
    532 	{ MBR_PTYPE_RESERVED_xB6, "reserved" },
    533 	{ MBR_PTYPE_RESERVED_xB6, "reserved" },
    534 	{ MBR_PTYPE_RESERVED_xB6, "reserved" },
    535 	{ MBR_PTYPE_BSDI_386, "BSDI BSD/386 filesystem" },
    536 	{ MBR_PTYPE_BSDI_SWAP, "BSDI BSD/386 swap" },
    537 	{ MBR_PTYPE_SOLARIS_8, "Solaris 8 boot partition" },
    538 	{ MBR_PTYPE_SOLARIS, "Solaris boot partition" },
    539 	{ MBR_PTYPE_CTOS, "CTOS" },
    540 	{ MBR_PTYPE_DRDOS_FAT12, "DRDOS/sec (FAT-12)" },
    541 	{ MBR_PTYPE_HID_LNX, "Hidden Linux" },
    542 	{ MBR_PTYPE_HID_LNX_SWAP, "Hidden Linux Swap" },
    543 	{ MBR_PTYPE_DRDOS_FAT16S, "DRDOS/sec (FAT-16, < 32M)" },
    544 	{ MBR_PTYPE_DRDOS_EXT, "DRDOS/sec (EXT)" },
    545 	{ MBR_PTYPE_DRDOS_FAT16B, "DRDOS/sec (FAT-16, >= 32M)" },
    546 	{ MBR_PTYPE_SYRINX, "Syrinx (Cyrnix?) or HPFS disabled" },
    547 	{ MBR_PTYPE_DRDOS_8_xC8, "Reserved for DR-DOS 8.0+" },
    548 	{ MBR_PTYPE_DRDOS_8_xC9, "Reserved for DR-DOS 8.0+" },
    549 	{ MBR_PTYPE_DRDOS_8_xCA, "Reserved for DR-DOS 8.0+" },
    550 	{ MBR_PTYPE_DRDOS_74_CHS, "DR-DOS 7.04+ Secured FAT32 CHS" },
    551 	{ MBR_PTYPE_DRDOS_74_LBA, "DR-DOS 7.04+ Secured FAT32 LBA" },
    552 	{ MBR_PTYPE_CTOS_MEMDUMP, "CTOS Memdump" },
    553 	{ MBR_PTYPE_DRDOS_74_16X, "DR-DOS 7.04+ FAT16X LBA" },
    554 	{ MBR_PTYPE_DRDOS_74_EXT, "DR-DOS 7.04+ EXT LBA" },
    555 	{ MBR_PTYPE_REAL32, "REAL/32 secure big partition" },
    556 	{ MBR_PTYPE_MDOS_FAT12, "Old Multiuser DOS FAT12" },
    557 	{ MBR_PTYPE_MDOS_FAT16S, "Old Multiuser DOS FAT16 Small" },
    558 	{ MBR_PTYPE_MDOS_EXT, "Old Multiuser DOS Extended" },
    559 	{ MBR_PTYPE_MDOS_FAT16B, "Old Multiuser DOS FAT16 Big" },
    560 	{ MBR_PTYPE_CPM_86, "CP/M 86" },
    561 	{ MBR_PTYPE_CONCURRENT, "CP/M or Concurrent CP/M or Concurrent DOS "
    562 				"or CTOS" },
    563 	{ MBR_PTYPE_HID_CTOS_MEM, "Hidden CTOS Memdump" },
    564 	{ MBR_PTYPE_DELL_UTIL, "Dell PowerEdge Server utilities" },
    565 	{ MBR_PTYPE_DGUX_VIRTUAL, "DG/UX virtual disk manager" },
    566 	{ MBR_PTYPE_STMICROELEC, "STMicroelectronics ST AVFS" },
    567 	{ MBR_PTYPE_DOS_ACCESS, "DOS access or SpeedStor 12-bit FAT "
    568 				"extended partition" },
    569 	{ MBR_PTYPE_STORDIM, "DOS R/O or SpeedStor or Storage Dimensions" },
    570 	{ MBR_PTYPE_SPEEDSTOR_16S, "SpeedStor 16-bit FAT extended partition "
    571 				   "< 1024 cyl." },
    572 	{ MBR_PTYPE_RESERVED_xE5, "reserved" },
    573 	{ MBR_PTYPE_RESERVED_xE6, "reserved" },
    574 	{ MBR_PTYPE_BEOS, "BeOS" },
    575 	{ MBR_PTYPE_PMBR, "GPT Protective MBR" },
    576 	{ MBR_PTYPE_EFI, "EFI system partition" },
    577 	{ MBR_PTYPE_LNX_PA_RISC, "Linux PA-RISC boot loader" },
    578 	{ MBR_PTYPE_SPEEDSTOR_X, "SpeedStor or Storage Dimensions" },
    579 	{ MBR_PTYPE_DOS33_SEC, "DOS 3.3+ Secondary" },
    580 	{ MBR_PTYPE_RESERVED_xF3, "reserved" },
    581 	{ MBR_PTYPE_SPEEDSTOR_L, "SpeedStor large partition or "
    582 				 "Storage Dimensions" },
    583 	{ MBR_PTYPE_PROLOGUE, "Prologue multi-volumen partition" },
    584 	{ MBR_PTYPE_RESERVED_xF6, "reserved" },
    585 	{ MBR_PTYPE_PCACHE, "pCache: ext2/ext3 persistent cache" },
    586 	{ MBR_PTYPE_BOCHS, "Bochs x86 emulator" },
    587 	{ MBR_PTYPE_VMWARE, "VMware File System" },
    588 	{ MBR_PTYPE_VMWARE_SWAP, "VMware Swap" },
    589 	{ MBR_PTYPE_LNX_RAID, "Linux RAID partition persistent sb" },
    590 	{ MBR_PTYPE_LANSTEP, "SpeedStor >1024 cyl. or LANstep "
    591 			     "or IBM PS/2 IML" },
    592 	{ MBR_PTYPE_XENIX_BAD, "Xenix Bad Block Table" },
    593 };
    594 #endif
    595 
    596 #define	MBR_PSECT(s)		((s) & 0x3f)
    597 #define	MBR_PCYL(c, s)		((c) + (((s) & 0xc0) << 2))
    598 
    599 #define	MBR_IS_EXTENDED(x)	((x) == MBR_PTYPE_EXT || \
    600 				 (x) == MBR_PTYPE_EXT_LBA || \
    601 				 (x) == MBR_PTYPE_EXT_LNX)
    602 
    603 		/* values for mbr_bootsel.mbrbs_flags */
    604 #define	MBR_BS_ACTIVE	0x01	/* Bootselector active (or code present) */
    605 #define	MBR_BS_EXTINT13	0x02	/* Set by fdisk if LBA needed (deprecated) */
    606 #define	MBR_BS_READ_LBA	0x04	/* Force LBA reads (deprecated) */
    607 #define	MBR_BS_EXTLBA	0x08	/* Extended ptn capable (LBA reads) */
    608 #define	MBR_BS_ASCII	0x10	/* Bootselect code needs ascii key code */
    609 /* This is always set, the bootsel is located using the magic number...  */
    610 #define	MBR_BS_NEWMBR	0x80	/* New bootsel at offset 440 */
    611 
    612 #if !defined(__ASSEMBLER__)					/* { */
    613 
    614 /*
    615  * (x86) BIOS Parameter Block for FAT12
    616  */
    617 struct mbr_bpbFAT12 {
    618 	uint16_t	bpbBytesPerSec;	/* bytes per sector */
    619 	uint8_t		bpbSecPerClust;	/* sectors per cluster */
    620 	uint16_t	bpbResSectors;	/* number of reserved sectors */
    621 	uint8_t		bpbFATs;	/* number of FATs */
    622 	uint16_t	bpbRootDirEnts;	/* number of root directory entries */
    623 	uint16_t	bpbSectors;	/* total number of sectors */
    624 	uint8_t		bpbMedia;	/* media descriptor */
    625 	uint16_t	bpbFATsecs;	/* number of sectors per FAT */
    626 	uint16_t	bpbSecPerTrack;	/* sectors per track */
    627 	uint16_t	bpbHeads;	/* number of heads */
    628 	uint16_t	bpbHiddenSecs;	/* # of hidden sectors */
    629 } __packed;
    630 
    631 /*
    632  * (x86) BIOS Parameter Block for FAT16
    633  */
    634 struct mbr_bpbFAT16 {
    635 	uint16_t	bpbBytesPerSec;	/* bytes per sector */
    636 	uint8_t		bpbSecPerClust;	/* sectors per cluster */
    637 	uint16_t	bpbResSectors;	/* number of reserved sectors */
    638 	uint8_t		bpbFATs;	/* number of FATs */
    639 	uint16_t	bpbRootDirEnts;	/* number of root directory entries */
    640 	uint16_t	bpbSectors;	/* total number of sectors */
    641 	uint8_t		bpbMedia;	/* media descriptor */
    642 	uint16_t	bpbFATsecs;	/* number of sectors per FAT */
    643 	uint16_t	bpbSecPerTrack;	/* sectors per track */
    644 	uint16_t	bpbHeads;	/* number of heads */
    645 	uint32_t	bpbHiddenSecs;	/* # of hidden sectors */
    646 	uint32_t	bpbHugeSectors;	/* # of sectors if bpbSectors == 0 */
    647 	uint8_t		bsDrvNum;	/* Int 0x13 drive number (e.g. 0x80) */
    648 	uint8_t		bsReserved1;	/* Reserved; set to 0 */
    649 	uint8_t		bsBootSig;	/* 0x29 if next 3 fields are present */
    650 	uint8_t		bsVolID[4];	/* Volume serial number */
    651 	uint8_t		bsVolLab[11];	/* Volume label */
    652 	uint8_t		bsFileSysType[8];
    653 					/* "FAT12   ", "FAT16   ", "FAT     " */
    654 } __packed;
    655 
    656 /*
    657  * (x86) BIOS Parameter Block for FAT32
    658  */
    659 struct mbr_bpbFAT32 {
    660 	uint16_t	bpbBytesPerSec;	/* bytes per sector */
    661 	uint8_t		bpbSecPerClust;	/* sectors per cluster */
    662 	uint16_t	bpbResSectors;	/* number of reserved sectors */
    663 	uint8_t		bpbFATs;	/* number of FATs */
    664 	uint16_t	bpbRootDirEnts;	/* number of root directory entries */
    665 	uint16_t	bpbSectors;	/* total number of sectors */
    666 	uint8_t		bpbMedia;	/* media descriptor */
    667 	uint16_t	bpbFATsecs;	/* number of sectors per FAT */
    668 	uint16_t	bpbSecPerTrack;	/* sectors per track */
    669 	uint16_t	bpbHeads;	/* number of heads */
    670 	uint32_t	bpbHiddenSecs;	/* # of hidden sectors */
    671 	uint32_t	bpbHugeSectors;	/* # of sectors if bpbSectors == 0 */
    672 	uint32_t	bpbBigFATsecs;	/* like bpbFATsecs for FAT32 */
    673 	uint16_t	bpbExtFlags;	/* extended flags: */
    674 #define	MBR_FAT32_FATNUM	0x0F	/*   mask for numbering active FAT */
    675 #define	MBR_FAT32_FATMIRROR	0x80	/*   FAT is mirrored (as previously) */
    676 	uint16_t	bpbFSVers;	/* filesystem version */
    677 #define	MBR_FAT32_FSVERS	0	/*   currently only 0 is understood */
    678 	uint32_t	bpbRootClust;	/* start cluster for root directory */
    679 	uint16_t	bpbFSInfo;	/* filesystem info structure sector */
    680 	uint16_t	bpbBackup;	/* backup boot sector */
    681 	uint8_t		bsReserved[12];	/* Reserved for future expansion */
    682 	uint8_t		bsDrvNum;	/* Int 0x13 drive number (e.g. 0x80) */
    683 	uint8_t		bsReserved1;	/* Reserved; set to 0 */
    684 	uint8_t		bsBootSig;	/* 0x29 if next 3 fields are present */
    685 	uint8_t		bsVolID[4];	/* Volume serial number */
    686 	uint8_t		bsVolLab[11];	/* Volume label */
    687 	uint8_t		bsFileSysType[8]; /* "FAT32   " */
    688 } __packed;
    689 
    690 /*
    691  * (x86) MBR boot selector
    692  */
    693 struct mbr_bootsel {
    694 	uint8_t		mbrbs_defkey;
    695 	uint8_t		mbrbs_flags;
    696 	uint16_t	mbrbs_timeo;
    697 	char		mbrbs_nametab[MBR_PART_COUNT][MBR_BS_PARTNAMESIZE + 1];
    698 } __packed;
    699 
    700 /*
    701  * MBR partition
    702  */
    703 struct mbr_partition {
    704 	uint8_t		mbrp_flag;	/* MBR partition flags */
    705 	uint8_t		mbrp_shd;	/* Starting head */
    706 	uint8_t		mbrp_ssect;	/* Starting sector */
    707 	uint8_t		mbrp_scyl;	/* Starting cylinder */
    708 	uint8_t		mbrp_type;	/* Partition type (see below) */
    709 	uint8_t		mbrp_ehd;	/* End head */
    710 	uint8_t		mbrp_esect;	/* End sector */
    711 	uint8_t		mbrp_ecyl;	/* End cylinder */
    712 	uint32_t	mbrp_start;	/* Absolute starting sector number */
    713 	uint32_t	mbrp_size;	/* Partition size in sectors */
    714 } __packed;
    715 
    716 int xlat_mbr_fstype(int);	/* in sys/lib/libkern/xlat_mbr_fstype.c */
    717 
    718 /*
    719  * MBR boot sector.
    720  * This is used by both the MBR (Master Boot Record) in sector 0 of the disk
    721  * and the PBR (Partition Boot Record) in sector 0 of an MBR partition.
    722  */
    723 struct mbr_sector {
    724 					/* Jump instruction to boot code.  */
    725 					/* Usually 0xE9nnnn or 0xEBnn90 */
    726 	uint8_t			mbr_jmpboot[3];
    727 					/* OEM name and version */
    728 	uint8_t			mbr_oemname[8];
    729 	union {				/* BIOS Parameter Block */
    730 		struct mbr_bpbFAT12	bpb12;
    731 		struct mbr_bpbFAT16	bpb16;
    732 		struct mbr_bpbFAT32	bpb32;
    733 	} mbr_bpb;
    734 					/* Boot code */
    735 	uint8_t			mbr_bootcode[310];
    736 					/* Config for /usr/mdec/mbr_bootsel */
    737 	struct mbr_bootsel	mbr_bootsel;
    738 					/* NT Drive Serial Number */
    739 	uint32_t		mbr_dsn;
    740 					/* mbr_bootsel magic */
    741 	uint16_t		mbr_bootsel_magic;
    742 					/* MBR partition table */
    743 	struct mbr_partition	mbr_parts[MBR_PART_COUNT];
    744 					/* MBR magic (0xaa55) */
    745 	uint16_t		mbr_magic;
    746 } __packed;
    747 
    748 #endif	/* !defined(__ASSEMBLER__) */				/* } */
    749 
    750 
    751 /* ------------------------------------------
    752  * shared --
    753  *	definitions shared by many platforms
    754  */
    755 
    756 #if !defined(__ASSEMBLER__)					/* { */
    757 
    758 	/* Maximum # of blocks in bbi_block_table, each bbi_block_size long */
    759 #define	SHARED_BBINFO_MAXBLOCKS	118	/* so sizeof(shared_bbinfo) == 512 */
    760 
    761 struct shared_bbinfo {
    762 	uint8_t bbi_magic[32];
    763 	int32_t bbi_block_size;
    764 	int32_t bbi_block_count;
    765 	int32_t bbi_block_table[SHARED_BBINFO_MAXBLOCKS];
    766 };
    767 
    768 /* ------------------------------------------
    769  * alpha --
    770  *	Alpha (disk, but also tape) Boot Block.
    771  *
    772  *	See Section (III) 3.6.1 of the Alpha Architecture Reference Manual.
    773  */
    774 
    775 struct alpha_boot_block {
    776 	uint64_t bb_data[63];		/* data (disklabel, also as below) */
    777 	uint64_t bb_cksum;		/* checksum of the boot block,
    778 					 * taken as uint64_t's
    779 					 */
    780 };
    781 #define	bb_secsize	bb_data[60]	/* secondary size (blocks) */
    782 #define	bb_secstart	bb_data[61]	/* secondary start (blocks) */
    783 #define	bb_flags	bb_data[62]	/* unknown flags (set to zero) */
    784 
    785 #define	ALPHA_BOOT_BLOCK_OFFSET		0	/* offset of boot block. */
    786 #define	ALPHA_BOOT_BLOCK_BLOCKSIZE	512	/* block size for sector
    787 						 * size/start, and for boot
    788 						 * block itself.
    789 						 */
    790 
    791 #define	ALPHA_BOOT_BLOCK_CKSUM(bb,cksum)				\
    792 	do {								\
    793 		const struct alpha_boot_block *_bb = (bb);		\
    794 		uint64_t _cksum;					\
    795 		size_t _i;						\
    796 									\
    797 		_cksum = 0;						\
    798 		for (_i = 0;						\
    799 		    _i < (sizeof _bb->bb_data / sizeof _bb->bb_data[0]); \
    800 		    _i++)						\
    801 			_cksum += le64toh(_bb->bb_data[_i]);		\
    802 		*(cksum) = htole64(_cksum);				\
    803 	} while (0)
    804 
    805 /* ------------------------------------------
    806  * apple --
    807  *	Apple computers boot block related information
    808  */
    809 
    810 /*
    811  *	Driver Descriptor Map, from Inside Macintosh: Devices, SCSI Manager
    812  *	pp 12-13.  The driver descriptor map always resides on physical block 0.
    813  */
    814 struct apple_drvr_descriptor {
    815 	uint32_t	descBlock;	/* first block of driver */
    816 	uint16_t	descSize;	/* driver size in blocks */
    817 	uint16_t	descType;	/* system type */
    818 } __packed;
    819 
    820 /*
    821  *	system types; Apple reserves 0-15
    822  */
    823 #define	APPLE_DRVR_TYPE_MACINTOSH	1
    824 
    825 #define	APPLE_DRVR_MAP_MAGIC		0x4552
    826 #define	APPLE_DRVR_MAP_MAX_DESCRIPTORS	61
    827 
    828 struct apple_drvr_map {
    829 	uint16_t	sbSig;		/* map signature */
    830 	uint16_t	sbBlockSize;	/* block size of device */
    831 	uint32_t	sbBlkCount;	/* number of blocks on device */
    832 	uint16_t	sbDevType;	/* (used internally by ROM) */
    833 	uint16_t	sbDevID;	/* (used internally by ROM) */
    834 	uint32_t	sbData;		/* (used internally by ROM) */
    835 	uint16_t	sbDrvrCount;	/* number of driver descriptors */
    836 	struct apple_drvr_descriptor sb_dd[APPLE_DRVR_MAP_MAX_DESCRIPTORS];
    837 	uint16_t	pad[3];
    838 } __packed;
    839 
    840 /*
    841  *	Partition map structure from Inside Macintosh: Devices, SCSI Manager
    842  *	pp. 13-14.  The partition map always begins on physical block 1.
    843  *
    844  *	With the exception of block 0, all blocks on the disk must belong to
    845  *	exactly one partition.  The partition map itself belongs to a partition
    846  *	of type `APPLE_PARTITION_MAP', and is not limited in size by anything
    847  *	other than available disk space.  The partition map is not necessarily
    848  *	the first partition listed.
    849  */
    850 #define	APPLE_PART_MAP_ENTRY_MAGIC	0x504d
    851 
    852 struct apple_part_map_entry {
    853 	uint16_t	pmSig;		/* partition signature */
    854 	uint16_t	pmSigPad;	/* (reserved) */
    855 	uint32_t	pmMapBlkCnt;	/* number of blocks in partition map */
    856 	uint32_t	pmPyPartStart;	/* first physical block of partition */
    857 	uint32_t	pmPartBlkCnt;	/* number of blocks in partition */
    858 	uint8_t		pmPartName[32];	/* partition name */
    859 	uint8_t		pmPartType[32];	/* partition type */
    860 	uint32_t	pmLgDataStart;	/* first logical block of data area */
    861 	uint32_t	pmDataCnt;	/* number of blocks in data area */
    862 	uint32_t	pmPartStatus;	/* partition status information */
    863 /*
    864  * Partition Status Information from Apple Tech Note 1189
    865  */
    866 #define	APPLE_PS_VALID		0x00000001	/* Entry is valid */
    867 #define	APPLE_PS_ALLOCATED	0x00000002	/* Entry is allocated */
    868 #define	APPLE_PS_IN_USE		0x00000004	/* Entry in use */
    869 #define	APPLE_PS_BOOT_INFO	0x00000008	/* Entry contains boot info */
    870 #define	APPLE_PS_READABLE	0x00000010	/* Entry is readable */
    871 #define	APPLE_PS_WRITABLE	0x00000020	/* Entry is writable */
    872 #define	APPLE_PS_BOOT_CODE_PIC	0x00000040	/* Boot code has position
    873 						 * independent code */
    874 #define	APPLE_PS_CC_DRVR	0x00000100	/* Partition contains chain-
    875 						 * compatible driver */
    876 #define	APPLE_PS_RL_DRVR	0x00000200	/* Partition contains real
    877 						 * driver */
    878 #define	APPLE_PS_CH_DRVR	0x00000400	/* Partition contains chain
    879 						 * driver */
    880 #define	APPLE_PS_AUTO_MOUNT	0x40000000	/* Mount automatically at
    881 						 * startup */
    882 #define	APPLE_PS_STARTUP	0x80000000	/* Is the startup partition */
    883 	uint32_t	pmLgBootStart;	/* first logical block of boot code */
    884 	uint32_t	pmBootSize;	/* size of boot code, in bytes */
    885 	uint32_t	pmBootLoad;	/* boot code load address */
    886 	uint32_t	pmBootLoad2;	/* (reserved) */
    887 	uint32_t	pmBootEntry;	/* boot code entry point */
    888 	uint32_t	pmBootEntry2;	/* (reserved) */
    889 	uint32_t	pmBootCksum;	/* boot code checksum */
    890 	int8_t		pmProcessor[16]; /* processor type (e.g. "68020") */
    891 	uint8_t		pmBootArgs[128]; /* A/UX boot arguments */
    892 	uint8_t		pad[248];	/* pad to end of block */
    893 };
    894 
    895 #define	APPLE_PART_TYPE_DRIVER		"APPLE_DRIVER"
    896 #define	APPLE_PART_TYPE_DRIVER43	"APPLE_DRIVER43"
    897 #define	APPLE_PART_TYPE_DRIVERATA	"APPLE_DRIVER_ATA"
    898 #define	APPLE_PART_TYPE_DRIVERIOKIT	"APPLE_DRIVER_IOKIT"
    899 #define	APPLE_PART_TYPE_FWDRIVER	"APPLE_FWDRIVER"
    900 #define	APPLE_PART_TYPE_FWB_COMPONENT	"FWB DRIVER COMPONENTS"
    901 #define	APPLE_PART_TYPE_FREE		"APPLE_FREE"
    902 #define	APPLE_PART_TYPE_MAC		"APPLE_HFS"
    903 #define	APPLE_PART_TYPE_NETBSD		"NETBSD"
    904 #define	APPLE_PART_TYPE_NBSD_PPCBOOT	"NETBSD/MACPPC"
    905 #define	APPLE_PART_TYPE_NBSD_68KBOOT	"NETBSD/MAC68K"
    906 #define	APPLE_PART_TYPE_PATCHES		"APPLE_PATCHES"
    907 #define	APPLE_PART_TYPE_PARTMAP		"APPLE_PARTITION_MAP"
    908 #define	APPLE_PART_TYPE_PATCHES		"APPLE_PATCHES"
    909 #define	APPLE_PART_TYPE_SCRATCH		"APPLE_SCRATCH"
    910 #define	APPLE_PART_TYPE_UNIX		"APPLE_UNIX_SVR2"
    911 
    912 /*
    913  * "pmBootArgs" for APPLE_UNIX_SVR2 partition.
    914  * NetBSD/mac68k only uses Magic, Cluster, Type, and Flags.
    915  */
    916 struct apple_blockzeroblock {
    917 	uint32_t       bzbMagic;
    918 	uint8_t        bzbCluster;
    919 	uint8_t        bzbType;
    920 	uint16_t       bzbBadBlockInode;
    921 	uint16_t       bzbFlags;
    922 	uint16_t       bzbReserved;
    923 	uint32_t       bzbCreationTime;
    924 	uint32_t       bzbMountTime;
    925 	uint32_t       bzbUMountTime;
    926 };
    927 
    928 #define	APPLE_BZB_MAGIC		0xABADBABE
    929 #define	APPLE_BZB_TYPEFS	1
    930 #define	APPLE_BZB_TYPESWAP	3
    931 #define	APPLE_BZB_ROOTFS	0x8000
    932 #define	APPLE_BZB_USRFS		0x4000
    933 
    934 /* ------------------------------------------
    935  * ews4800mips
    936  *
    937  */
    938 
    939 #define	EWS4800MIPS_BBINFO_MAGIC		"NetBSD/ews4800mips     20040611"
    940 #define	EWS4800MIPS_BOOT_BLOCK_OFFSET		0
    941 #define	EWS4800MIPS_BOOT_BLOCK_BLOCKSIZE	512
    942 #define	EWS4800MIPS_BOOT_BLOCK_MAX_SIZE		(512 * 8)
    943 
    944 /* ------------------------------------------
    945  * hp300
    946  *
    947  */
    948 
    949 /* volume header for "LIF" format volumes */
    950 
    951 struct	hp300_lifvol {
    952 	uint16_t	vol_id;
    953 	char		vol_label[6];
    954 	uint32_t	vol_addr;
    955 	uint16_t	vol_oct;
    956 	uint16_t	vol_dummy;
    957 	uint32_t	vol_dirsize;
    958 	uint16_t	vol_version;
    959 	uint16_t	vol_zero;
    960 	uint32_t	vol_huh1;
    961 	uint32_t	vol_huh2;
    962 	uint32_t	vol_length;
    963 };
    964 
    965 /* LIF directory entry format */
    966 
    967 struct	hp300_lifdir {
    968 	char		dir_name[10];
    969 	uint16_t	dir_type;
    970 	uint32_t	dir_addr;
    971 	uint32_t	dir_length;
    972 	char		dir_toc[6];
    973 	uint16_t	dir_flag;
    974 	uint32_t	dir_exec;
    975 };
    976 
    977 /* load header for boot rom */
    978 struct hp300_load {
    979 	uint32_t	address;
    980 	uint32_t	count;
    981 };
    982 
    983 #define	HP300_VOL_ID		0x8000	/* always $8000 */
    984 #define	HP300_VOL_OCT		4096
    985 #define	HP300_DIR_TYPE		0xe942	/* "SYS9k Series 9000" */
    986 #define	HP300_DIR_FLAG		0x8001	/* don't ask me! */
    987 #define	HP300_SECTSIZE		256
    988 
    989 #define	HP300_LIF_NUMDIR	8
    990 
    991 #define	HP300_LIF_VOLSTART	0
    992 #define	HP300_LIF_VOLSIZE	sizeof(struct hp300_lifvol)
    993 #define	HP300_LIF_DIRSTART	512
    994 #define	HP300_LIF_DIRSIZE	(HP300_LIF_NUMDIR * sizeof(struct hp300_lifdir))
    995 #define	HP300_LIF_FILESTART	8192
    996 
    997 #define	hp300_btolifs(b)	(((b) + (HP300_SECTSIZE - 1)) / HP300_SECTSIZE)
    998 #define	hp300_lifstob(s)	((s) * HP300_SECTSIZE)
    999 
   1000 
   1001 /* ------------------------------------------
   1002  * hppa
   1003  *
   1004  */
   1005 
   1006 /*
   1007  * volume header for "LIF" format volumes
   1008  */
   1009 struct	hppa_lifvol {
   1010 	uint16_t	vol_id;
   1011 	uint8_t		vol_label[6];
   1012 	uint32_t	vol_addr;
   1013 	uint16_t	vol_oct;
   1014 	uint16_t	vol_dummy;
   1015 
   1016 	uint32_t	vol_dirsize;
   1017 	uint16_t	vol_version;
   1018 	uint16_t	vol_zero;
   1019 	uint32_t	vol_number;
   1020 	uint32_t	vol_lastvol;
   1021 
   1022 	uint32_t	vol_length;
   1023 	uint8_t		vol_toc[6];
   1024 	uint8_t		vol_dummy1[198];
   1025 
   1026 	uint32_t	ipl_addr;
   1027 	uint32_t	ipl_size;
   1028 	uint32_t	ipl_entry;
   1029 
   1030 	uint32_t	vol_dummy2;
   1031 };
   1032 
   1033 struct	hppa_lifdir {
   1034 	uint8_t		dir_name[10];
   1035 	uint16_t	dir_type;
   1036 	uint32_t	dir_addr;
   1037 	uint32_t	dir_length;
   1038 	uint8_t		dir_toc[6];
   1039 	uint16_t	dir_flag;
   1040 	uint32_t	dir_implement;
   1041 };
   1042 
   1043 struct hppa_lifload {
   1044 	int address;
   1045 	int count;
   1046 };
   1047 
   1048 #define	HPPA_LIF_VOL_ID	0x8000
   1049 #define	HPPA_LIF_VOL_OCT	0x1000
   1050 #define	HPPA_LIF_DIR_SWAP	0x5243
   1051 #define	HPPA_LIF_DIR_FS	0xcd38
   1052 #define	HPPA_LIF_DIR_IOMAP	0xcd60
   1053 #define	HPPA_LIF_DIR_HPUX	0xcd80
   1054 #define	HPPA_LIF_DIR_ISL	0xce00
   1055 #define	HPPA_LIF_DIR_PAD	0xcffe
   1056 #define	HPPA_LIF_DIR_AUTO	0xcfff
   1057 #define	HPPA_LIF_DIR_EST	0xd001
   1058 #define	HPPA_LIF_DIR_TYPE	0xe942
   1059 
   1060 #define	HPPA_LIF_DIR_FLAG	0x8001	/* dont ask me! */
   1061 #define	HPPA_LIF_SECTSIZE	256
   1062 
   1063 #define	HPPA_LIF_NUMDIR	8
   1064 
   1065 #define	HPPA_LIF_VOLSTART	0
   1066 #define	HPPA_LIF_VOLSIZE	sizeof(struct hppa_lifvol)
   1067 #define	HPPA_LIF_DIRSTART	2048
   1068 #define	HPPA_LIF_DIRSIZE	(HPPA_LIF_NUMDIR * sizeof(struct hppa_lifdir))
   1069 #define	HPPA_LIF_FILESTART	4096
   1070 
   1071 #define	hppa_btolifs(b)	(((b) + (HPPA_LIF_SECTSIZE - 1)) / HPPA_LIF_SECTSIZE)
   1072 #define	hppa_lifstob(s)	((s) * HPPA_LIF_SECTSIZE)
   1073 #define	hppa_lifstodb(s)	((s) * HPPA_LIF_SECTSIZE / DEV_BSIZE)
   1074 
   1075 
   1076 /* ------------------------------------------
   1077  * x86
   1078  *
   1079  */
   1080 
   1081 /*
   1082  * Parameters for NetBSD /boot written to start of pbr code by installboot
   1083  */
   1084 
   1085 struct x86_boot_params {
   1086 	uint32_t	bp_length;	/* length of patchable data */
   1087 	uint32_t	bp_flags;
   1088 	uint32_t	bp_timeout;	/* boot timeout in seconds */
   1089 	uint32_t	bp_consdev;
   1090 	uint32_t	bp_conspeed;
   1091 	uint8_t		bp_password[16];	/* md5 hash of password */
   1092 	char		bp_keymap[64];	/* keyboard translation map */
   1093 	uint32_t	bp_consaddr;	/* ioaddr for console */
   1094 };
   1095 
   1096 #endif	/* !defined(__ASSEMBLER__) */				/* } */
   1097 
   1098 #define	X86_BOOT_MAGIC(n)	('x' << 24 | 0x86b << 12 | 'm' << 4 | (n))
   1099 #define	X86_BOOT_MAGIC_1	X86_BOOT_MAGIC(1)	/* pbr.S */
   1100 #define	X86_BOOT_MAGIC_2	X86_BOOT_MAGIC(2)	/* bootxx.S */
   1101 #define	X86_BOOT_MAGIC_PXE	X86_BOOT_MAGIC(3)	/* start_pxe.S */
   1102 #define	X86_BOOT_MAGIC_FAT	X86_BOOT_MAGIC(4)	/* fatboot.S */
   1103 #define	X86_BOOT_MAGIC_EFI	X86_BOOT_MAGIC(5)	/* efiboot/start.S */
   1104 #define	X86_MBR_GPT_MAGIC	0xedb88320		/* gpt.S */
   1105 
   1106 		/* values for bp_flags */
   1107 #define	X86_BP_FLAGS_RESET_VIDEO	1
   1108 #define	X86_BP_FLAGS_PASSWORD		2
   1109 #define	X86_BP_FLAGS_NOMODULES		4
   1110 #define	X86_BP_FLAGS_NOBOOTCONF		8
   1111 #define	X86_BP_FLAGS_LBA64VALID		0x10
   1112 
   1113 		/* values for bp_consdev */
   1114 #define	X86_BP_CONSDEV_PC	0
   1115 #define	X86_BP_CONSDEV_COM0	1
   1116 #define	X86_BP_CONSDEV_COM1	2
   1117 #define	X86_BP_CONSDEV_COM2	3
   1118 #define	X86_BP_CONSDEV_COM3	4
   1119 #define	X86_BP_CONSDEV_COM0KBD	5
   1120 #define	X86_BP_CONSDEV_COM1KBD	6
   1121 #define	X86_BP_CONSDEV_COM2KBD	7
   1122 #define	X86_BP_CONSDEV_COM3KBD	8
   1123 
   1124 /* ------------------------------------------
   1125  * landisk
   1126  */
   1127 
   1128 #if !defined(__ASSEMBLER__)					/* { */
   1129 
   1130 /*
   1131  * Parameters for NetBSD /boot written to start of pbr code by installboot
   1132  */
   1133 struct landisk_boot_params {
   1134 	uint32_t	bp_length;	/* length of patchable data */
   1135 	uint32_t	bp_flags;
   1136 	uint32_t	bp_timeout;	/* boot timeout in seconds */
   1137 	uint32_t	bp_consdev;
   1138 	uint32_t	bp_conspeed;
   1139 };
   1140 
   1141 #endif	/* !defined(__ASSEMBLER__) */				/* } */
   1142 
   1143 #define	LANDISK_BOOT_MAGIC_1	0x20031125
   1144 #define	LANDISK_BOOT_MAGIC_2	0x20041110
   1145 
   1146 #if !defined(__ASSEMBLER__)					/* { */
   1147 
   1148 /* ------------------------------------------
   1149  * macppc
   1150  */
   1151 
   1152 #define	MACPPC_BOOT_BLOCK_OFFSET	2048
   1153 #define	MACPPC_BOOT_BLOCK_BLOCKSIZE	512
   1154 #define	MACPPC_BOOT_BLOCK_MAX_SIZE	2048	/* XXX: could be up to 6144 */
   1155 	/* Magic string -- 32 bytes long (including the NUL) */
   1156 #define	MACPPC_BBINFO_MAGIC		"NetBSD/macppc bootxx   20020515"
   1157 
   1158 /* ------------------------------------------
   1159  * news68k, newsmips
   1160  */
   1161 
   1162 #define	NEWS_BOOT_BLOCK_LABELOFFSET	64 /* XXX from <machine/disklabel.h> */
   1163 #define	NEWS_BOOT_BLOCK_OFFSET		0
   1164 #define	NEWS_BOOT_BLOCK_BLOCKSIZE	512
   1165 #define	NEWS_BOOT_BLOCK_MAX_SIZE	(512 * 16)
   1166 
   1167 	/* Magic string -- 32 bytes long (including the NUL) */
   1168 #define	NEWS68K_BBINFO_MAGIC		"NetBSD/news68k bootxx  20020518"
   1169 #define	NEWSMIPS_BBINFO_MAGIC		"NetBSD/newsmips bootxx 20020518"
   1170 
   1171 /* ------------------------------------------
   1172  * next68k
   1173  */
   1174 
   1175 #define	NEXT68K_LABEL_MAXPARTITIONS	8	/* number of partitions in next68k_disklabel */
   1176 #define	NEXT68K_LABEL_CPULBLLEN		24
   1177 #define	NEXT68K_LABEL_MAXDNMLEN		24
   1178 #define	NEXT68K_LABEL_MAXTYPLEN		24
   1179 #define	NEXT68K_LABEL_MAXBFLEN		24
   1180 #define	NEXT68K_LABEL_MAXHNLEN		32
   1181 #define	NEXT68K_LABEL_MAXMPTLEN		16
   1182 #define	NEXT68K_LABEL_MAXFSTLEN		8
   1183 #define	NEXT68K_LABEL_NBAD		1670	/* sized to make label ~= 8KB */
   1184 
   1185 struct next68k_partition {
   1186 	int32_t	cp_offset;		/* starting sector */
   1187 	int32_t	cp_size;		/* number of sectors in partition */
   1188 	int16_t	cp_bsize;		/* block size in bytes */
   1189 	int16_t	cp_fsize;		/* filesystem basic fragment size */
   1190 	char	cp_opt;			/* optimization type: 's'pace/'t'ime */
   1191 	char	cp_pad1;
   1192 	int16_t	cp_cpg;			/* filesystem cylinders per group */
   1193 	int16_t	cp_density;		/* bytes per inode density */
   1194 	int8_t	cp_minfree;		/* minfree (%) */
   1195 	int8_t	cp_newfs;		/* run newfs during init */
   1196 	char	cp_mountpt[NEXT68K_LABEL_MAXMPTLEN];
   1197 					/* default/standard mount point */
   1198 	int8_t	cp_automnt;		/* auto-mount when inserted */
   1199 	char	cp_type[NEXT68K_LABEL_MAXFSTLEN]; /* file system type name */
   1200 	char	cp_pad2;
   1201 } __packed;
   1202 
   1203 /* The disklabel the way it is on the disk */
   1204 struct next68k_disklabel {
   1205 	int32_t	cd_version;		/* label version */
   1206 	int32_t	cd_label_blkno;		/* block # of this label */
   1207 	int32_t	cd_size;		/* size of media area (sectors) */
   1208 	char	cd_label[NEXT68K_LABEL_CPULBLLEN]; /* disk name (label) */
   1209 	uint32_t cd_flags;		/* flags */
   1210 	uint32_t cd_tag;		/* volume tag */
   1211 	char	cd_name[NEXT68K_LABEL_MAXDNMLEN]; /* drive (hardware) name */
   1212 	char	cd_type[NEXT68K_LABEL_MAXTYPLEN]; /* drive type */
   1213 	int32_t	cd_secsize;		/* # of bytes per sector */
   1214 	int32_t	cd_ntracks;		/* # of tracks per cylinder */
   1215 	int32_t	cd_nsectors;		/* # of data sectors per track */
   1216 	int32_t	cd_ncylinders;		/* # of data cylinders per unit */
   1217 	int32_t	cd_rpm;			/* rotational speed */
   1218 	int16_t	cd_front;		/* # of sectors in "front porch" */
   1219 	int16_t	cd_back;		/* # of sectors in "back porch" */
   1220 	int16_t	cd_ngroups;		/* # of alt groups */
   1221 	int16_t	cd_ag_size;		/* alt group size (sectors) */
   1222 	int16_t	cd_ag_alts;		/* alternate sectors / alt group */
   1223 	int16_t	cd_ag_off;		/* sector offset to first alternate */
   1224 	int32_t	cd_boot_blkno[2];	/* boot program locations */
   1225 	char	cd_kernel[NEXT68K_LABEL_MAXBFLEN]; /* default kernel name */
   1226 	char	cd_hostname[NEXT68K_LABEL_MAXHNLEN];
   1227 				/* host name (usu. where disk was labeled) */
   1228 	char	cd_rootpartition;	/* root partition letter e.g. 'a' */
   1229 	char	cd_rwpartition;		/* r/w partition letter e.g. 'b' */
   1230 	struct next68k_partition cd_partitions[NEXT68K_LABEL_MAXPARTITIONS];
   1231 
   1232 	union {
   1233 		uint16_t CD_v3_checksum; /* label version 3 checksum */
   1234 		int32_t	CD_bad[NEXT68K_LABEL_NBAD];
   1235 					/* block number that is bad */
   1236 	} cd_un;
   1237 	uint16_t cd_checksum;		/* label version 1 or 2 checksum */
   1238 } __packed;
   1239 
   1240 #define	NEXT68K_LABEL_cd_checksum	cd_checksum
   1241 #define	NEXT68K_LABEL_cd_v3_checksum	cd_un.CD_v3_checksum
   1242 #define	NEXT68K_LABEL_cd_bad		cd_un.CD_bad
   1243 
   1244 #define	NEXT68K_LABEL_SECTOR		0	/* sector containing label */
   1245 #define	NEXT68K_LABEL_OFFSET		0	/* offset of label in sector */
   1246 #define	NEXT68K_LABEL_SIZE		8192	/* size of label */
   1247 #define	NEXT68K_LABEL_CD_V1		0x4e655854 /* version #1: "NeXT" */
   1248 #define	NEXT68K_LABEL_CD_V2		0x646c5632 /* version #2: "dlV2" */
   1249 #define	NEXT68K_LABEL_CD_V3		0x646c5633 /* version #3: "dlV3" */
   1250 #define	NEXT68K_LABEL_DEFAULTFRONTPORCH	(160 * 2)
   1251 #define	NEXT68K_LABEL_DEFAULTBOOT0_1	(32 * 2)
   1252 #define	NEXT68K_LABEL_DEFAULTBOOT0_2	(96 * 2)
   1253 
   1254 /* ------------------------------------------
   1255  * pmax --
   1256  *	PMAX (DECstation / MIPS) boot block information
   1257  */
   1258 
   1259 /*
   1260  * If mode is 0, there is just one sequence of blocks and one Dec_BootMap
   1261  * is used.  If mode is 1, there are multiple sequences of blocks
   1262  * and multiple Dec_BootMaps are used, the last with numBlocks = 0.
   1263  */
   1264 struct pmax_boot_map {
   1265 	int32_t	num_blocks;		/* Number of blocks to read. */
   1266 	int32_t	start_block;		/* Starting block on disk. */
   1267 };
   1268 
   1269 /*
   1270  * This is the structure of a disk or tape boot block.  The boot_map
   1271  * can either be a single boot count and start block (contiguous mode)
   1272  * or a list of up to 61 (to fill a 512 byte sector) block count and
   1273  * start block pairs.  Under NetBSD, contiguous mode is always used.
   1274  */
   1275 struct pmax_boot_block {
   1276 	uint8_t		pad[8];
   1277 	int32_t		magic;			/* PMAX_BOOT_MAGIC */
   1278 	int32_t		mode;			/* Mode for boot info. */
   1279 	uint32_t	load_addr;		/* Address to start loading. */
   1280 	uint32_t	exec_addr;		/* Address to start execing. */
   1281 	struct		pmax_boot_map map[61];	/* boot program section(s). */
   1282 } __packed;
   1283 
   1284 #define	PMAX_BOOT_MAGIC			0x0002757a
   1285 #define	PMAX_BOOTMODE_CONTIGUOUS	0
   1286 #define	PMAX_BOOTMODE_SCATTERED		1
   1287 
   1288 #define	PMAX_BOOT_BLOCK_OFFSET		0
   1289 #define	PMAX_BOOT_BLOCK_BLOCKSIZE	512
   1290 
   1291 
   1292 /* ------------------------------------------
   1293  * sgimips
   1294  */
   1295 
   1296 /*
   1297  * Some IRIX man pages refer to the size being a multiple of whole cylinders.
   1298  * Later ones only refer to the size being "typically" 2MB.  IRIX fx(1)
   1299  * uses a default drive geometry if one can't be determined, suggesting
   1300  * that "whole cylinder" multiples are not required.
   1301  */
   1302 
   1303 #define SGI_BOOT_BLOCK_SIZE_VOLHDR	3135
   1304 #define SGI_BOOT_BLOCK_MAGIC		0xbe5a941
   1305 #define SGI_BOOT_BLOCK_MAXPARTITIONS	16
   1306 #define SGI_BOOT_BLOCK_MAXVOLDIRS	15
   1307 #define SGI_BOOT_BLOCK_BLOCKSIZE	512
   1308 
   1309 /*
   1310  * SGI partition conventions:
   1311  *
   1312  * Partition 0 - root
   1313  * Partition 1 - swap
   1314  * Partition 6 - usr
   1315  * Partition 7 - volume body
   1316  * Partition 8 - volume header
   1317  * Partition 10 - whole disk
   1318  */
   1319 
   1320 struct sgi_boot_devparms {
   1321 	uint8_t		dp_skew;
   1322 	uint8_t		dp_gap1;
   1323 	uint8_t		dp_gap2;
   1324 	uint8_t		dp_spares_cyl;
   1325 	uint16_t	dp_cyls;
   1326 	uint16_t	dp_shd0;
   1327 	uint16_t	dp_trks0;
   1328 	uint8_t		dp_ctq_depth;
   1329 	uint8_t		dp_cylshi;
   1330 	uint16_t	dp_unused;
   1331 	uint16_t	dp_secs;
   1332 	uint16_t	dp_secbytes;
   1333 	uint16_t	dp_interleave;
   1334 	uint32_t	dp_flags;
   1335 	uint32_t	dp_datarate;
   1336 	uint32_t	dp_nretries;
   1337 	uint32_t	dp_mspw;
   1338 	uint16_t	dp_xgap1;
   1339 	uint16_t	dp_xsync;
   1340 	uint16_t	dp_xrdly;
   1341 	uint16_t	dp_xgap2;
   1342 	uint16_t	dp_xrgate;
   1343 	uint16_t	dp_xwcont;
   1344 } __packed;
   1345 
   1346 struct sgi_boot_block {
   1347 	uint32_t	magic;
   1348 	int16_t		root;
   1349 	int16_t		swap;
   1350 	char		bootfile[16];
   1351 	struct sgi_boot_devparms dp;
   1352 	struct {
   1353 		char		name[8];
   1354 		int32_t		block;
   1355 		int32_t		bytes;
   1356 	}		voldir[SGI_BOOT_BLOCK_MAXVOLDIRS];
   1357 	struct {
   1358 		int32_t		blocks;
   1359 		int32_t		first;
   1360 		int32_t		type;
   1361 	}		partitions[SGI_BOOT_BLOCK_MAXPARTITIONS];
   1362 	int32_t		checksum;
   1363 	int32_t		_pad;
   1364 } __packed;
   1365 
   1366 #define SGI_PTYPE_VOLHDR	0
   1367 #define SGI_PTYPE_TRKREPL	1
   1368 #define SGI_PTYPE_SECREPL	2
   1369 #define SGI_PTYPE_RAW		3
   1370 #define SGI_PTYPE_BSD		4
   1371 #define SGI_PTYPE_SYSV		5
   1372 #define SGI_PTYPE_VOLUME	6
   1373 #define SGI_PTYPE_EFS		7
   1374 #define SGI_PTYPE_LVOL		8
   1375 #define SGI_PTYPE_RLVOL		9
   1376 #define SGI_PTYPE_XFS		10
   1377 #define SGI_PTYPE_XFSLOG	11
   1378 #define SGI_PTYPE_XLV		12
   1379 #define SGI_PTYPE_XVM		13
   1380 
   1381 /* ------------------------------------------
   1382  * sparc
   1383  */
   1384 
   1385 #define	SPARC_BOOT_BLOCK_OFFSET		512
   1386 #define	SPARC_BOOT_BLOCK_BLOCKSIZE	512
   1387 #define	SPARC_BOOT_BLOCK_MAX_SIZE	(512 * 15)
   1388 	/* Magic string -- 32 bytes long (including the NUL) */
   1389 #define	SPARC_BBINFO_MAGIC		"NetBSD/sparc bootxx    20020515"
   1390 
   1391 
   1392 /* ------------------------------------------
   1393  * sparc64
   1394  */
   1395 
   1396 #define	SPARC64_BOOT_BLOCK_OFFSET	512
   1397 #define	SPARC64_BOOT_BLOCK_BLOCKSIZE	512
   1398 #define	SPARC64_BOOT_BLOCK_MAX_SIZE	(512 * 15)
   1399 
   1400 
   1401 /* ------------------------------------------
   1402  * sun68k (sun2, sun3)
   1403  */
   1404 
   1405 #define	SUN68K_BOOT_BLOCK_OFFSET	512
   1406 #define	SUN68K_BOOT_BLOCK_BLOCKSIZE	512
   1407 #define	SUN68K_BOOT_BLOCK_MAX_SIZE	(512 * 15)
   1408 	/* Magic string -- 32 bytes long (including the NUL) */
   1409 #define	SUN68K_BBINFO_MAGIC		"NetBSD/sun68k bootxx   20020515"
   1410 
   1411 
   1412 /* ------------------------------------------
   1413  * vax --
   1414  *	VAX boot block information
   1415  */
   1416 
   1417 struct vax_boot_block {
   1418 /* Note that these don't overlap any of the pmax boot block */
   1419 	uint8_t		pad0[2];
   1420 	uint8_t		bb_id_offset;	/* offset in words to id (magic1)*/
   1421 	uint8_t		bb_mbone;	/* must be one */
   1422 	uint16_t	bb_lbn_hi;	/* lbn (hi word) of bootstrap */
   1423 	uint16_t	bb_lbn_low;	/* lbn (low word) of bootstrap */
   1424 	uint8_t		pad1[406];
   1425 	/* disklabel offset is 64 from base, or 56 from start of pad1 */
   1426 
   1427 	/* The rest of these fields are identification area and describe
   1428 	 * the secondary block for uVAX VMB.
   1429 	 */
   1430 	uint8_t		bb_magic1;	/* magic number */
   1431 	uint8_t		bb_mbz1;	/* must be zero */
   1432 	uint8_t		bb_pad1;	/* any value */
   1433 	uint8_t		bb_sum1;	/* ~(magic1 + mbz1 + pad1) */
   1434 
   1435 	uint8_t		bb_mbz2;	/* must be zero */
   1436 	uint8_t		bb_volinfo;	/* volinfo */
   1437 	uint8_t		bb_pad2a;	/* any value */
   1438 	uint8_t		bb_pad2b;	/* any value */
   1439 
   1440 	uint32_t	bb_size;	/* size in blocks of bootstrap */
   1441 	uint32_t	bb_load;	/* load offset to bootstrap */
   1442 	uint32_t	bb_entry;	/* byte offset in bootstrap */
   1443 	uint32_t	bb_sum3;	/* sum of previous 3 fields */
   1444 
   1445 	/* The rest is unused.
   1446 	 */
   1447 	uint8_t		pad2[74];
   1448 } __packed;
   1449 
   1450 #define	VAX_BOOT_MAGIC1			0x18	/* size of BB info? */
   1451 #define	VAX_BOOT_VOLINFO_NONE		0x00	/* no special info */
   1452 #define	VAX_BOOT_VOLINFO_SS		0x01	/* single sided */
   1453 #define	VAX_BOOT_VOLINFO_DS		0x81	/* double sided */
   1454 
   1455 #define	VAX_BOOT_SIZE			15	/* 15 blocks */
   1456 #define	VAX_BOOT_LOAD			0	/* no load offset */
   1457 #define	VAX_BOOT_ENTRY			0x200	/* one block in */
   1458 
   1459 #define	VAX_BOOT_BLOCK_OFFSET		0
   1460 #define	VAX_BOOT_BLOCK_BLOCKSIZE	512
   1461 
   1462 
   1463 /* ------------------------------------------
   1464  * x68k
   1465  */
   1466 
   1467 #define	X68K_BOOT_BLOCK_OFFSET		0
   1468 #define	X68K_BOOT_BLOCK_BLOCKSIZE	512
   1469 #define	X68K_BOOT_BLOCK_MAX_SIZE	(512 * 16)
   1470 	/* Magic string -- 32 bytes long (including the NUL) */
   1471 #define	X68K_BBINFO_MAGIC		"NetBSD/x68k bootxx     20020601"
   1472 
   1473 #endif	/* !defined(__ASSEMBLER__) */				/* } */
   1474 
   1475 #endif	/* !_SYS_BOOTBLOCK_H */
   1476