/* $OpenBSD: biosvar.h,v 1.68 2019/08/04 14:28:58 kettenis Exp $ */ /* * Copyright (c) 1997-1999 Michael Shalayeff * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _MACHINE_BIOSVAR_H_ #define _MACHINE_BIOSVAR_H_ /* some boxes put apm data seg in the 2nd page */ #define BOOTARG_OFF (PAGE_SIZE * 2) #define BOOTARG_LEN (PAGE_SIZE * 1) #define BOOTBIOS_ADDR (0x7c00) #define BOOTBIOS_MAXSEC ((1 << 28) - 1) /* BIOS configure flags */ #define BIOSF_BIOS32 0x0001 #define BIOSF_PCIBIOS 0x0002 #define BIOSF_PROMSCAN 0x0004 #define BIOSF_SMBIOS 0x0008 /* BIOS media ID */ #define BIOSM_F320K 0xff /* floppy ds/sd 8 spt */ #define BIOSM_F160K 0xfe /* floppy ss/sd 8 spt */ #define BIOSM_F360K 0xfd /* floppy ds/sd 9 spt */ #define BIOSM_F180K 0xfc /* floppy ss/sd 9 spt */ #define BIOSM_ROMD 0xfa /* ROM disk */ #define BIOSM_F120M 0xf9 /* floppy ds/hd 15 spt 5.25" */ #define BIOSM_F720K 0xf9 /* floppy ds/dd 9 spt 3.50" */ #define BIOSM_HD 0xf8 /* hard drive */ #define BIOSM_F144K 0xf0 /* floppy ds/hd 18 spt 3.50" */ #define BIOSM_OTHER 0xf0 /* any other */ /* * BIOS memory maps */ #define BIOS_MAP_END 0x00 /* End of array XXX - special */ #define BIOS_MAP_FREE 0x01 /* Usable memory */ #define BIOS_MAP_RES 0x02 /* Reserved memory */ #define BIOS_MAP_ACPI 0x03 /* ACPI Reclaim memory */ #define BIOS_MAP_NVS 0x04 /* ACPI NVS memory */ /* * Optional ROM header */ typedef struct bios_romheader { uint16_t signature; /* 0xaa55 */ uint8_t len; /* length in pages (512 bytes) */ uint32_t entry; /* initialization entry point */ uint8_t reserved[19]; uint16_t pnpheader; /* offset to PnP expansion header */ } __packed *bios_romheader_t; /* * BIOS32 */ typedef struct bios32_header { uint32_t signature; /* 00: signature "_32_" */ uint32_t entry; /* 04: entry point */ uint8_t rev; /* 08: revision */ uint8_t length; /* 09: header length */ uint8_t cksum; /* 0a: modulo 256 checksum */ uint8_t reserved[5]; } __packed *bios32_header_t; typedef struct bios32_entry_info { uint32_t bei_base; uint32_t bei_size; uint32_t bei_entry; } __packed *bios32_entry_info_t; typedef struct bios32_entry { uint32_t offset; uint16_t segment; } __packed *bios32_entry_t; #define BIOS32_START 0xe0000 #define BIOS32_SIZE 0x20000 #define BIOS32_END (BIOS32_START + BIOS32_SIZE - 0x10) #define BIOS32_MAKESIG(a, b, c, d) \ ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24)) #define BIOS32_SIGNATURE BIOS32_MAKESIG('_', '3', '2', '_') #define PCIBIOS_SIGNATURE BIOS32_MAKESIG('$', 'P', 'C', 'I') #define SMBIOS_SIGNATURE BIOS32_MAKESIG('_', 'S', 'M', '_') /* * CTL_BIOS definitions. */ #define BIOS_DEV 1 /* int: BIOS boot device */ #define BIOS_DISKINFO 2 /* struct: BIOS boot device info */ #define BIOS_CKSUMLEN 3 /* int: disk cksum block count */ #define BIOS_MAXID 4 /* number of valid machdep ids */ #define CTL_BIOS_NAMES { \ { 0, 0 }, \ { "biosdev", CTLTYPE_INT }, \ { "diskinfo", CTLTYPE_STRUCT }, \ { "cksumlen", CTLTYPE_INT }, \ } #define BOOTARG_MEMMAP 0 typedef struct _bios_memmap { uint64_t addr; /* Beginning of block */ uint64_t size; /* Size of block */ uint32_t type; /* Type of block */ } __packed bios_memmap_t; /* Info about disk from the bios, plus the mapping from * BIOS numbers to BSD major (driver?) number. * * Also, do not bother with BIOSN*() macros, just parcel * the info out, and use it like this. This makes for less * of a dependence on BIOSN*() macros having to be the same * across /boot, /bsd, and userland. */ #define BOOTARG_DISKINFO 1 typedef struct _bios_diskinfo { /* BIOS section */ int bios_number; /* BIOS number of drive (or -1) */ u_int bios_cylinders; /* BIOS cylinders */ u_int bios_heads; /* BIOS heads */ u_int bios_sectors; /* BIOS sectors */ int bios_edd; /* EDD support */ /* BSD section */ dev_t bsd_dev; /* BSD device */ /* Checksum section */ uint32_t checksum; /* Checksum for drive */ /* Misc. flags */ uint32_t flags; #define BDI_INVALID 0x00000001 /* I/O error during checksumming */ #define BDI_GOODLABEL 0x00000002 /* Had SCSI or ST506/ESDI disklabel */ #define BDI_BADLABEL 0x00000004 /* Had another disklabel */ #define BDI_EL_TORITO 0x00000008 /* 2,048-byte sectors */ #define BDI_HIBVALID 0x00000010 /* hibernate signature valid */ #define BDI_PICKED 0x80000000 /* kernel-only: cksum matched */ } __packed bios_diskinfo_t; #define BOOTARG_APMINFO 2 typedef struct _bios_apminfo { /* APM_CONNECT returned values */ u_int apm_detail; u_int apm_code32_base; u_int apm_code16_base; u_int apm_code_len; u_int apm_data_base; u_int apm_data_len; u_int apm_entry; u_int apm_code16_len; } __packed bios_apminfo_t; #define BOOTARG_CKSUMLEN 3 /* uint32_t */ #define BOOTARG_PCIINFO 4 typedef struct _bios_pciinfo { /* PCI BIOS v2.0+ - Installation check values */ uint32_t pci_chars; /* Characteristics (%eax) */ uint32_t pci_rev; /* BCD Revision (%ebx) */ uint32_t pci_entry32; /* PM entry point for PCI BIOS */ uint32_t pci_lastbus; /* Number of last PCI bus */ } __packed bios_pciinfo_t; #define BOOTARG_CONSDEV 5 typedef struct _bios_consdev { dev_t consdev; int conspeed; int consaddr; int consfreq; } __packed bios_consdev_t; #define BOOTARG_SMPINFO 6 /* struct mp_float[] */ #define BOOTARG_BOOTMAC 7 typedef struct _bios_bootmac { char mac[6]; } __packed bios_bootmac_t; #define BOOTARG_DDB 8 typedef struct _bios_ddb { int db_console; } __packed bios_ddb_t; #define BOOTARG_BOOTDUID 9 typedef struct _bios_bootduid { u_char duid[8]; } __packed bios_bootduid_t; #define BOOTARG_BOOTSR 10 #define BOOTSR_UUID_MAX 16 #define BOOTSR_CRYPTO_MAXKEYBYTES 32 typedef struct _bios_bootsr { uint8_t uuid[BOOTSR_UUID_MAX]; uint8_t maskkey[BOOTSR_CRYPTO_MAXKEYBYTES]; } __packed bios_bootsr_t; #define BOOTARG_EFIINFO 11 typedef struct _bios_efiinfo { uint64_t config_acpi; uint64_t config_smbios; uint64_t fb_addr; uint64_t fb_size; uint32_t fb_height; uint32_t fb_width; uint32_t fb_pixpsl; /* pixels per scan line */ uint32_t fb_red_mask; uint32_t fb_green_mask; uint32_t fb_blue_mask; uint32_t fb_reserved_mask; } __packed bios_efiinfo_t; #define BOOTARG_UCODE 12 typedef struct _bios_ucode { uint64_t uc_addr; uint64_t uc_size; } __packed bios_ucode_t; #if defined(_KERNEL) || defined (_STANDALONE) #ifdef _LOCORE #define DOINT(n) int $0x20+(n) #else #define DOINT(n) "int $0x20+(" #n ")" extern volatile struct BIOS_regs { uint32_t biosr_ax; uint32_t biosr_cx; uint32_t biosr_dx; uint32_t biosr_bx; uint32_t biosr_bp; uint32_t biosr_si; uint32_t biosr_di; uint32_t biosr_ds; uint32_t biosr_es; } __packed BIOS_regs; #ifdef _KERNEL #include struct bios_attach_args { char *ba_name; u_int ba_func; bus_space_tag_t ba_iot; bus_space_tag_t ba_memt; union { void *_p; bios_apminfo_t *_ba_apmp; paddr_t _ba_acpipbase; } _; }; #define ba_apmp _._ba_apmp #define ba_acpipbase _._ba_acpipbase struct consdev; struct proc; int bios_sysctl(int *, u_int, void *, size_t *, void *, size_t, struct proc *); void bios_getopt(void); /* bios32.c */ int bios32_service(uint32_t, bios32_entry_t, bios32_entry_info_t); void bios32_cleanup(void); extern u_int bootapiver; extern bios_memmap_t *bios_memmap; extern bios_efiinfo_t *bios_efiinfo; extern bios_ucode_t *bios_ucode; extern void *bios_smpinfo; extern bios_pciinfo_t *bios_pciinfo; #endif /* _KERNEL */ #endif /* _LOCORE */ #endif /* _KERNEL || _STANDALONE */ #endif /* _MACHINE_BIOSVAR_H_ */