Author: fireball
Date: Sat Dec 15 20:15:48 2007
New Revision: 31251
URL:
http://svn.reactos.org/svn/reactos?rev=31251&view=rev
Log:
- Implement BIOS access routines in HAL.
- Implement HalResetDisplay using those routines.
- Uncomment a display reset in bootvid (as real Windows bootvid does).
- Remove 1 sec delay from the shutdown thread.
- As a result, no more red screen flashing at the end of the 1st stage, shutdown quotes
are displayed again, and BSODs are shown correctly.
Added:
trunk/reactos/hal/halx86/generic/bios.c (with props)
trunk/reactos/hal/halx86/generic/v86.s (with props)
Modified:
trunk/reactos/drivers/base/bootvid/bootvid.c
trunk/reactos/hal/halx86/generic/generic.rbuild
trunk/reactos/hal/halx86/generic/halinit.c
trunk/reactos/hal/halx86/include/halp.h
trunk/reactos/include/ndk/i386/ketypes.h
trunk/reactos/ntoskrnl/ex/shutdown.c
trunk/reactos/ntoskrnl/inbv/inbv.c
Modified: trunk/reactos/drivers/base/bootvid/bootvid.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/base/bootvid/bootv…
==============================================================================
--- trunk/reactos/drivers/base/bootvid/bootvid.c (original)
+++ trunk/reactos/drivers/base/bootvid/bootvid.c Sat Dec 15 20:15:48 2007
@@ -420,10 +420,8 @@
/* Now check if we have to set the mode */
if (SetMode)
{
- //
- // Reset the display
- //
- //HalResetDisplay();
+ /* Reset the display */
+ HalResetDisplay();
curr_x = 0;
curr_y = 0;
@@ -463,7 +461,7 @@
curr_y = 0;
/* Clear the screen with HAL if we were asked to */
- //if (HalReset) HalResetDisplay();
+ if (HalReset) HalResetDisplay();
/* Re-initialize the VGA Display */
VgaInterpretCmdStream(AT_Initialization);
Added: trunk/reactos/hal/halx86/generic/bios.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/bios.c?…
==============================================================================
--- trunk/reactos/hal/halx86/generic/bios.c (added)
+++ trunk/reactos/hal/halx86/generic/bios.c Sat Dec 15 20:15:48 2007
@@ -1,0 +1,237 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bios.c
+ * PURPOSE: BIOS Access Routines
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include <hal.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS ********************************************************************/
+
+UCHAR HalpIopmSaveBuffer[0x2000];
+ULONG HalpSavedPfn;
+HARDWARE_PTE HalpSavedPte;
+ULONG HalpGpfHandler;
+ULONG HalpBopHandler;
+USHORT HalpSavedIopmBase;
+PUCHAR HalpSavedIoMap;
+ULONG HalpSavedEsp0;
+
+#define GetPdeAddress(x) (PHARDWARE_PTE)(((((ULONG_PTR)(x)) >> 22) << 2) +
0xC0300000)
+#define GetPteAddress(x) (PHARDWARE_PTE)(((((ULONG_PTR)(x)) >> 12) << 2) +
0xC0000000)
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+NTAPI
+HalpStoreAndClearIopm(IN PUCHAR IoMap)
+{
+ ULONG i;
+
+ /* Backup the old I/O Map */
+ RtlCopyMemory(HalpIopmSaveBuffer, IoMap, 0x2000);
+
+ /* Erase the current one */
+ for (i = 0; i < 0x2000; i++) IoMap[i] = 0;
+ for (i = 0x2000; i < 0x2004; i++) IoMap[i] = 0xFF;
+}
+
+VOID
+NTAPI
+HalpRestoreIopm(IN PUCHAR IoMap)
+{
+ ULONG i;
+
+ /* Restore the backed up copy, and initialize it */
+ RtlCopyMemory(IoMap, HalpIopmSaveBuffer, 0x2000);
+ for (i = 0x2000; i < 0x2004; i++) IoMap[i] = 0xFF;
+}
+
+VOID
+NTAPI
+HalpMapRealModeMemory(VOID)
+{
+ PHARDWARE_PTE Pte, V86Pte;
+ ULONG i;
+
+ /* Get the page table directory for the lowest meg of memory */
+ Pte = GetPdeAddress(0);
+ HalpSavedPfn = Pte->PageFrameNumber;
+ HalpSavedPte = *Pte;
+
+ /* Map it to the HAL reserved region and make it valid */
+ Pte->Valid = 1;
+ Pte->Write = 1;
+ Pte->Owner = 1;
+ Pte->PageFrameNumber = (GetPdeAddress(0xFFC00000))->PageFrameNumber;
+
+ /* Flush the TLB by resetting CR3 */
+ __writecr3(__readcr3());
+
+ /* Now loop the first meg of memory */
+ for (i = 0; i < 0x100000; i += PAGE_SIZE)
+ {
+ /* Identity map it */
+ Pte = GetPteAddress((PVOID)i);
+ Pte->PageFrameNumber = i >> PAGE_SHIFT;
+ Pte->Valid = 1;
+ Pte->Write = 1;
+ Pte->Owner = 1;
+ }
+
+ /* Now get the entry for our real mode V86 code and the target */
+ Pte = GetPteAddress(0x20000);
+ V86Pte = GetPteAddress(&HalpRealModeStart);
+ do
+ {
+ /* Map the physical address into our real-mode region */
+ Pte->PageFrameNumber = V86Pte->PageFrameNumber;
+
+ /* Keep going until we've reached the end of our region */
+ Pte++;
+ V86Pte++;
+ } while (V86Pte <= GetPteAddress(&HalpRealModeEnd));
+
+ /* Flush the TLB by resetting CR3 */
+ __writecr3(__readcr3());
+}
+
+VOID
+NTAPI
+HalpSwitchToRealModeTrapHandlers(VOID)
+{
+ ULONG Handler;
+
+ /* Save the current Invalid Opcode and General Protection Fault Handlers */
+ HalpGpfHandler = ((((PKIPCR)KeGetPcr())->IDT[13].ExtendedOffset << 16)
&
+ 0xFFFF0000) |
+ (((PKIPCR)KeGetPcr())->IDT[13].Offset & 0xFFFF);
+ HalpBopHandler = ((((PKIPCR)KeGetPcr())->IDT[6].ExtendedOffset << 16) &
+ 0xFFFF0000) |
+ (((PKIPCR)KeGetPcr())->IDT[6].Offset & 0xFFFF);
+
+ /* Now set our own GPF handler to handle exceptions while in real mode */
+ Handler = (ULONG_PTR)HalpTrap0D;
+ ((PKIPCR)KeGetPcr())->IDT[13].ExtendedOffset =
+ (USHORT)((Handler >> 16) & 0xFFFF);
+ ((PKIPCR)KeGetPcr())->IDT[13].Offset = (USHORT)Handler;
+
+ /* And our own invalid opcode handler to detect the BOP to get us out */
+ Handler = (ULONG_PTR)HalpTrap06;
+ ((PKIPCR)KeGetPcr())->IDT[6].ExtendedOffset =
+ (USHORT)((Handler >> 16) & 0xFFFF);
+ ((PKIPCR)KeGetPcr())->IDT[6].Offset = (USHORT)Handler;
+}
+
+VOID
+NTAPI
+HalpSetupRealModeIoPermissionsAndTask(VOID)
+{
+ /* Save a copy of the I/O Map and delete it */
+ HalpSavedIoMap = (PUCHAR)&(KeGetPcr()->TSS->IoMaps[0]);
+ HalpStoreAndClearIopm(HalpSavedIoMap);
+
+ /* Save the IOPM and switch to the real-mode one */
+ HalpSavedIopmBase = KeGetPcr()->TSS->IoMapBase;
+ KeGetPcr()->TSS->IoMapBase = KiComputeIopmOffset(1);
+
+ /* Save our stack pointer */
+ HalpSavedEsp0 = KeGetPcr()->TSS->Esp0;
+}
+
+VOID
+NTAPI
+HalpRestoreTrapHandlers(VOID)
+{
+ /* We're back, restore the handlers we over-wrote */
+ ((PKIPCR)KeGetPcr())->IDT[13].ExtendedOffset =
+ (USHORT)((HalpGpfHandler >> 16) & 0xFFFF);
+ ((PKIPCR)KeGetPcr())->IDT[13].Offset = (USHORT)HalpGpfHandler;
+ ((PKIPCR)KeGetPcr())->IDT[6].ExtendedOffset =
+ (USHORT)((HalpBopHandler >> 16) & 0xFFFF);
+ ((PKIPCR)KeGetPcr())->IDT[6].Offset = (USHORT)HalpBopHandler;
+}
+
+VOID
+NTAPI
+HalpRestoreIoPermissionsAndTask(VOID)
+{
+ /* Restore the stack pointer */
+ KeGetPcr()->TSS->Esp0 = HalpSavedEsp0;
+
+ /* Restore the I/O Map */
+ HalpRestoreIopm(HalpSavedIoMap);
+
+ /* Restore the IOPM */
+ KeGetPcr()->TSS->IoMapBase = HalpSavedIopmBase;
+}
+
+VOID
+NTAPI
+HalpUnmapRealModeMemory(VOID)
+{
+ ULONG i;
+ PHARDWARE_PTE Pte;
+
+ /* Loop the first meg of memory */
+ for (i = 0; i < 0x100000; i += PAGE_SIZE)
+ {
+ /* Invalidate each PTE */
+ Pte = GetPteAddress((PVOID)i);
+ Pte->Valid = 0;
+ Pte->Write = 0;
+ Pte->PageFrameNumber = 0;
+ }
+
+ /* Restore the PDE for the lowest megabyte of memory */
+ Pte = GetPdeAddress(0);
+ *Pte = HalpSavedPte;
+ Pte->PageFrameNumber = HalpSavedPfn;
+
+ /* Flush the TLB by resetting CR3 */
+ __writecr3(__readcr3());
+}
+
+BOOLEAN
+NTAPI
+HalpBiosDisplayReset(VOID)
+{
+ ULONG Flags = 0;
+
+ /* Disable interrupts */
+ Ke386SaveFlags(Flags);
+ _disable();
+
+ /* Map memory available to the V8086 real-mode code */
+ HalpMapRealModeMemory();
+
+ /* Use special invalid opcode and GPF trap handlers */
+ HalpSwitchToRealModeTrapHandlers();
+
+ /* Configure the IOPM and TSS */
+ HalpSetupRealModeIoPermissionsAndTask();
+
+ /* Now jump to real mode */
+ HalpBiosCall();
+
+ /* Restore kernel trap handlers */
+ HalpRestoreTrapHandlers();
+
+ /* Restore TSS and IOPM */
+ HalpRestoreIoPermissionsAndTask();
+
+ /* Restore low memory mapping */
+ HalpUnmapRealModeMemory();
+
+ /* Restore interrupts if they were previously enabled */
+ Ke386RestoreFlags(Flags);
+ return TRUE;
+}
+
+/* EOF */
Propchange: trunk/reactos/hal/halx86/generic/bios.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/hal/halx86/generic/generic.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/generic…
==============================================================================
--- trunk/reactos/hal/halx86/generic/generic.rbuild (original)
+++ trunk/reactos/hal/halx86/generic/generic.rbuild Sat Dec 15 20:15:48 2007
@@ -7,6 +7,7 @@
<define name="_DISABLE_TIDENTS" />
<define name="_NTHAL_" />
<file>beep.c</file>
+ <file>bios.c</file>
<file>bus.c</file>
<file>cmos.c</file>
<file>dma.c</file>
@@ -20,6 +21,7 @@
<file>sysinfo.c</file>
<file>timer.c</file>
<file>systimer.S</file>
+ <file>v86.s</file>
<pch>../include/hal.h</pch>
</module>
<module name="hal_generic_up" type="objectlibrary">
Modified: trunk/reactos/hal/halx86/generic/halinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/halinit…
==============================================================================
--- trunk/reactos/hal/halx86/generic/halinit.c (original)
+++ trunk/reactos/hal/halx86/generic/halinit.c Sat Dec 15 20:15:48 2007
@@ -109,6 +109,7 @@
HalInitPnpDriver = NULL; // FIXME: TODO
HalGetDmaAdapter = HalpGetDmaAdapter;
HalGetInterruptTranslator = NULL; // FIXME: TODO
+ HalResetDisplay = HalpBiosDisplayReset;
/* Initialize the hardware lock (CMOS) */
KeInitializeSpinLock(&HalpSystemHardwareLock);
Added: trunk/reactos/hal/halx86/generic/v86.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/v86.s?r…
==============================================================================
--- trunk/reactos/hal/halx86/generic/v86.s (added)
+++ trunk/reactos/hal/halx86/generic/v86.s Sat Dec 15 20:15:48 2007
@@ -1,0 +1,417 @@
+/*
+ * FILE: hal/halx86/generic/bios.S
+ * COPYRIGHT: See COPYING in the top level directory
+ * PURPOSE: V8086 Real-Mode BIOS Thunking
+ * PROGRAMMER: Alex Ionescu (alex(a)relsoft.net)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <asm.h>
+#include <internal/i386/asmmacro.S>
+.intel_syntax noprefix
+
+//
+// HAL BIOS Frame
+//
+#define HALP_BIOS_FRAME_SS 0x00
+#define HALP_BIOS_FRAME_ESP 0x04
+#define HALP_BIOS_FRAME_EFLAGS 0x08
+#define HALP_BIOS_FRAME_CS 0x0C
+#define HALP_BIOS_FRAME_EIP 0x10
+#define HALP_BIOS_FRAME_TRAP_FRAME 0x14
+#define HALP_BIOS_FRAME_CS_LIMIT 0x18
+#define HALP_BIOS_FRAME_CS_BASE 0x1C
+#define HALP_BIOS_FRAME_CS_FLAGS 0x20
+#define HALP_BIOS_FRAME_SS_LIMIT 0x24
+#define HALP_BIOS_FRAME_SS_BASE 0x28
+#define HALP_BIOS_FRAME_SS_FLAGS 0x2C
+#define HALP_BIOS_FRAME_PREFIX 0x30
+#define HALP_BIOS_FRAME_LENGTH 0x34
+
+/* GLOBALS *******************************************************************/
+
+_HalpSavedEsp:
+ .long 0
+
+_UnhandledMsg:
+ .asciz "\n\x7\x7!!! Unhandled or Unexpected Code at line: %lx!!!\n"
+
+/* FUNCTIONS *****************************************************************/
+
+.globl _HalpBiosCall@0
+.func HalpBiosCall@0
+_HalpBiosCall@0:
+
+ /* Set up stack pointer */
+ push ebp
+ mov ebp, esp
+
+ /* Build a trap frame */
+ pushfd
+ push edi
+ push esi
+ push ebx
+ push ds
+ push es
+ push fs
+ push gs
+ push offset _HalpRealModeEnd
+
+ /* Save the stack */
+ mov _HalpSavedEsp, esp
+
+ /* Turn off alignment faults */
+ mov eax, cr0
+ and eax, ~CR0_AM
+ mov cr0, eax
+
+ /* Setup a new stack */
+ mov esi, fs:KPCR_TSS
+ mov eax, esp
+ sub eax, NPX_FRAME_LENGTH
+ mov [esi+KTSS_ESP0], eax
+
+ /* Save V86 registers */
+ push 0
+ push 0
+ push 0
+ push 0
+ push 0x2000
+
+ /* Get linear delta between stack and code */
+ mov eax, offset _HalpRealModeEnd-4
+ sub eax, offset _HalpRealModeStart
+
+ /* Get offset of code */
+ mov edx, offset _HalpRealModeStart
+ and edx, 0xFFF
+
+ /* Add offset to linear address and save the new V86 SP */
+ add eax, edx
+ push eax
+
+ /* Start building interrupt frame. Setup V86 EFLAGS and IOPL 3 */
+ pushfd
+ or dword ptr [esp], EFLAGS_V86_MASK
+ or dword ptr [esp], 0x3000
+
+ /* Push the CS and IP */
+ push 0x2000
+ push edx
+
+ /* Do the interrupt return (jump to V86 mode) */
+ iretd
+
+.globl _HalpRealModeStart
+_HalpRealModeStart:
+
+ /* Set mode 13 */
+ mov ax, 0x12
+ .byte 0
+ .byte 0
+
+ /* Do the interrupt */
+ int 0x10
+
+ /* BOP to exit V86 mode */
+ .byte 0xC4
+ .byte 0xC4
+
+ /* The stack lives here */
+.align 4
+ .space 2048
+.globl _HalpRealModeEnd
+_HalpRealModeEnd:
+
+ /* We're back, clean up the trap frame */
+ pop gs
+ pop fs
+ pop es
+ pop ds
+ pop ebx
+ pop esi
+ pop edi
+ popfd
+
+ /* Return to caller */
+ pop ebp
+ ret 0
+.endfunc
+
+.globl _HalpOpcodeInvalid@0
+.func HalpOpcodeInvalid@0
+_HalpOpcodeInvalid@0:
+
+ /* Unhandled */
+ UNHANDLED_PATH
+
+ /* Nothing to return */
+ xor eax, eax
+ ret 0
+.endfunc
+
+.globl _HalpPushInt@0
+.func HalpPushInt@0
+_HalpPushInt@0:
+
+ /* Save EBX */
+ push ebx
+
+ /* Get SS offset and base */
+ mov edx, [esi+HALP_BIOS_FRAME_ESP]
+ mov ebx, [esi+HALP_BIOS_FRAME_SS_BASE]
+
+ /* Convert to 16-bits */
+ and edx, 0xFFFF
+ sub dx, 2
+
+ /* Get EFLAGS and write them into the linear address of SP */
+ mov ax, word ptr [esi+HALP_BIOS_FRAME_EFLAGS]
+ mov [ebx+edx], ax
+ sub dx, 2
+
+ /* Get CS segment and write it into SP */
+ mov ax, word ptr [esi+HALP_BIOS_FRAME_CS]
+ mov [ebx+edx], ax
+ sub dx, 2
+
+ /* Get IP and write it into SP */
+ mov ax, word ptr [esi+HALP_BIOS_FRAME_EIP]
+ mov [ebx+edx], ax
+
+ /* Get new IP value (the interrupt ID is in ECX, so this is in the IVT) */
+ mov eax, [ecx*4]
+ push eax
+
+ /* Now save the new IP */
+ movzx eax, ax
+ mov [esi+HALP_BIOS_FRAME_EIP], eax
+
+ /* Save the new CS of this IP */
+ pop eax
+ shr eax, 16
+ mov [esi+HALP_BIOS_FRAME_CS], eax
+
+ /* Update the stack pointer after our manual interrupt frame construction */
+ mov word ptr [esi+HALP_BIOS_FRAME_ESP], dx
+
+ /* Get CS and convert it to linear format */
+ mov eax, [esi+HALP_BIOS_FRAME_CS]
+ shl eax, 4
+ mov [esi+HALP_BIOS_FRAME_CS_BASE], eax
+ mov dword ptr [esi+HALP_BIOS_FRAME_CS_LIMIT], 0xFFFF
+ mov dword ptr [esi+HALP_BIOS_FRAME_CS_FLAGS], 0
+
+ /* Return success and restore EBX */
+ mov eax, 1
+ pop ebx
+ ret 0
+.endfunc
+
+.globl _HalpOpcodeINTnn@0
+.func HalpOpcodeINTnn@0
+_HalpOpcodeINTnn@0:
+
+ /* Save non-volatiles and stack */
+ push ebp
+ push esi
+ push ebx
+
+ /* Get SS and convert it to linear format */
+ mov eax, [esi+HALP_BIOS_FRAME_SS]
+ shl eax, 4
+ mov [esi+HALP_BIOS_FRAME_SS_BASE], eax
+ mov dword ptr [esi+HALP_BIOS_FRAME_SS_LIMIT], 0xFFFF
+ mov dword ptr [esi+HALP_BIOS_FRAME_SS_FLAGS], 0
+
+ /* Increase IP and check if we're past the CS limit */
+ inc dword ptr [esi+HALP_BIOS_FRAME_EIP]
+ mov edi, [esi+HALP_BIOS_FRAME_EIP]
+ cmp edi, [esi+HALP_BIOS_FRAME_CS_LIMIT]
+ ja EipLimitReached
+
+ /* Convert IP to linear address and read the interrupt number */
+ add edi, [esi+HALP_BIOS_FRAME_CS_BASE]
+ movzx ecx, byte ptr [edi]
+
+ /* Increase EIP and do the interrupt, check for status */
+ inc dword ptr [esi+HALP_BIOS_FRAME_EIP]
+ call _HalpPushInt@0
+ test eax, 0xFFFF
+ jz Done
+
+ /* Update the trap frame */
+ mov ebp, [esi+HALP_BIOS_FRAME_TRAP_FRAME]
+ mov eax, [esi+HALP_BIOS_FRAME_SS]
+ mov [ebp+KTRAP_FRAME_SS], eax
+ mov eax, [esi+HALP_BIOS_FRAME_ESP]
+ mov [ebp+KTRAP_FRAME_ESP], eax
+ mov eax, [esi+HALP_BIOS_FRAME_CS]
+ mov [ebp+KTRAP_FRAME_CS], eax
+ mov eax, [esi+HALP_BIOS_FRAME_EFLAGS]
+ mov [ebp+KTRAP_FRAME_EFLAGS], eax
+
+ /* Set success code */
+ mov eax, 1
+
+Done:
+ /* Restore volatiles */
+ pop ebx
+ pop edi
+ pop ebp
+ ret 0
+
+EipLimitReached:
+ /* Set failure code */
+ xor eax, eax
+ jmp Done
+.endfunc
+
+.globl _HalpDispatchV86Opcode@0
+.func HalpDispatchV86Opcode@0
+_HalpDispatchV86Opcode@0:
+
+ /* Make space for the HAL BIOS Frame on the stack */
+ push ebp
+ mov ebp, esp
+ sub esp, HALP_BIOS_FRAME_LENGTH
+
+ /* Save non-volatiles */
+ push esi
+ push edi
+
+ /* Save pointer to the trap frame */
+ mov esi, [ebp]
+ mov [ebp-HALP_BIOS_FRAME_LENGTH+HALP_BIOS_FRAME_TRAP_FRAME], esi
+
+ /* Save SS */
+ movzx eax, word ptr [esi+KTRAP_FRAME_SS]
+ mov [ebp-HALP_BIOS_FRAME_LENGTH+HALP_BIOS_FRAME_SS], eax
+
+ /* Save ESP */
+ mov eax, [esi+KTRAP_FRAME_ESP]
+ mov [ebp-HALP_BIOS_FRAME_LENGTH+HALP_BIOS_FRAME_ESP], eax
+
+ /* Save EFLAGS */
+ mov eax, [esi+KTRAP_FRAME_EFLAGS]
+ mov [ebp-HALP_BIOS_FRAME_LENGTH+HALP_BIOS_FRAME_EFLAGS], eax
+
+ /* Save CS */
+ movzx eax, word ptr [esi+KTRAP_FRAME_CS]
+ mov [ebp-HALP_BIOS_FRAME_LENGTH+HALP_BIOS_FRAME_CS], eax
+
+ /* Save EIP */
+ mov eax, [esi+KTRAP_FRAME_EIP]
+ mov [ebp-HALP_BIOS_FRAME_LENGTH+HALP_BIOS_FRAME_EIP], eax
+
+ /* No prefix */
+ xor eax, eax
+ mov [ebp-HALP_BIOS_FRAME_LENGTH+HALP_BIOS_FRAME_PREFIX], eax
+
+ /* Set pointer to HAL BIOS Frame */
+ lea esi, [ebp-HALP_BIOS_FRAME_LENGTH]
+
+ /* Convert CS to linear format */
+ mov eax, [esi+HALP_BIOS_FRAME_CS]
+ shl eax, 4
+ mov [esi+HALP_BIOS_FRAME_CS_BASE], eax
+ mov dword ptr [esi+HALP_BIOS_FRAME_CS_LIMIT], 0xFFFF
+ mov dword ptr [esi+HALP_BIOS_FRAME_CS_FLAGS], 0
+
+ /* Make sure IP is within the CS Limit */
+ mov edi, [esi+HALP_BIOS_FRAME_EIP]
+ cmp edi, [esi+HALP_BIOS_FRAME_CS_LIMIT]
+ ja DispatchError
+
+ /* Convert IP to linear address and read the opcode */
+ add edi, [esi+HALP_BIOS_FRAME_CS_BASE]
+ mov dl, [edi]
+
+ /* We only deal with interrupts */
+ cmp dl, 0xCD
+ je DispatchInt
+
+ /* Anything else is invalid */
+ call _HalpOpcodeInvalid@0
+ jmp DispatchError
+
+DispatchInt:
+ /* Handle dispatching the interrupt */
+ call _HalpOpcodeINTnn@0
+ test eax, 0xFFFF
+ jz DispatchReturn
+
+ /* Update the trap frame EIP */
+ mov edi, [ebp-0x20]
+ mov eax, [ebp-0x24]
+ mov [edi+KTRAP_FRAME_EIP], eax
+
+ /* Set success code */
+ mov eax, 1
+
+DispatchReturn:
+ /* Restore registers and return */
+ pop edi
+ pop esi
+ mov esp, ebp
+ pop ebp
+ ret 0
+
+DispatchError:
+ /* Set failure code and return */
+ xor eax, eax
+ jmp DispatchReturn
+.endfunc
+
+.func Ki16BitStackException
+_Ki16BitStackException:
+
+ /* Save stack */
+ push ss
+ push esp
+
+ /* Go to kernel mode thread stack */
+ mov eax, PCR[KPCR_CURRENT_THREAD]
+ add esp, [eax+KTHREAD_INITIAL_STACK]
+
+ /* Switch to good stack segment */
+ UNHANDLED_PATH
+.endfunc
+
+.globl _HalpTrap0D@0
+.func HalpTrap0D@0
+TRAP_FIXUPS htd_a, htd_t, DoFixupV86, DoFixupAbios
+_HalpTrap0D@0:
+
+ /* Enter trap */
+ TRAP_PROLOG htd_a, htd_t
+
+ /* Check if this is a V86 trap */
+ test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
+ jnz DoDispatch
+
+ /* Unhandled */
+ UNHANDLED_PATH
+
+DoDispatch:
+ /* Handle the opcode */
+ call _HalpDispatchV86Opcode@0
+
+ /* Exit the interrupt */
+ jmp _Kei386EoiHelper@0
+.endfunc
+
+.globl _HalpTrap06@0
+.func HalpTrap06@0
+_HalpTrap06@0:
+
+ /* Restore DS/ES segments */
+ mov eax, KGDT_R3_DATA | RPL_MASK
+ mov ds, ax
+ mov es, ax
+
+ /* Restore ESP and return */
+ mov esp, _HalpSavedEsp
+ ret 0
+.endfunc
Propchange: trunk/reactos/hal/halx86/generic/v86.s
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/hal/halx86/include/halp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/include/halp.h?…
==============================================================================
--- trunk/reactos/hal/halx86/include/halp.h (original)
+++ trunk/reactos/hal/halx86/include/halp.h Sat Dec 15 20:15:48 2007
@@ -115,6 +115,48 @@
IN OUT PVOID Buffer
);
+//
+// BIOS Routines
+//
+BOOLEAN
+NTAPI
+HalpBiosDisplayReset(
+ VOID
+);
+
+ULONG
+NTAPI
+HalpBorrowTss(
+ VOID
+);
+
+ULONG
+NTAPI
+HalpReturnTss(
+ ULONG SavedTss
+);
+
+VOID
+NTAPI
+HalpBiosCall(
+ VOID
+);
+
+VOID
+NTAPI
+HalpTrap0D(
+ VOID
+);
+
+VOID
+NTAPI
+HalpTrap06(
+ VOID
+);
+
+extern PVOID HalpRealModeStart;
+extern PVOID HalpRealModeEnd;
+
extern KSPIN_LOCK HalpSystemHardwareLock;
#endif /* __INTERNAL_HAL_HAL_H */
Modified: trunk/reactos/include/ndk/i386/ketypes.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/i386/ketypes.h…
==============================================================================
--- trunk/reactos/include/ndk/i386/ketypes.h (original)
+++ trunk/reactos/include/ndk/i386/ketypes.h Sat Dec 15 20:15:48 2007
@@ -107,6 +107,16 @@
// HAL Variables
//
#define INITIAL_STALL_COUNT 0x64
+
+//
+// IOPM Definitions
+//
+#define IO_ACCESS_MAP_NONE 0
+#define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
+#define KiComputeIopmOffset(MapNumber) \
+ (MapNumber == IO_ACCESS_MAP_NONE) ? \
+ (USHORT)(sizeof(KTSS)) : \
+ (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
//
// Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
Modified: trunk/reactos/ntoskrnl/ex/shutdown.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/shutdown.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/shutdown.c (original)
+++ trunk/reactos/ntoskrnl/ex/shutdown.c Sat Dec 15 20:15:48 2007
@@ -48,7 +48,6 @@
ShutdownThreadMain(PVOID Context)
{
SHUTDOWN_ACTION Action = (SHUTDOWN_ACTION)Context;
- LARGE_INTEGER Waittime;
static PCH FamousLastWords[] =
{
@@ -167,15 +166,12 @@
}
PspShutdownProcessManager();
- Waittime.QuadPart = (LONGLONG)-10000000; /* 1sec */
- KeDelayExecutionThread(KernelMode, FALSE, &Waittime);
-
+
CmShutdownSystem();
IoShutdownRegisteredFileSystems();
IoShutdownRegisteredDevices();
MiShutdownMemoryManager();
-
if (Action == ShutdownNoReboot)
{
Modified: trunk/reactos/ntoskrnl/inbv/inbv.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/inbv/inbv.c?rev=3…
==============================================================================
--- trunk/reactos/ntoskrnl/inbv/inbv.c (original)
+++ trunk/reactos/ntoskrnl/inbv/inbv.c Sat Dec 15 20:15:48 2007
@@ -111,6 +111,7 @@
PCHAR CommandLine;
BOOLEAN CustomLogo = FALSE;
ULONG i;
+ extern BOOLEAN ExpInTextModeSetup;
/* Quit if we're already installed */
if (InbvBootDriverInstalled) return TRUE;
@@ -123,6 +124,9 @@
CommandLine = _strupr(LoaderBlock->LoadOptions);
CustomLogo = strstr(CommandLine, "BOOTLOGO") ? TRUE: FALSE;
}
+
+ /* For SetupLDR, don't reset the BIOS Display -- FIXME! */
+ if (ExpInTextModeSetup) CustomLogo = TRUE;
/* Initialize the video */
InbvBootDriverInstalled = VidInitialize(!CustomLogo);