#ifndef _MACHINE_BIOSVAR_H_
#define _MACHINE_BIOSVAR_H_
#define BOOTARG_OFF (PAGE_SIZE * 2)
#define BOOTARG_LEN (PAGE_SIZE * 1)
#define BOOTBIOS_ADDR (0x7c00)
#define BOOTBIOS_MAXSEC ((1 << 28) - 1)
#define BIOSF_BIOS32 0x0001
#define BIOSF_PCIBIOS 0x0002
#define BIOSF_PROMSCAN 0x0004
#define BIOSF_SMBIOS 0x0008
#define BIOSM_F320K 0xff
#define BIOSM_F160K 0xfe
#define BIOSM_F360K 0xfd
#define BIOSM_F180K 0xfc
#define BIOSM_ROMD 0xfa
#define BIOSM_F120M 0xf9
#define BIOSM_F720K 0xf9
#define BIOSM_HD 0xf8
#define BIOSM_F144K 0xf0
#define BIOSM_OTHER 0xf0
#define BIOS_MAP_END 0x00
#define BIOS_MAP_FREE 0x01
#define BIOS_MAP_RES 0x02
#define BIOS_MAP_ACPI 0x03
#define BIOS_MAP_NVS 0x04
typedef
struct bios_romheader {
uint16_t signature;
uint8_t len;
uint32_t entry;
uint8_t reserved[19];
uint16_t pnpheader;
} __packed *bios_romheader_t;
typedef
struct bios32_header {
uint32_t signature;
uint32_t entry;
uint8_t rev;
uint8_t length;
uint8_t cksum;
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', '_')
#define BIOS_DEV 1
#define BIOS_DISKINFO 2
#define BIOS_CKSUMLEN 3
#define BIOS_MAXID 4
#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;
uint64_t size;
uint32_t type;
} __packed bios_memmap_t;
#define BOOTARG_DISKINFO 1
typedef struct _bios_diskinfo {
int bios_number;
u_int bios_cylinders;
u_int bios_heads;
u_int bios_sectors;
int bios_edd;
dev_t bsd_dev;
uint32_t checksum;
uint32_t flags;
#define BDI_INVALID 0x00000001
#define BDI_GOODLABEL 0x00000002
#define BDI_BADLABEL 0x00000004
#define BDI_EL_TORITO 0x00000008
#define BDI_HIBVALID 0x00000010
#define BDI_PICKED 0x80000000
} __packed bios_diskinfo_t;
#define BOOTARG_APMINFO 2
typedef struct _bios_apminfo {
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
#define BOOTARG_PCIINFO 4
typedef struct _bios_pciinfo {
uint32_t pci_chars;
uint32_t pci_rev;
uint32_t pci_entry32;
uint32_t pci_lastbus;
} __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
#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;
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 <machine/bus.h>
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);
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
#endif
#endif
#endif