summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/pc
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>1999-07-29 01:49:19 +0000
committermsmith <msmith@FreeBSD.org>1999-07-29 01:49:19 +0000
commite495b00d19aaf17fae0a67881fa9bbc27f42f10b (patch)
tree16887357d8f31adc150c8ac0f20f758b5a8bfcdf /sys/i386/include/pc
parent0cee2525fa4800b488630501d295a4700c050a81 (diff)
downloadFreeBSD-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/i386/include/pc')
-rw-r--r--sys/i386/include/pc/bios.h88
1 files changed, 75 insertions, 13 deletions
diff --git a/sys/i386/include/pc/bios.h b/sys/i386/include/pc/bios.h
index 4e47eae..0c88a4d 100644
--- a/sys/i386/include/pc/bios.h
+++ b/sys/i386/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);
OpenPOWER on IntegriCloud