summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/haltyne/mips/x86bios.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/nthals/haltyne/mips/x86bios.c')
-rw-r--r--private/ntos/nthals/haltyne/mips/x86bios.c262
1 files changed, 262 insertions, 0 deletions
diff --git a/private/ntos/nthals/haltyne/mips/x86bios.c b/private/ntos/nthals/haltyne/mips/x86bios.c
new file mode 100644
index 000000000..c31a8baf5
--- /dev/null
+++ b/private/ntos/nthals/haltyne/mips/x86bios.c
@@ -0,0 +1,262 @@
+/*++
+
+Copyright (c) 1994 Microsoft Corporation
+
+Module Name:
+
+ x86bios.c
+
+Abstract:
+
+
+ This module implements the platform specific interface between a device
+ driver and the execution of x86 ROM bios code for the device.
+
+Author:
+
+ David N. Cutler (davec) 17-Jun-1994
+
+Environment:
+
+ Kernel mode only.
+
+Revision History:
+
+--*/
+
+#include "halp.h"
+
+typedef struct FIRMWARE_INT_ARGUMENTS {
+ ULONG pEAX;
+ ULONG pEBX;
+ ULONG pECX;
+ ULONG pEDX;
+ ULONG pESI;
+ ULONG pEDI;
+ ULONG pEBP;
+ USHORT pES;
+ USHORT pDS;
+ USHORT pFlags;
+} FIRMWARE_INT_ARGUMENTS, *PFIRMWARE_INT_ARGUMENTS;
+
+ULONG HalpX86BiosInitialized = FALSE;
+ULONG HalpEnableInt10Calls = FALSE;
+ULONG HalpUseFirmwareX86Emulator = FALSE;
+
+typedef
+VOID
+(*PVENDOR_EXECUTE_INT) (
+ IN USHORT Type,
+ IN PFIRMWARE_INT_ARGUMENTS Context
+ );
+
+PVENDOR_EXECUTE_INT VendorX86ExecuteInt;
+
+VOID HalpInitializeX86DisplayAdapter()
+
+{
+ PSYSTEM_PARAMETER_BLOCK SystemParameterBlock = (PSYSTEM_PARAMETER_BLOCK)(0x80001000);
+
+ //
+ // If EISA I/O Ports or EISA Memory could not be mapped, then leave the
+ // X86 BIOS Emulator disabled.
+ //
+
+ if (HalpEisaControlBase == NULL || HalpEisaMemoryBase == NULL) {
+
+// DbgPrint("X86 BIOS Emulator Disabled\n");
+
+ return;
+ }
+
+ //
+ // If Firmware level X86 Bios Emulator exists, then use that instead of the
+ // one built into the HAL.
+ //
+
+ if ((SystemParameterBlock->VendorVectorLength/4) >= 34) {
+
+ VendorX86ExecuteInt =
+ *(PVENDOR_EXECUTE_INT *)((ULONG)(SystemParameterBlock->VendorVector) + 34*4);
+
+ if (VendorX86ExecuteInt != NULL) {
+ HalpX86BiosInitialized = TRUE;
+ HalpUseFirmwareX86Emulator = TRUE;
+ HalpEnableInt10Calls = TRUE;
+
+// DbgPrint("Firmware X86 BIOS Emulator Enabled\n");
+// DbgPrint("INT 10 Calls Enabled\n");
+
+ return;
+ }
+ }
+
+// DbgPrint("HAL X86 BIOS Emulator Enabled\n");
+
+ x86BiosInitializeBios(HalpEisaControlBase, HalpEisaMemoryBase);
+
+ HalpX86BiosInitialized = TRUE;
+
+ //
+ // Attempt to initialize the Display Adapter by executing the Display Adapters
+ // initialization code in its BIOS. The standard for PC video adapters is for
+ // the BIOS to reside at 0xC000:0000 on the ISA bus.
+ //
+
+// DbgPrint("X86BiosInitializeAdapter(0xc0000)\n");
+
+ if (x86BiosInitializeAdapter(0xc0000, NULL, NULL, NULL) != XM_SUCCESS) {
+ HalpEnableInt10Calls = FALSE;
+
+// DbgPrint("INT 10 Calls Disabled\n");
+
+ return;
+ }
+
+ HalpEnableInt10Calls = TRUE;
+
+// DbgPrint("INT 10 Calls Enabled\n");
+}
+
+VOID HalpResetX86DisplayAdapter()
+
+{
+ XM86_CONTEXT Context;
+
+ //
+ // Make INT 10 call to initialize 80x25 color text mode.
+ //
+
+ Context.Eax = 0x0003; // Function 0, Mode 3
+ Context.Ebx = 0;
+ Context.Ecx = 0;
+ Context.Edx = 0;
+ Context.Esi = 0;
+ Context.Edi = 0;
+ Context.Ebp = 0;
+
+ HalCallBios(0x10,
+ &Context.Eax,
+ &Context.Ebx,
+ &Context.Ecx,
+ &Context.Edx,
+ &Context.Esi,
+ &Context.Edi,
+ &Context.Ebp);
+}
+
+
+BOOLEAN
+HalCallBios (
+ IN ULONG BiosCommand,
+ IN OUT PULONG Eax,
+ IN OUT PULONG Ebx,
+ IN OUT PULONG Ecx,
+ IN OUT PULONG Edx,
+ IN OUT PULONG Esi,
+ IN OUT PULONG Edi,
+ IN OUT PULONG Ebp
+ )
+
+/*++
+
+Routine Description:
+
+ This function provides the platform specific interface between a device
+ driver and the execution of the x86 ROM bios code for the specified ROM
+ bios command.
+
+Arguments:
+
+ BiosCommand - Supplies the ROM bios command to be emulated.
+
+ Eax to Ebp - Supplies the x86 emulation context.
+
+Return Value:
+
+ A value of TRUE is returned if the specified function is executed.
+ Otherwise, a value of FALSE is returned.
+
+--*/
+
+{
+ FIRMWARE_INT_ARGUMENTS Arguments;
+ XM86_CONTEXT Context;
+
+
+ //
+ // If the X86 BIOS Emulator has not been initialized then fail all INT calls.
+ //
+
+ if (HalpX86BiosInitialized == FALSE) {
+ return(FALSE);
+ }
+
+ //
+ // If the Video Adapter initialization failed, then we can not make INT 10 calls.
+ //
+
+ if (BiosCommand == 0x10 && HalpEnableInt10Calls == FALSE) {
+ return(FALSE);
+ }
+
+// DbgPrint("HalCallBios(%02X,%04X,%04X,%04X,%04X,%04X,%04X,%04X)\n",BiosCommand,*Eax,*Ebx,*Ecx,*Edx,*Esi,*Edi,*Ebp);
+
+ if (HalpUseFirmwareX86Emulator == TRUE) {
+
+ //
+ // Make private vector call to the emulator in the firmware.
+ //
+
+ Arguments.pEAX = *Eax;
+ Arguments.pEBX = *Ebx;
+ Arguments.pECX = *Ecx;
+ Arguments.pEDX = *Edx;
+ Arguments.pESI = *Esi;
+ Arguments.pEDI = *Edi;
+ Arguments.pEBP = *Ebp;
+ Arguments.pES = 0;
+ Arguments.pDS = 0;
+ Arguments.pFlags = 0;
+
+ VendorX86ExecuteInt((USHORT)BiosCommand,&Arguments);
+
+ *Eax = Arguments.pEAX;
+ *Ebx = Arguments.pEBX;
+ *Ecx = Arguments.pECX;
+ *Edx = Arguments.pEDX;
+ *Esi = Arguments.pESI;
+ *Edi = Arguments.pEDI;
+ *Ebp = Arguments.pEBP;
+
+ }
+ else {
+
+ //
+ // Make call to emulator build into HAL
+ //
+
+ Context.Eax = *Eax;
+ Context.Ebx = *Ebx;
+ Context.Ecx = *Ecx;
+ Context.Edx = *Edx;
+ Context.Esi = *Esi;
+ Context.Edi = *Edi;
+ Context.Ebp = *Ebp;
+
+ if (x86BiosExecuteInterrupt((UCHAR)BiosCommand, &Context, NULL, NULL) != XM_SUCCESS) {
+ return FALSE;
+ }
+
+ *Eax = Context.Eax;
+ *Ebx = Context.Ebx;
+ *Ecx = Context.Ecx;
+ *Edx = Context.Edx;
+ *Esi = Context.Esi;
+ *Edi = Context.Edi;
+ *Ebp = Context.Ebp;
+
+ }
+
+ return TRUE;
+}