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