diff options
author | msmith <msmith@FreeBSD.org> | 1999-07-29 01:49:19 +0000 |
---|---|---|
committer | msmith <msmith@FreeBSD.org> | 1999-07-29 01:49:19 +0000 |
commit | e495b00d19aaf17fae0a67881fa9bbc27f42f10b (patch) | |
tree | 16887357d8f31adc150c8ac0f20f758b5a8bfcdf /sys/amd64/include | |
parent | 0cee2525fa4800b488630501d295a4700c050a81 (diff) | |
download | FreeBSD-src-e495b00d19aaf17fae0a67881fa9bbc27f42f10b.zip FreeBSD-src-e495b00d19aaf17fae0a67881fa9bbc27f42f10b.tar.gz |
Major update to the kernel's BIOS-calling ability.
- Add support for calling 32-bit code in other segments
- Add support for calling 16-bit protected mode code
Update APM to use this facility.
Submitted by: jlemon
Diffstat (limited to 'sys/amd64/include')
-rw-r--r-- | sys/amd64/include/pc/bios.h | 88 | ||||
-rw-r--r-- | sys/amd64/include/segments.h | 12 |
2 files changed, 82 insertions, 18 deletions
diff --git a/sys/amd64/include/pc/bios.h b/sys/amd64/include/pc/bios.h index 4e47eae..0c88a4d 100644 --- a/sys/amd64/include/pc/bios.h +++ b/sys/amd64/include/pc/bios.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 1997 Michael Smith + * Copyright (c) 1998 Jonathan Lemon * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bios.h,v 1.1 1997/08/01 06:04:59 msmith Exp $ + * $Id: bios.h,v 1.2 1997/08/04 03:31:23 msmith Exp $ */ /* @@ -59,17 +60,6 @@ extern int bios32_SDlookup(struct bios32_SDentry *ent); extern u_int32_t bios_sigsearch(u_int32_t start, u_char *sig, int siglen, int paralen, int sigofs); -/* - * Call a 32-bit BIOS function - */ -struct bios32_args { - u_long eax; - u_long ebx; - u_long ecx; - u_long edx; -}; -extern void bios32(caddr_t func_addr, struct bios32_args *args); - #define BIOS_PADDRTOVADDR(x) (((x) - ISA_HOLE_START) + atdevbase) #define BIOS_VADDRTOPADDR(x) (((x) - atdevbase) + ISA_HOLE_START) @@ -108,5 +98,77 @@ extern struct bios32_SDentry PCIbios; extern struct SMBIOS_table *SMBIOS_table; extern struct DMI_table *DMI_table; +struct segment_info { + u_int base; + u_int limit; +}; + +#define BIOSCODE_FLAG 0x01 +#define BIOSDATA_FLAG 0x02 +#define BIOSUTIL_FLAG 0x04 +#define BIOSARGS_FLAG 0x08 + +struct bios_segments { + u_int generation; + struct segment_info code32; /* 32-bit code (mandatory) */ + struct segment_info code16; /* 16-bit code */ + struct segment_info data; /* 16-bit data */ + struct segment_info util; /* 16-bit utility */ + struct segment_info args; /* 16-bit args */ +}; + +struct bios_regs { + u_int eax; + u_int ebx; + u_int ecx; + u_int edx; + u_int esi; + u_int edi; +}; + +struct bios_args { + u_int entry; /* entry point of routine */ + struct bios_regs r; + struct bios_segments seg; +}; + +/* + * format specifiers and defines for bios16() + * s = short (16 bits) + * i = int (32 bits) + * p = pointer (converted to seg:offset) + * C,D,U = selector (corresponding to code/data/utility segment) + */ +#define PNP_COUNT_DEVNODES "sppD", 0x00 +#define PNP_GET_DEVNODE "sppsD", 0x01 +#define PNP_SET_DEVNODE "sppsD", 0x02 +#define PNP_GET_EVENT "spD", 0x03 +#define PNP_SEND_MSG "ssD", 0x04 +#define PNP_GET_DOCK_INFO "spD", 0x05 + +#define PNP_SEL_PRIBOOT "ssiiisspD", 0x07 +#define PNP_GET_PRIBOOT "sspppppD", 0x08 +#define PNP_SET_RESINFO "spD", 0x09 +#define PNP_GET_RESINFO "spD", 0x0A +#define PNP_GET_APM_ID "sppD", 0x0B + +#define PNP_GET_ISA_INFO "spD", 0x40 +#define PNP_GET_ECSD_INFO "spppD", 0x41 +#define PNP_READ_ESCD "spUD", 0x42 +#define PNP_WRITE_ESCD "spUD", 0x43 + +#define PNP_GET_DMI_INFO "spppppD", 0x50 +#define PNP_GET_DMI "sppUD", 0x51 + +#define PNP_BOOT_CHECK "sp", 0x60 +#define PNP_COUNT_IPL "sppp", 0x61 +#define PNP_GET_BOOTPRI "spp", 0x62 +#define PNP_SET_BOOTPRI "sp", 0x63 +#define PNP_GET_LASTBOOT "sp", 0x64 +#define PNP_GET_BOOTFIRST "sp", 0x65 +#define PNP_SET_BOOTFIRST "sp", 0x66 - +extern int bios16(struct bios_args *, char *, ...); +extern int bios16_call(struct bios_regs *, char *); +extern int bios32(struct bios_regs *, u_int, u_short); +extern void set_bios_selectors(struct bios_segments *, int); diff --git a/sys/amd64/include/segments.h b/sys/amd64/include/segments.h index 7028185..14afa57 100644 --- a/sys/amd64/include/segments.h +++ b/sys/amd64/include/segments.h @@ -35,7 +35,7 @@ * SUCH DAMAGE. * * from: @(#)segments.h 7.1 (Berkeley) 5/9/91 - * $Id: segments.h,v 1.19 1999/04/28 01:04:06 luoqi Exp $ + * $Id: segments.h,v 1.20 1999/06/18 14:32:21 bde Exp $ */ #ifndef _MACHINE_SEGMENTS_H_ @@ -215,14 +215,16 @@ struct region_descriptor { #define GUSERLDT_SEL 6 /* User LDT */ #define GTGATE_SEL 7 /* Process task switch gate */ #define GPANIC_SEL 8 /* Task state to consider panic from */ -#define GAPMCODE32_SEL 9 /* APM BIOS 32-bit interface (32bit Code) */ -#define GAPMCODE16_SEL 10 /* APM BIOS 32-bit interface (16bit Code) */ -#define GAPMDATA_SEL 11 /* APM BIOS 32-bit interface (Data) */ +#define GBIOSCODE32_SEL 9 /* BIOS interface (32bit Code) */ +#define GBIOSCODE16_SEL 10 /* BIOS interface (16bit Code) */ +#define GBIOSDATA_SEL 11 /* BIOS interface (Data) */ +#define GBIOSUTIL_SEL 12 /* BIOS interface (Utility) */ +#define GBIOSARGS_SEL 13 /* BIOS interface (Arguments) */ #ifdef BDE_DEBUGGER #define NGDT 18 /* some of 11-17 are reserved for debugger */ #else -#define NGDT 12 +#define NGDT 14 #endif /* |