1 /* $OpenBSD: biosvar.h,v 1.68 2019/08/04 14:28:58 kettenis Exp $ */ 2 3 /* 4 * Copyright (c) 1997-1999 Michael Shalayeff 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 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 OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 25 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26 * THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef _MACHINE_BIOSVAR_H_ 30 #define _MACHINE_BIOSVAR_H_ 31 32 /* some boxes put apm data seg in the 2nd page */ 33 #define BOOTARG_OFF (PAGE_SIZE * 2) 34 #define BOOTARG_LEN (PAGE_SIZE * 1) 35 #define BOOTBIOS_ADDR (0x7c00) 36 #define BOOTBIOS_MAXSEC ((1 << 28) - 1) 37 38 /* BIOS configure flags */ 39 #define BIOSF_BIOS32 0x0001 40 #define BIOSF_PCIBIOS 0x0002 41 #define BIOSF_PROMSCAN 0x0004 42 #define BIOSF_SMBIOS 0x0008 43 44 /* BIOS media ID */ 45 #define BIOSM_F320K 0xff /* floppy ds/sd 8 spt */ 46 #define BIOSM_F160K 0xfe /* floppy ss/sd 8 spt */ 47 #define BIOSM_F360K 0xfd /* floppy ds/sd 9 spt */ 48 #define BIOSM_F180K 0xfc /* floppy ss/sd 9 spt */ 49 #define BIOSM_ROMD 0xfa /* ROM disk */ 50 #define BIOSM_F120M 0xf9 /* floppy ds/hd 15 spt 5.25" */ 51 #define BIOSM_F720K 0xf9 /* floppy ds/dd 9 spt 3.50" */ 52 #define BIOSM_HD 0xf8 /* hard drive */ 53 #define BIOSM_F144K 0xf0 /* floppy ds/hd 18 spt 3.50" */ 54 #define BIOSM_OTHER 0xf0 /* any other */ 55 56 /* 57 * BIOS memory maps 58 */ 59 #define BIOS_MAP_END 0x00 /* End of array XXX - special */ 60 #define BIOS_MAP_FREE 0x01 /* Usable memory */ 61 #define BIOS_MAP_RES 0x02 /* Reserved memory */ 62 #define BIOS_MAP_ACPI 0x03 /* ACPI Reclaim memory */ 63 #define BIOS_MAP_NVS 0x04 /* ACPI NVS memory */ 64 65 /* 66 * Optional ROM header 67 */ 68 typedef 69 struct bios_romheader { 70 uint16_t signature; /* 0xaa55 */ 71 uint8_t len; /* length in pages (512 bytes) */ 72 uint32_t entry; /* initialization entry point */ 73 uint8_t reserved[19]; 74 uint16_t pnpheader; /* offset to PnP expansion header */ 75 } __packed *bios_romheader_t; 76 77 /* 78 * BIOS32 79 */ 80 typedef 81 struct bios32_header { 82 uint32_t signature; /* 00: signature "_32_" */ 83 uint32_t entry; /* 04: entry point */ 84 uint8_t rev; /* 08: revision */ 85 uint8_t length; /* 09: header length */ 86 uint8_t cksum; /* 0a: modulo 256 checksum */ 87 uint8_t reserved[5]; 88 } __packed *bios32_header_t; 89 90 typedef 91 struct bios32_entry_info { 92 uint32_t bei_base; 93 uint32_t bei_size; 94 uint32_t bei_entry; 95 } __packed *bios32_entry_info_t; 96 97 typedef 98 struct bios32_entry { 99 uint32_t offset; 100 uint16_t segment; 101 } __packed *bios32_entry_t; 102 103 #define BIOS32_START 0xe0000 104 #define BIOS32_SIZE 0x20000 105 #define BIOS32_END (BIOS32_START + BIOS32_SIZE - 0x10) 106 107 #define BIOS32_MAKESIG(a, b, c, d) \ 108 ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24)) 109 #define BIOS32_SIGNATURE BIOS32_MAKESIG('_', '3', '2', '_') 110 #define PCIBIOS_SIGNATURE BIOS32_MAKESIG('$', 'P', 'C', 'I') 111 #define SMBIOS_SIGNATURE BIOS32_MAKESIG('_', 'S', 'M', '_') 112 113 /* 114 * CTL_BIOS definitions. 115 */ 116 #define BIOS_DEV 1 /* int: BIOS boot device */ 117 #define BIOS_DISKINFO 2 /* struct: BIOS boot device info */ 118 #define BIOS_CKSUMLEN 3 /* int: disk cksum block count */ 119 #define BIOS_MAXID 4 /* number of valid machdep ids */ 120 121 #define CTL_BIOS_NAMES { \ 122 { 0, 0 }, \ 123 { "biosdev", CTLTYPE_INT }, \ 124 { "diskinfo", CTLTYPE_STRUCT }, \ 125 { "cksumlen", CTLTYPE_INT }, \ 126 } 127 128 #define BOOTARG_MEMMAP 0 129 typedef struct _bios_memmap { 130 uint64_t addr; /* Beginning of block */ 131 uint64_t size; /* Size of block */ 132 uint32_t type; /* Type of block */ 133 } __packed bios_memmap_t; 134 135 /* Info about disk from the bios, plus the mapping from 136 * BIOS numbers to BSD major (driver?) number. 137 * 138 * Also, do not bother with BIOSN*() macros, just parcel 139 * the info out, and use it like this. This makes for less 140 * of a dependence on BIOSN*() macros having to be the same 141 * across /boot, /bsd, and userland. 142 */ 143 #define BOOTARG_DISKINFO 1 144 typedef struct _bios_diskinfo { 145 /* BIOS section */ 146 int bios_number; /* BIOS number of drive (or -1) */ 147 u_int bios_cylinders; /* BIOS cylinders */ 148 u_int bios_heads; /* BIOS heads */ 149 u_int bios_sectors; /* BIOS sectors */ 150 int bios_edd; /* EDD support */ 151 152 /* BSD section */ 153 dev_t bsd_dev; /* BSD device */ 154 155 /* Checksum section */ 156 uint32_t checksum; /* Checksum for drive */ 157 158 /* Misc. flags */ 159 uint32_t flags; 160 #define BDI_INVALID 0x00000001 /* I/O error during checksumming */ 161 #define BDI_GOODLABEL 0x00000002 /* Had SCSI or ST506/ESDI disklabel */ 162 #define BDI_BADLABEL 0x00000004 /* Had another disklabel */ 163 #define BDI_EL_TORITO 0x00000008 /* 2,048-byte sectors */ 164 #define BDI_HIBVALID 0x00000010 /* hibernate signature valid */ 165 #define BDI_PICKED 0x80000000 /* kernel-only: cksum matched */ 166 167 } __packed bios_diskinfo_t; 168 169 #define BOOTARG_APMINFO 2 170 typedef struct _bios_apminfo { 171 /* APM_CONNECT returned values */ 172 u_int apm_detail; 173 u_int apm_code32_base; 174 u_int apm_code16_base; 175 u_int apm_code_len; 176 u_int apm_data_base; 177 u_int apm_data_len; 178 u_int apm_entry; 179 u_int apm_code16_len; 180 } __packed bios_apminfo_t; 181 182 #define BOOTARG_CKSUMLEN 3 /* uint32_t */ 183 184 #define BOOTARG_PCIINFO 4 185 typedef struct _bios_pciinfo { 186 /* PCI BIOS v2.0+ - Installation check values */ 187 uint32_t pci_chars; /* Characteristics (%eax) */ 188 uint32_t pci_rev; /* BCD Revision (%ebx) */ 189 uint32_t pci_entry32; /* PM entry point for PCI BIOS */ 190 uint32_t pci_lastbus; /* Number of last PCI bus */ 191 } __packed bios_pciinfo_t; 192 193 #define BOOTARG_CONSDEV 5 194 typedef struct _bios_consdev { 195 dev_t consdev; 196 int conspeed; 197 int consaddr; 198 int consfreq; 199 } __packed bios_consdev_t; 200 201 #define BOOTARG_SMPINFO 6 /* struct mp_float[] */ 202 203 #define BOOTARG_BOOTMAC 7 204 typedef struct _bios_bootmac { 205 char mac[6]; 206 } __packed bios_bootmac_t; 207 208 #define BOOTARG_DDB 8 209 typedef struct _bios_ddb { 210 int db_console; 211 } __packed bios_ddb_t; 212 213 #define BOOTARG_BOOTDUID 9 214 typedef struct _bios_bootduid { 215 u_char duid[8]; 216 } __packed bios_bootduid_t; 217 218 #define BOOTARG_BOOTSR 10 219 #define BOOTSR_UUID_MAX 16 220 #define BOOTSR_CRYPTO_MAXKEYBYTES 32 221 typedef struct _bios_bootsr { 222 uint8_t uuid[BOOTSR_UUID_MAX]; 223 uint8_t maskkey[BOOTSR_CRYPTO_MAXKEYBYTES]; 224 } __packed bios_bootsr_t; 225 226 #define BOOTARG_EFIINFO 11 227 typedef struct _bios_efiinfo { 228 uint64_t config_acpi; 229 uint64_t config_smbios; 230 uint64_t fb_addr; 231 uint64_t fb_size; 232 uint32_t fb_height; 233 uint32_t fb_width; 234 uint32_t fb_pixpsl; /* pixels per scan line */ 235 uint32_t fb_red_mask; 236 uint32_t fb_green_mask; 237 uint32_t fb_blue_mask; 238 uint32_t fb_reserved_mask; 239 } __packed bios_efiinfo_t; 240 241 #define BOOTARG_UCODE 12 242 typedef struct _bios_ucode { 243 uint64_t uc_addr; 244 uint64_t uc_size; 245 } __packed bios_ucode_t; 246 247 #if defined(_KERNEL) || defined (_STANDALONE) 248 249 #ifdef _LOCORE 250 #define DOINT(n) int $0x20+(n) 251 #else 252 #define DOINT(n) "int $0x20+(" #n ")" 253 254 extern volatile struct BIOS_regs { 255 uint32_t biosr_ax; 256 uint32_t biosr_cx; 257 uint32_t biosr_dx; 258 uint32_t biosr_bx; 259 uint32_t biosr_bp; 260 uint32_t biosr_si; 261 uint32_t biosr_di; 262 uint32_t biosr_ds; 263 uint32_t biosr_es; 264 } __packed BIOS_regs; 265 266 #ifdef _KERNEL 267 #include <machine/bus.h> 268 269 struct bios_attach_args { 270 char *ba_name; 271 u_int ba_func; 272 bus_space_tag_t ba_iot; 273 bus_space_tag_t ba_memt; 274 union { 275 void *_p; 276 bios_apminfo_t *_ba_apmp; 277 paddr_t _ba_acpipbase; 278 } _; 279 }; 280 281 #define ba_apmp _._ba_apmp 282 #define ba_acpipbase _._ba_acpipbase 283 284 struct consdev; 285 struct proc; 286 287 int bios_sysctl(int *, u_int, void *, size_t *, void *, size_t, struct proc *); 288 289 void bios_getopt(void); 290 291 /* bios32.c */ 292 int bios32_service(uint32_t, bios32_entry_t, bios32_entry_info_t); 293 void bios32_cleanup(void); 294 295 extern u_int bootapiver; 296 extern bios_memmap_t *bios_memmap; 297 extern bios_efiinfo_t *bios_efiinfo; 298 extern bios_ucode_t *bios_ucode; 299 extern void *bios_smpinfo; 300 extern bios_pciinfo_t *bios_pciinfo; 301 302 #endif /* _KERNEL */ 303 #endif /* _LOCORE */ 304 #endif /* _KERNEL || _STANDALONE */ 305 306 #endif /* _MACHINE_BIOSVAR_H_ */ 307