1 /* $NetBSD: bootinfo.h,v 1.31 2022/08/20 23:12:00 riastradh Exp $ */ 2 3 /* 4 * Copyright (c) 1997 5 * Matthias Drochner. 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 AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 */ 28 29 #ifndef _X86_BOOTINFO_H_ 30 #define _X86_BOOTINFO_H_ 31 32 #define BTINFO_BOOTPATH 0 33 #define BTINFO_ROOTDEVICE 1 34 #define BTINFO_BOOTDISK 3 35 #define BTINFO_NETIF 4 36 #define BTINFO_CONSOLE 6 37 #define BTINFO_BIOSGEOM 7 38 #define BTINFO_SYMTAB 8 39 #define BTINFO_MEMMAP 9 40 #define BTINFO_BOOTWEDGE 10 41 #define BTINFO_MODULELIST 11 42 #define BTINFO_FRAMEBUFFER 12 43 #define BTINFO_USERCONFCOMMANDS 13 44 #define BTINFO_EFI 14 45 #define BTINFO_EFIMEMMAP 15 46 #define BTINFO_PREKERN 16 47 48 #define BTINFO_STR "bootpath", "rootdevice", "bootdisk", "netif", \ 49 "console", "biosgeom", "symtab", "memmap", "bootwedge", "modulelist", \ 50 "framebuffer", "userconfcommands", "efi", "efimemmap", "prekern", 51 52 #ifndef _LOCORE 53 54 struct btinfo_common { 55 int len; 56 int type; 57 }; 58 59 struct btinfo_bootpath { 60 struct btinfo_common common; 61 char bootpath[80]; 62 }; 63 64 struct btinfo_rootdevice { 65 struct btinfo_common common; 66 char devname[16]; 67 }; 68 69 struct btinfo_bootdisk { 70 struct btinfo_common common; 71 int labelsector; /* label valid if != -1 */ 72 struct { 73 uint16_t type, checksum; 74 char packname[16]; 75 } label; 76 int biosdev; 77 int partition; 78 }; 79 80 struct btinfo_bootwedge { 81 struct btinfo_common common; 82 int biosdev; 83 daddr_t startblk; 84 uint64_t nblks; 85 daddr_t matchblk; 86 uint64_t matchnblks; 87 uint8_t matchhash[16]; /* MD5 hash */ 88 } __packed; 89 90 struct btinfo_netif { 91 struct btinfo_common common; 92 char ifname[16]; 93 int bus; 94 #define BI_BUS_ISA 0 95 #define BI_BUS_PCI 1 96 union { 97 unsigned int iobase; /* ISA */ 98 unsigned int tag; /* PCI, BIOS format */ 99 } addr; 100 }; 101 102 struct btinfo_console { 103 struct btinfo_common common; 104 char devname[16]; 105 int addr; 106 int speed; 107 }; 108 109 struct btinfo_symtab { 110 struct btinfo_common common; 111 int nsym; 112 int ssym; 113 int esym; 114 }; 115 116 struct bi_memmap_entry { 117 uint64_t addr; /* beginning of block */ /* 8 */ 118 uint64_t size; /* size of block */ /* 8 */ 119 uint32_t type; /* type of block */ /* 4 */ 120 } __packed; /* == 20 */ 121 122 #define BIM_Memory 1 /* available RAM usable by OS */ 123 #define BIM_Reserved 2 /* in use or reserved by the system */ 124 #define BIM_ACPI 3 /* ACPI Reclaim memory */ 125 #define BIM_NVS 4 /* ACPI NVS memory */ 126 #define BIM_Unusable 5 /* errors have been detected */ 127 #define BIM_Disabled 6 /* not enabled */ 128 #define BIM_PMEM 7 /* Persistent memory */ 129 #define BIM_PRAM 12 /* legacy NVDIMM (OEM defined) */ 130 131 struct btinfo_memmap { 132 struct btinfo_common common; 133 int num; 134 struct bi_memmap_entry entry[1]; /* var len */ 135 }; 136 137 #if HAVE_NBTOOL_CONFIG_H 138 #include <nbinclude/sys/bootblock.h> 139 #else 140 #include <sys/bootblock.h> 141 #endif /* HAVE_NBTOOL_CONFIG_H */ 142 143 /* 144 * Structure describing disk info as seen by the BIOS. 145 */ 146 struct bi_biosgeom_entry { 147 int sec, head, cyl; /* geometry */ 148 uint64_t totsec; /* LBA sectors from ext int13 */ 149 int flags, dev; /* flags, BIOS device # */ 150 #define BI_GEOM_INVALID 0x000001 151 #define BI_GEOM_EXTINT13 0x000002 152 #ifdef BIOSDISK_EXTINFO_V3 153 #define BI_GEOM_BADCKSUM 0x000004 /* v3.x checksum invalid */ 154 #define BI_GEOM_BUS_MASK 0x00ff00 /* connecting bus type */ 155 #define BI_GEOM_BUS_ISA 0x000100 156 #define BI_GEOM_BUS_PCI 0x000200 157 #define BI_GEOM_BUS_OTHER 0x00ff00 158 #define BI_GEOM_IFACE_MASK 0xff0000 /* interface type */ 159 #define BI_GEOM_IFACE_ATA 0x010000 160 #define BI_GEOM_IFACE_ATAPI 0x020000 161 #define BI_GEOM_IFACE_SCSI 0x030000 162 #define BI_GEOM_IFACE_USB 0x040000 163 #define BI_GEOM_IFACE_1394 0x050000 /* Firewire */ 164 #define BI_GEOM_IFACE_FIBRE 0x060000 /* Fibre channel */ 165 #define BI_GEOM_IFACE_OTHER 0xff0000 166 unsigned int cksum; /* MBR checksum */ 167 unsigned int interface_path; /* ISA iobase PCI bus/dev/fun */ 168 uint64_t device_path; 169 int res0; /* future expansion; 0 now */ 170 #else 171 unsigned int cksum; /* MBR checksum */ 172 int res0, res1, res2, res3; /* future expansion; 0 now */ 173 #endif 174 struct mbr_partition mbrparts[MBR_PART_COUNT]; /* MBR itself */ 175 } __packed; 176 177 struct btinfo_biosgeom { 178 struct btinfo_common common; 179 int num; 180 struct bi_biosgeom_entry disk[1]; /* var len */ 181 }; 182 183 struct bi_modulelist_entry { 184 char path[80]; 185 int type; 186 int len; 187 uint32_t base; 188 }; 189 #define BI_MODULE_NONE 0x00 190 #define BI_MODULE_ELF 0x01 191 #define BI_MODULE_IMAGE 0x02 192 #define BI_MODULE_RND 0x03 193 #define BI_MODULE_FS 0x04 194 195 struct btinfo_modulelist { 196 struct btinfo_common common; 197 int num; 198 uint32_t endpa; 199 /* bi_modulelist_entry list follows */ 200 }; 201 202 struct btinfo_framebuffer { 203 struct btinfo_common common; 204 uint64_t physaddr; 205 uint32_t flags; 206 uint32_t width; 207 uint32_t height; 208 uint16_t stride; 209 uint8_t depth; 210 uint8_t rnum; 211 uint8_t gnum; 212 uint8_t bnum; 213 uint8_t rpos; 214 uint8_t gpos; 215 uint8_t bpos; 216 uint16_t vbemode; 217 uint8_t reserved[14]; 218 }; 219 220 struct bi_userconfcommand { 221 char text[80]; 222 }; 223 224 struct btinfo_userconfcommands { 225 struct btinfo_common common; 226 int num; 227 /* bi_userconfcommand list follows */ 228 }; 229 230 /* EFI Information */ 231 struct btinfo_efi { 232 struct btinfo_common common; 233 uint64_t systblpa; /* Physical address of the EFI System Table */ 234 uint32_t flags; 235 #define BI_EFI_32BIT __BIT(0) /* 32bit UEFI */ 236 uint8_t reserved[12]; 237 }; 238 239 struct btinfo_prekern { 240 struct btinfo_common common; 241 uint32_t kernpa_start; 242 uint32_t kernpa_end; 243 }; 244 245 struct btinfo_efimemmap { 246 struct btinfo_common common; 247 uint32_t num; /* number of memory descriptor */ 248 uint32_t version; /* version of memory descriptor */ 249 uint32_t size; /* size of memory descriptor */ 250 uint8_t memmap[1]; /* whole memory descriptors */ 251 }; 252 253 #endif /* _LOCORE */ 254 255 #ifdef _KERNEL 256 257 #define BOOTINFO_MAXSIZE 16384 258 259 #ifndef _LOCORE 260 /* 261 * Structure that holds the information passed by the boot loader. 262 */ 263 struct bootinfo { 264 /* Number of bootinfo_* entries in bi_data. */ 265 uint32_t bi_nentries; 266 267 /* Raw data of bootinfo entries. The first one (if any) is 268 * found at bi_data[0] and can be casted to (bootinfo_common *). 269 * Once this is done, the following entry is found at 'len' 270 * offset as specified by the previous entry. */ 271 uint8_t bi_data[BOOTINFO_MAXSIZE - sizeof(uint32_t)]; 272 }; 273 274 extern struct bootinfo bootinfo; 275 276 void *lookup_bootinfo(int); 277 void aprint_bootinfo(void); 278 #endif /* _LOCORE */ 279 280 #endif /* _KERNEL */ 281 282 #endif /* _X86_BOOTINFO_H_ */ 283