Hi Timo,
This commit introduces a crash for me in vbox at the end of 1st stage:
(base/setup/usetup/bootsup.c:2060) No or unknown boot loader found (ntoskrnl/io/iomgr/file.c:420) Using IopParseDevice() hack. Requested invalid attributes: 9 (ntoskrnl/io/iomgr/file.c:420) Using IopParseDevice() hack. Requested invalid attributes: 9 (ntoskrnl/io/iomgr/file.c:420) Using IopParseDevice() hack. Requested invalid attributes: 116 (ntoskrnl/ps/thread.c:119) PS: Unhandled Kernel Mode Exception Pointers = 0xFA264718 (ntoskrnl/ps/thread.c:126) Code c0000005 Addr 80107DBE Info0 00000000 Info1 00000020 Info2 00000000 Info3 00000020
*** Fatal System Error: 0x0000007e (0xC0000005,0x80107DBE,0xFA264BFC,0xFA26483C)
[7hPuTTYEntered debugger on embedded INT3 at 0x0008:0x808dc124. kdb:> bt Eip: <ntoskrnl.exe:dc125 (lib/rtl/i386/debug_asm.S:42 (RtlpBreakWithStatusInstruction))> Frames: <ntoskrnl.exe:a3a7 (ntoskrnl/ke/bug.c:1110 (KeBugCheckWithTf@24))> <ntoskrnl.exe:a4e2 (ntoskrnl/ke/bug.c:1448 (KeBugCheckEx@20))> <ntoskrnl.exe:cbccb (ntoskrnl/ps/thread.c:159 (_SEHExcept.33686))> <ntoskrnl.exe:cbcdc (ntoskrnl/ps/thread.c:159 (_SEHExcept.33686))> <ntoskrnl.exe:d984b (lib/pseh/i386/framebased-gcchack.c:132 (_SEH2FrameHandler))> <ntoskrnl.exe:dbb98 (lib/rtl/i386/except_asm.s:188 (RtlpExecuteHandler2@20))> <ntoskrnl.exe:dbb6c (lib/rtl/i386/except_asm.s:153 (RtlpExecuteHandler@20))> <ntoskrnl.exe:325a (ntoskrnl/ke/i386/exp.c:938 (KiDispatchException@20))> <ntoskrnl.exe:36e3 (ntoskrnl/ke/i386/exp.c:1144 (KiDispatchExceptionFromTrapFrame@28))> <ntoskrnl.exe:67e0 (ntoskrnl/ke/i386/traphdlr.c:1181 (@KiTrap0EHandler@4))> <00000000> kdb:>
Gabriel.
Date: Wed, 10 Feb 2010 23:24:59 +0000 To: ros-diffs@reactos.org From: tkreuzer@svn.reactos.org Subject: [ros-diffs] [tkreuzer] 45565: [REACTOS] Add asm.h containing macros to make assembly code both GAS and ML compatible at the same time. [NTOS/HAL] Move trap entry points from C into a GAS/ML compatile assembly file (might need fine tuning for ML). The entries are generated by a shared assembly macro TRAP_ENTRY. Removed KiTrapStub, KiIsV8086TrapSafe, KiIsUserTrapSafe, KiSetSaneSegments, removed segment handling from KiEnter*Trap. [NTOS] Make KiFastCallEntryHandler and KiSystemServiceHandler FASTCALL and pass the systemcall number in TrapFrame->Eax [HAL] Use _setjmp/longjmp instead of saving a trapframe in HalpBiosCall
Author: tkreuzer Date: Thu Feb 11 00:24:59 2010 New Revision: 45565
URL: http://svn.reactos.org/svn/reactos?rev=45565&view=rev Log: [REACTOS] Add asm.h containing macros to make assembly code both GAS and ML compatible at the same time. [NTOS/HAL] Move trap entry points from C into a GAS/ML compatile assembly file (might need fine tuning for ML). The entries are generated by a shared assembly macro TRAP_ENTRY. Removed KiTrapStub, KiIsV8086TrapSafe, KiIsUserTrapSafe, KiSetSaneSegments, removed segment handling from KiEnter*Trap. [NTOS] Make KiFastCallEntryHandler and KiSystemServiceHandler FASTCALL and pass the systemcall number in TrapFrame->Eax [HAL] Use _setjmp/longjmp instead of saving a trapframe in HalpBiosCall
Added: trunk/reactos/hal/halx86/generic/trap.S (with props) trunk/reactos/include/reactos/asm.h (with props) Modified: trunk/reactos/hal/halx86/generic/bios.c trunk/reactos/hal/halx86/generic/pic.c trunk/reactos/hal/halx86/generic/systimer.S trunk/reactos/hal/halx86/generic/timer.c trunk/reactos/hal/halx86/hal.rbuild trunk/reactos/hal/halx86/hal_generic.rbuild trunk/reactos/hal/halx86/halmps.rbuild trunk/reactos/hal/halx86/halxbox.rbuild trunk/reactos/hal/halx86/mp/apic.c trunk/reactos/include/ndk/i386/asm.h trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S trunk/reactos/ntoskrnl/ex/i386/interlck_asm.S trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S trunk/reactos/ntoskrnl/include/internal/trap_x.h trunk/reactos/ntoskrnl/ke/i386/irqobj.c trunk/reactos/ntoskrnl/ke/i386/trap.s trunk/reactos/ntoskrnl/ke/i386/traphdlr.c trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S
Modified: trunk/reactos/hal/halx86/generic/bios.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/bios.c?r... ============================================================================== --- trunk/reactos/hal/halx86/generic/bios.c [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/generic/bios.c [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -12,6 +12,9 @@ #include <hal.h> #define NDEBUG #include <debug.h> +#include <setjmp.h>
+void HalpTrap0D();
/* GLOBALS ********************************************************************/
@@ -46,6 +49,9 @@
/* Where the real mode code ends */ extern PVOID HalpRealModeEnd;
+/* Context saved for return from v86 mode */ +jmp_buf HalpSavedContext;
/* REAL MODE CODE AND STACK START HERE ****************************************/
@@ -230,60 +236,44 @@ while (TRUE); }
-KiTrap(HalpTrap0D, 0);
VOID DECLSPEC_NORETURN -HalpTrap06(VOID) -{
- PKTRAP_FRAME TrapFrame;
+HalpTrap06() +{ /* Restore ES/DS to known good values first */ Ke386SetEs(KGDT_R3_DATA | RPL_MASK); Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
- /* Read trap frame address */
- TrapFrame = (PKTRAP_FRAME)HalpSavedEsp;
- /* Restore segments from the trap frame */
- Ke386SetGs(TrapFrame->SegGs);
- Ke386SetFs(TrapFrame->SegFs);
- Ke386SetEs(TrapFrame->SegEs);
- Ke386SetDs(TrapFrame->SegDs);
- /* Restore EFlags */
- __writeeflags(TrapFrame->EFlags);
- /* Exit the V86 mode trap frame */
- KiCallReturn(TrapFrame);
- /* Restore the stack */
- KeGetPcr()->TSS->Esp0 = HalpSavedEsp0;
- /* Return back to where we left */
- longjmp(HalpSavedContext, 1);
- UNREACHABLE;
}
/* V8086 ENTER ****************************************************************/
VOID -FASTCALL -DECLSPEC_NORETURN -HalpBiosCallHandler(IN PKTRAP_FRAME TrapFrame) +NTAPI +HalpBiosCall() { /* Must be volatile so it doesn't get optimized away! */ volatile KTRAP_FRAME V86TrapFrame; ULONG_PTR StackOffset, CodeOffset;
- /* Fill out the quick-n-dirty trap frame */
- TrapFrame->EFlags = __readeflags();
- TrapFrame->SegGs = Ke386GetGs();
- TrapFrame->SegFs = Ke386GetFs();
- TrapFrame->SegEs = Ke386GetEs();
- TrapFrame->SegDs = Ke386GetDs();
- /* Our stack (the frame) */
- HalpSavedEsp = (ULONG_PTR)TrapFrame;
/* Save the context, check for return */
if (_setjmp(HalpSavedContext))
{
/* Returned from v86 */return;}
/* Kill alignment faults */ __writecr0(__readcr0() & ~CR0_AM);
/* Set new stack address */
- KeGetPcr()->TSS->Esp0 = HalpSavedEsp - sizeof(FX_SAVE_AREA);
KeGetPcr()->TSS->Esp0 = (ULONG)&V86TrapFrame - 0x20 - sizeof(FX_SAVE_AREA);
/* Compute segmented IP and SP offsets */ StackOffset = (ULONG_PTR)&HalpRealModeEnd - 4 - (ULONG_PTR)HalpRealModeStart;
@@ -304,8 +294,6 @@ KiDirectTrapReturn((PKTRAP_FRAME)&V86TrapFrame); }
-KiTrampoline(HalpBiosCall, KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY);
/* FUNCTIONS ******************************************************************/
VOID
Modified: trunk/reactos/hal/halx86/generic/pic.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/pic.c?re... ============================================================================== --- trunk/reactos/hal/halx86/generic/pic.c [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/generic/pic.c [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -1335,4 +1335,3 @@ } }
-KiTrap(HalpApcInterrupt, KI_SOFTWARE_TRAP);
Modified: trunk/reactos/hal/halx86/generic/systimer.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/systimer... ============================================================================== --- trunk/reactos/hal/halx86/generic/systimer.S [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/generic/systimer.S [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -8,7 +8,6 @@ /* INCLUDES ******************************************************************/
#include <asm.h> -#include <internal/i386/asmmacro.S> .intel_syntax noprefix
/* GLOBALS *******************************************************************/
Modified: trunk/reactos/hal/halx86/generic/timer.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/timer.c?... ============================================================================== --- trunk/reactos/hal/halx86/generic/timer.c [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/generic/timer.c [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -161,8 +161,6 @@ KiEoiHelper(TrapFrame); }
-KiTrap(HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE);
/* PUBLIC FUNCTIONS ***********************************************************/
Added: trunk/reactos/hal/halx86/generic/trap.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/trap.S?r... ============================================================================== --- trunk/reactos/hal/halx86/generic/trap.S (added) +++ trunk/reactos/hal/halx86/generic/trap.S [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -1,0 +1,23 @@ +/*
- FILE: ntoskrnl/ke/i386/trap.S
- COPYRIGHT: See COPYING in the top level directory
- PURPOSE: System Traps, Entrypoints and Exitpoints
- PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org)
- NOTE: See asmmacro.S for the shared entry/exit code.
- */
+/* INCLUDES ******************************************************************/
+#include <reactos/asm.h> +#include <ndk/i386/asm.h> +#include <internal/i386/asmmacro.S>
+.code32 +.text
+TRAP_ENTRY HalpTrap0D, 0 +TRAP_ENTRY HalpApcInterrupt, KI_SOFTWARE_TRAP +TRAP_ENTRY HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE
Propchange: trunk/reactos/hal/halx86/generic/trap.S
svn:eol-style = nativeModified: trunk/reactos/hal/halx86/hal.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/hal.rbuild?rev=4... ============================================================================== --- trunk/reactos/hal/halx86/hal.rbuild [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/hal.rbuild [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -10,6 +10,7 @@ <library>hal_generic</library> <library>hal_generic_up</library> <library>ntoskrnl</library>
<library>libcntpr</library><directory name="up"> <file>halinit_up.c</file> <file>halup.rc</file>
Modified: trunk/reactos/hal/halx86/hal_generic.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/hal_generic.rbui... ============================================================================== --- trunk/reactos/hal/halx86/hal_generic.rbuild [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/hal_generic.rbuild [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -28,6 +28,7 @@ <file>sysinfo.c</file> <file>systimer.S</file> <file>timer.c</file>
<file>trap.S</file> <file>usage.c</file></directory> <directory name="include">
Modified: trunk/reactos/hal/halx86/halmps.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/halmps.rbuild?re... ============================================================================== --- trunk/reactos/hal/halx86/halmps.rbuild [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/halmps.rbuild [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -11,6 +11,7 @@ <library>hal_generic</library> <library>hal_generic_mp</library> <library>ntoskrnl</library>
<library>libcntpr</library><directory name="mp"> <file>mps.S</file> <file>mpsboot.asm</file>
Modified: trunk/reactos/hal/halx86/halxbox.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/halxbox.rbuild?r... ============================================================================== --- trunk/reactos/hal/halx86/halxbox.rbuild [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/halxbox.rbuild [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -10,6 +10,7 @@ <library>hal_generic</library> <library>hal_generic_up</library> <library>ntoskrnl</library>
<library>libcntpr</library><directory name="xbox"> <file>halinit_xbox.c</file> <file>part_xbox.c</file>
Modified: trunk/reactos/hal/halx86/mp/apic.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/mp/apic.c?rev=45... ============================================================================== --- trunk/reactos/hal/halx86/mp/apic.c [iso-8859-1] (original) +++ trunk/reactos/hal/halx86/mp/apic.c [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -1110,4 +1110,25 @@
#endif
+VOID +FASTCALL +DECLSPEC_NORETURN +HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame) +{
- /* Set up a fake INT Stack */
- TrapFrame->EFlags = __readeflags();
- TrapFrame->SegCs = KGDT_R0_CODE;
- TrapFrame->Eip = TrapFrame->Eax;
- /* Build the trap frame */
- KiEnterInterruptTrap(TrapFrame);
- /* unimplemented */
- UNIMPLEMENTED;
- /* Exit the interrupt */
- KiEoiHelper(TrapFrame);
+}
/* EOF */
Modified: trunk/reactos/include/ndk/i386/asm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/i386/asm.h?rev=... ============================================================================== --- trunk/reactos/include/ndk/i386/asm.h [iso-8859-1] (original) +++ trunk/reactos/include/ndk/i386/asm.h [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -248,10 +248,12 @@ #define KINTERRUPT_SERVICE_CONTEXT 0x10 #define KINTERRUPT_TICK_COUNT 0x18 #define KINTERRUPT_ACTUAL_LOCK 0x1C +#define KINTERRUPT_DISPATCH_ADDRESS 0x20 #define KINTERRUPT_VECTOR 0x24 #define KINTERRUPT_IRQL 0x28 #define KINTERRUPT_SYNCHRONIZE_IRQL 0x29 #define KINTERRUPT_DISPATCH_COUNT 0x38 +#define KINTERRUPT_DISPATCH_CODE 0x3C
// // KGDTENTRY Offsets
Added: trunk/reactos/include/reactos/asm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/asm.h?rev=4... ============================================================================== --- trunk/reactos/include/reactos/asm.h (added) +++ trunk/reactos/include/reactos/asm.h [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -1,0 +1,190 @@ +/*
- COPYRIGHT: See COPYING in the top level directory
- PROJECT: ReactOS Kernel
- FILE: ntoskrnl/include/amd64/asmmacro.S
- PURPOSE: ASM macros for for GAS and MASM/ML64
- PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
- */
+#ifdef _MSC_VER
+/* Allow ".name" identifiers */ +OPTION DOTNAME
+.586 +.MODEL FLAT
+/* Hex numbers need to be in 01ABh format */ +#define HEX(x) 0##x##h
+/* Macro values need to be marked */ +#define VAL(x) x
+/* MASM/ML doesn't want explicit [rip] addressing */ +rip = 0
+/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */ +#define MACRO(name, ...) name MACRO __VA_ARGS__
+/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */ +.PROC MACRO name
- name PROC FRAME
- _name:
+ENDM
+/* ... and .ENDP, replacing ENDP */ +.ENDP MACRO name
- name ENDP
+ENDM
+/* MASM doesn't have an ASCII macro */ +.ASCII MACRO text
- DB text
+ENDM
+/* MASM doesn't have an ASCIZ macro */ +.ASCIZ MACRO text
- DB text, 0
+ENDM
+.text MACRO +ENDM
+.code64 MACRO
- .code
+ENDM
+.code32 MACRO
- .code
+ENDM
+UNIMPLEMENTED MACRO name +ENDM
+/* We need this to distinguish repeat from macros */ +#define ENDR ENDM
+#else /***********************************************************************/
+/* Force intel syntax */ +.intel_syntax noprefix +.code64
+.altmacro
+/* Hex numbers need to be in 0x1AB format */ +#define HEX(x) 0x##x
+/* Macro values need to be marked */ +#define VAL(x) \x
+/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */ +#define MACRO(...) .macro __VA_ARGS__ +#define ENDM .endm
+/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */ +.macro .PROC name
- .func \name
- \name:
- .cfi_startproc
- .equ cfa_current_offset, -8
+.endm
+/* ... and .ENDP, replacing ENDP */ +.macro .ENDP name
- .cfi_endproc
- .endfunc
+.endm
+/* MASM compatible PUBLIC */ +.macro PUBLIC symbol
- .global \symbol
+.endm
+/* MASM compatible ALIGN */ +#define ALIGN .align
+/* MASM compatible REPEAT, additional ENDR */ +#define REPEAT .rept +#define ENDR .endr
+/* MASM compatible EXTERN */ +.macro EXTERN name +.endm
+/* MASM needs an END tag */ +#define END
+.macro .MODEL model +.endm
+.macro .code
- .text
+.endm
+/* Macros for x64 stack unwind OPs */
+.macro .allocstack size
- .cfi_adjust_cfa_offset \size
- .set cfa_current_offset, cfa_current_offset - \size
+.endm
+code = 1 +.macro .pushframe param=0
- .if (\param)
.cfi_adjust_cfa_offset 0x30.set cfa_current_offset, cfa_current_offset - 0x30- .else
.cfi_adjust_cfa_offset 0x28.set cfa_current_offset, cfa_current_offset - 0x28- .endif
+.endm
+.macro .pushreg reg
- .cfi_adjust_cfa_offset 8
- .equ cfa_current_offset, cfa_current_offset - 8
- .cfi_offset \reg, cfa_current_offset
+.endm
+.macro .savereg reg, offset
- // checkme!!!
- .cfi_offset \reg, \offset
+.endm
+.macro .savexmm128 reg, offset
- // checkme!!!
- .cfi_offset \reg, \offset
+.endm
+.macro .setframe reg, offset
- .cfi_def_cfa reg, \offset
- .equ cfa_current_offset, \offset
+.endm
+.macro .endprolog +.endm
+.macro UNIMPLEMENTED2 file, line, func
- jmp 3f
+1: .asciz "\func" +2: .asciz \file +3:
- sub rsp, 0x20
- lea rcx, MsgUnimplemented[rip]
- lea rdx, 1b[rip]
- lea r8, 2b[rip]
- mov r9, \line
- call DbgPrint
- add rsp, 0x20
+.endm +#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__,
+/* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time
- conditionals. We therefore use "if", too. .if shouldn't be used at all */
+#define if .if +#define endif .endif +#define else .else +#define elseif .elseif
+#endif
Propchange: trunk/reactos/include/reactos/asm.h
svn:eol-style = nativeModified: trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/i386/fastinterl... ============================================================================== --- trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -7,11 +7,15 @@ */
/* INCLUDES ******************************************************************/
+#include <reactos/asm.h> #include <ndk/asm.h> #include <internal/i386/asmmacro.S> -.intel_syntax noprefix
/* FUNCTIONS ****************************************************************/
+.code32 +.text
/*
- NOTE: These functions must obey the following rules:
Modified: trunk/reactos/ntoskrnl/ex/i386/interlck_asm.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/i386/interlck_a... ============================================================================== --- trunk/reactos/ntoskrnl/ex/i386/interlck_asm.S [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ex/i386/interlck_asm.S [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -7,11 +7,15 @@ */
/* INCLUDES ******************************************************************/
+#include <reactos/asm.h> #include <ndk/asm.h> #include <internal/i386/asmmacro.S> -.intel_syntax noprefix
/* FUNCTIONS ****************************************************************/
+.code32 +.text
/*
- NOTE: These functions must obey the following rules:
Modified: trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/i... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/i386/asmmacro.S [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -4,17 +4,12 @@
- FILE: ntoskrnl/include/i386/asmmacro.S
- PURPOSE: Assembly Macros for Spinlocks and common Trap Code
- PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
*/
Timo Kreuzer (timo.kreuzer@reactos.org)-/* INCLUDES ******************************************************************/
-#include <ndk/asm.h>
// Arguments for idt -#define INT_32_DPL0 0x8E00 -#define INT_32_DPL3 0xEE00
-.intel_syntax noprefix +#define INT_32_DPL0 HEX(08E00) +#define INT_32_DPL3 HEX(0EE00)
// // These macros are inlined equivalents of KiAcquire/ReleaseSpinlock, that is, @@ -30,7 +25,7 @@ // #IFDEF CONFIG_SMP // .spin // <any necessary steps to be able to jump back safely> -/ SPIN_ON_LOCK(reg, .BeginYourFunction) +// SPIN_ON_LOCK(reg, .BeginYourFunction) // #ENDIF // #ifdef CONFIG_SMP @@ -64,74 +59,139 @@ // // @remark None. // -.macro idt Handler, Bits +MACRO(idt, Handler, Bits) .long \Handler .short \Bits .short KGDT_R0_CODE -.endm +ENDM
-// -// @name GENERATE_IDT_STUB -// -// This macro creates an IDT entry for an unexpected interrupt handler. -// -// @param None. -// -// @remark None. -// -.macro GENERATE_IDT_STUB Number -idt _KiUnexpectedInterrupt&Number, INT_32_DPL0 -.endm
-// -// @name GENERATE_IDT_STUBS -// -// This macro creates unexpected interrupt IDT entries. -// -// @param None. -// -// @remark None. -// -.altmacro -.macro GENERATE_IDT_STUBS -.set i, 0 -.rept 208
- GENERATE_IDT_STUB %i
- .set i, i + 1
-.endr -.endm +KI_PUSH_FAKE_ERROR_CODE = HEX(0001) +KI_UNUSED = HEX(0002) +KI_NONVOLATILES_ONLY = HEX(0004) +KI_FAST_SYSTEM_CALL = HEX(0008) +KI_SOFTWARE_TRAP = HEX(0010) +KI_HARDWARE_INT = HEX(0020) +KI_DONT_SAVE_SEGS = HEX(0100)
-// -// @name GENERATE_INT_HANDLER -// -// This macro creates an unexpected interrupt handler. -// -// @param None. -// -// @remark None. -// -.macro GENERATE_INT_HANDLER Number -.func KiUnexpectedInterrupt&Number -_KiUnexpectedInterrupt&Number:
- mov eax, PRIMARY_VECTOR_BASE + Number
- jmp _KiEndUnexpectedRange@0
-.endfunc -.endm +MACRO(KiEnterTrap, Flags)
- LOCAL kernel_trap
- LOCAL not_v86_trap
- LOCAL set_sane_segs
-// -// @name GENERATE_INT_HANDLERS -// -// This macro creates the unexpected interrupt handlers. -// -// @param None. -// -// @remark None. -// -.altmacro -.macro GENERATE_INT_HANDLERS -.set i, 0 -.rept 208
- GENERATE_INT_HANDLER %i
- .set i, i + 1
-.endr -.endm
- /* Check what kind of trap frame this trap requires */
- if (Flags AND KI_FAST_SYSTEM_CALL)
/* SYSENTER requires us to build a complete ring transition trap frame */FrameSize = KTRAP_FRAME_V86_ES/* Fixup fs. cx is free to clobber */mov cx, KGDT_R0_PCRmov fs, cx/* Get pointer to the TSS */mov ecx, fs:[KPCR_TSS]/* Get a stack pointer */mov esp, [ecx + KTSS_ESP0]- elseif (Flags AND KI_SOFTWARE_TRAP)
/* Software traps need a complete non-ring transition trap frame */FrameSize = KTRAP_FRAME_ESP/* Software traps need to get their EIP from the caller's frame */pop eax- elseif (Flags AND KI_PUSH_FAKE_ERROR_CODE)
/* If the trap doesn't have an error code, we'll make space for it */FrameSize = KTRAP_FRAME_EIP- else
/* The trap already has an error code, so just make space for the rest */FrameSize = KTRAP_FRAME_ERROR_CODE- endif
- /* Save nonvolatile registers */
- mov [esp - FrameSize + KTRAP_FRAME_EBP], ebp
- mov [esp - FrameSize + KTRAP_FRAME_EBX], ebx
- mov [esp - FrameSize + KTRAP_FRAME_ESI], esi
- mov [esp - FrameSize + KTRAP_FRAME_EDI], edi
- /* Save eax for system calls, for use by the C handler */
- mov [esp - FrameSize + KTRAP_FRAME_EAX], eax
- /* Does the caller want nonvolatiles only? */
- if ((Flags AND KI_NONVOLATILES_ONLY) == 0)
/* Otherwise, save the volatiles as well */mov [esp - FrameSize + KTRAP_FRAME_ECX], ecxmov [esp - FrameSize + KTRAP_FRAME_EDX], edx- endif
- /* Save segment registers? */
- if ((Flags AND KI_DONT_SAVE_SEGS) == 0)
/* Check for V86 mode */test byte ptr [esp - FrameSize + KTRAP_FRAME_EFLAGS + 2], (EFLAGS_V86_MASK >> 16)jz not_v86_trap/* Restore V8086 segments into Protected Mode segments */mov eax, [esp - FrameSize + KTRAP_FRAME_V86_DS]mov ecx, [esp - FrameSize + KTRAP_FRAME_V86_ES]mov [esp - FrameSize + KTRAP_FRAME_DS], eaxmov [esp - FrameSize + KTRAP_FRAME_ES], ecxmov eax, [esp - FrameSize + KTRAP_FRAME_V86_FS]mov ecx, [esp - FrameSize + KTRAP_FRAME_V86_GS]mov [esp - FrameSize + KTRAP_FRAME_FS], eaxmov [esp - FrameSize + KTRAP_FRAME_GS], ecxjmp set_sane_segsnot_v86_trap:/* Save segment selectors */mov eax, dsmov ecx, esmov [esp - FrameSize + KTRAP_FRAME_DS], eaxmov [esp - FrameSize + KTRAP_FRAME_ES], ecxmov eax, fsmov ecx, gsmov [esp - FrameSize + KTRAP_FRAME_FS], eaxmov [esp - FrameSize + KTRAP_FRAME_GS], ecx- endif
+set_sane_segs:
- /* Load correct data segments */
- mov ax, KGDT_R3_DATA OR RPL_MASK
- mov ds, ax
- mov es, ax
- /* Fast system calls have fs already fixed */
- if ((Flags AND KI_FAST_SYSTEM_CALL) == 0)
/* Otherwise fix fs now */mov ax, KGDT_R0_PCRmov fs, ax- endif
- /* Make space for this frame */
- sub esp, FrameSize
- /* Clear direction flag */
- cld
- /* Set parameter 1 (ECX) to point to the frame */
- mov ecx, esp
+ENDM
+MACRO(TRAP_ENTRY, Trap, Flags) +EXTERN @&Trap&Handler@4 :PROC
- PUBLIC _&Trap
- _&Trap:
- KiEnterTrap Flags
- jmp @&Trap&Handler@4
+ENDM
Modified: trunk/reactos/ntoskrnl/include/internal/trap_x.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/t... ============================================================================== --- trunk/reactos/ntoskrnl/include/internal/trap_x.h [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/include/internal/trap_x.h [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -196,68 +196,6 @@ asm volatile(".byte 0xC4\n.byte 0xC4\n"); }
-// -// Returns whether or not this is a V86 trap by checking the EFLAGS field. -// -// FIXME: GCC 4.5 Can Improve this with "goto labels" -// -BOOLEAN -FORCEINLINE -KiIsV8086TrapSafe(IN PKTRAP_FRAME TrapFrame) -{
- BOOLEAN Result;
- /*
* The check MUST be done this way, as we guarantee that no DS/ES/FS segment* is used (since it might be garbage).** Instead, we use the SS segment which is guaranteed to be correct. Because* operate in 32-bit flat mode, this works just fine.*/asm volatile("testl $%c[f], %%ss:%1\n""setnz %0\n": "=a"(Result): "m"(TrapFrame->EFlags),[f] "i"(EFLAGS_V86_MASK));- /* If V86 flag was set */
- return Result;
-}
-// -// Returns whether or not this is a user-mode trap by checking the SegCs field. -// -// FIXME: GCC 4.5 Can Improve this with "goto labels" -// -BOOLEAN -FORCEINLINE -KiIsUserTrapSafe(IN PKTRAP_FRAME TrapFrame) -{
- BOOLEAN Result;
- /*
* The check MUST be done this way, as we guarantee that no DS/ES/FS segment* is used (since it might be garbage).** Instead, we use the SS segment which is guaranteed to be correct. Because* operate in 32-bit flat mode, this works just fine.*/asm volatile("cmp $%c[f], %%ss:%1\n""setnz %0\n": "=a"(Result): "m"(TrapFrame->SegCs),[f] "i"(KGDT_R0_CODE));- /* If V86 flag was set */
- return Result;
-}
VOID FORCEINLINE KiUserSystemCall(IN PKTRAP_FRAME TrapFrame) @@ -279,30 +217,6 @@ : : "r"(TrapFrame->SegCs) ); -}
-VOID -FORCEINLINE -KiSetSaneSegments(IN PKTRAP_FRAME TrapFrame) -{
- ULONG Ds, Es;
- /*
* We really have to get a good DS/ES first before touching any data.** These two reads will either go in a register (with optimizations ON) or* a stack variable (which is on SS:ESP, guaranteed to be good/valid).** Because the assembly is marked volatile, the order of instructions is* as-is, otherwise the optimizer could simply get rid of our DS/ES.**/- Ds = Ke386GetDs();
- Es = Ke386GetEs();
- Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
- Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
- TrapFrame->SegDs = Ds;
- TrapFrame->SegEs = Es;
}
// @@ -643,17 +557,9 @@ FORCEINLINE KiEnterV86Trap(IN PKTRAP_FRAME TrapFrame) {
/* Load correct registers */
Ke386SetFs(KGDT_R0_PCR);
Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
/* Save exception list */ TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList;
/* Clear direction flag */
Ke386ClearDirectionFlag();
/* Save DR7 and check for debugging */ TrapFrame->Dr7 = __readdr(7); if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0))
@@ -670,40 +576,10 @@ FORCEINLINE KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame) {
/* Check for V86 mode, otherwise check for ring 3 code */
if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 0))
{
/* Set correct segments */Ke386SetDs(KGDT_R3_DATA | RPL_MASK);Ke386SetEs(KGDT_R3_DATA | RPL_MASK);Ke386SetFs(KGDT_R0_PCR);/* Restore V8086 segments into Protected Mode segments */TrapFrame->SegFs = TrapFrame->V86Fs;TrapFrame->SegGs = TrapFrame->V86Gs;TrapFrame->SegDs = TrapFrame->V86Ds;TrapFrame->SegEs = TrapFrame->V86Es;}
else if (__builtin_expect(KiIsUserTrapSafe(TrapFrame), 1)) /* Ring 3 is more common */
{
/* Switch to sane segments */KiSetSaneSegments(TrapFrame);/* Save FS/GS */TrapFrame->SegFs = Ke386GetFs();TrapFrame->SegGs = Ke386GetGs();/* Set correct FS */Ke386SetFs(KGDT_R0_PCR);}
/* Save exception list and terminate it */ TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END;
/* Clear direction flag */
Ke386ClearDirectionFlag();
/* Flush DR7 and check for debugging */ TrapFrame->Dr7 = 0; if (__builtin_expect(KeGetCurrentThread()->DispatcherHeader.DebugActive & 0xFF, 0))
@@ -723,29 +599,8 @@ FORCEINLINE KiEnterTrap(IN PKTRAP_FRAME TrapFrame) {
/* Switch to sane segments */
KiSetSaneSegments(TrapFrame);
/* Now we can save the other segments and then switch to the correct FS */
TrapFrame->SegFs = Ke386GetFs();
TrapFrame->SegGs = Ke386GetGs();
Ke386SetFs(KGDT_R0_PCR);
/* Save exception list */ TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList;
/* Check for V86 mode */
if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0))
{
/* Restore V8086 segments into Protected Mode segments */TrapFrame->SegFs = TrapFrame->V86Fs;TrapFrame->SegGs = TrapFrame->V86Gs;TrapFrame->SegDs = TrapFrame->V86Ds;TrapFrame->SegEs = TrapFrame->V86Es;}
/* Clear direction flag */
Ke386ClearDirectionFlag();
/* Flush DR7 and check for debugging */ TrapFrame->Dr7 = 0;
@@ -759,130 +614,4 @@ KiFillTrapFrameDebug(TrapFrame); }
-// -// Generates a Trap Prolog Stub for the given name -// -#define KI_PUSH_FAKE_ERROR_CODE 0x1 -#define KI_UNUSED 0x2 -#define KI_NONVOLATILES_ONLY 0x4 -#define KI_FAST_SYSTEM_CALL 0x8 -#define KI_SOFTWARE_TRAP 0x10 -#define KI_HARDWARE_INT 0x20 -#define KiTrap(x, y) VOID DECLSPEC_NORETURN x(VOID) { KiTrapStub(y, x##Handler); UNREACHABLE; } -#define KiTrampoline(x, y) VOID DECLSPEC_NOINLINE x(VOID) { KiTrapStub(y, x##Handler); }
-// -// Trap Prolog Stub -// -VOID -FORCEINLINE -KiTrapStub(IN ULONG Flags,
IN PVOID Handler)-{
- ULONG FrameSize;
- /* Is this a fast system call? They don't have a stack! */
- if (Flags & KI_FAST_SYSTEM_CALL) __asm__ __volatile__
- (
"movl %%ss:%c[t], %%esp\n""movl %c[e](%%esp), %%esp\n":: [e] "i"(FIELD_OFFSET(KTSS, Esp0)),[t] "i"(&PCR->TSS): "%esp"- );
- /* Check what kind of trap frame this trap requires */
- if (Flags & KI_SOFTWARE_TRAP)
- {
/* Software traps need a complete non-ring transition trap frame */FrameSize = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp);- }
- else if (Flags & KI_FAST_SYSTEM_CALL)
- {
/* SYSENTER requires us to build a complete ring transition trap frame */FrameSize = FIELD_OFFSET(KTRAP_FRAME, V86Es);/* And it only preserves nonvolatile registers */Flags |= KI_NONVOLATILES_ONLY;- }
- else if (Flags & KI_PUSH_FAKE_ERROR_CODE)
- {
/* If the trap doesn't have an error code, we'll make space for it */FrameSize = FIELD_OFFSET(KTRAP_FRAME, Eip);- }
- else
- {
/* The trap already has an error code, so just make space for the rest */FrameSize = FIELD_OFFSET(KTRAP_FRAME, ErrCode);- }
- /* Software traps need to get their EIP from the caller's frame */
- if (Flags & KI_SOFTWARE_TRAP) __asm__ __volatile__ ("popl %%eax\n":::"%esp");
- /* Save nonvolatile registers */
- __asm__ __volatile__
- (
/* EBX, ESI, EDI and EBP are saved */"movl %%ebp, %c[p](%%esp)\n""movl %%ebx, %c[b](%%esp)\n""movl %%esi, %c[s](%%esp)\n""movl %%edi, %c[i](%%esp)\n":: [b] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebx)),[s] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Esi)),[i] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edi)),[p] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebp)): "%esp"- );
- /* Does the caller want nonvolatiles only? */
- if (!(Flags & KI_NONVOLATILES_ONLY)) __asm__ __volatile__
- (
/* Otherwise, save the volatiles as well */"movl %%eax, %c[a](%%esp)\n""movl %%ecx, %c[c](%%esp)\n""movl %%edx, %c[d](%%esp)\n":: [a] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Eax)),[c] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ecx)),[d] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edx)): "%esp"- );
- /* Now set parameter 1 (ECX) to point to the frame */
- __asm__ __volatile__ ("movl %%esp, %%ecx\n":::"%esp");
- /* Now go ahead and make space for this frame */
- __asm__ __volatile__ ("subl $%c[e],%%esp\n":: [e] "i"(FrameSize) : "%esp");
- __asm__ __volatile__ ("subl $%c[e],%%ecx\n":: [e] "i"(FrameSize) : "%ecx");
- /*
* For hardware interrupts, set parameter 2 (EDX) to hold KINTERRUPT.* This code will be dynamically patched when an interrupt is registered!*/- if (Flags & KI_HARDWARE_INT) __asm__ __volatile__
- (
".globl _KiInterruptTemplate2ndDispatch\n_KiInterruptTemplate2ndDispatch:\n""movl $0, %%edx\n"".globl _KiInterruptTemplateObject\n_KiInterruptTemplateObject:\n"::: "%edx"- );
- /* Now jump to the C handler */
- if (Flags & KI_HARDWARE_INT)__asm__ __volatile__
- (
/** For hardware interrupts, use an absolute JMP instead of a relative JMP* since the position of this code is arbitrary in memory, and therefore* the compiler-generated offset will not be correct.*/"jmp *%0\n"".globl _KiInterruptTemplateDispatch\n_KiInterruptTemplateDispatch:\n":: "a"(Handler)- );
- else __asm__ __volatile__ ("jmp %c[x]\n":: [x] "i"(Handler));
-}
#endif
Modified: trunk/reactos/ntoskrnl/ke/i386/irqobj.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/irqobj.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/irqobj.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/irqobj.c [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -233,7 +233,7 @@ KIRQL OldIrql; BOOLEAN Handled; PLIST_ENTRY NextEntry, ListHead;
- /* Increase interrupt count */ KeGetCurrentPrcb()->InterruptCount++;
@@ -299,7 +299,7 @@ /* Now call the epilogue code */ KiExitInterrupt(TrapFrame, OldIrql, TRUE); }
- }
+}
VOID FASTCALL @@ -313,8 +313,6 @@ ((PKI_INTERRUPT_DISPATCH*)Interrupt->DispatchAddress)(TrapFrame, Interrupt); }
-KiTrap(KiInterruptTemplate, KI_PUSH_FAKE_ERROR_CODE | KI_HARDWARE_INT); -KiTrap(KiUnexpectedInterruptTail, KI_PUSH_FAKE_ERROR_CODE);
/* PUBLIC FUNCTIONS **********************************************************/
Modified: trunk/reactos/ntoskrnl/ke/i386/trap.s URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/trap.s?rev... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/trap.s [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/trap.s [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -3,19 +3,33 @@
- COPYRIGHT: See COPYING in the top level directory
- PURPOSE: System Traps, Entrypoints and Exitpoints
- PROGRAMMER: Alex Ionescu (alex@relsoft.net)
*/
Timo Kreuzer (timo.kreuzer@reactos.org)- NOTE: See asmmacro.S for the shared entry/exit code.
/* INCLUDES ******************************************************************/
-#include <asm.h> +#include <reactos/asm.h> +#include <ndk/i386/asm.h> #include <internal/i386/asmmacro.S> -.intel_syntax noprefix
+MACRO(GENERATE_IDT_STUB, Number) +idt _KiUnexpectedInterrupt&Number, INT_32_DPL0 +ENDM
+MACRO(GENERATE_INT_HANDLER, Number) +.func KiUnexpectedInterrupt&Number +_KiUnexpectedInterrupt&Number:
- mov eax, PRIMARY_VECTOR_BASE + Number
- jmp _KiEndUnexpectedRange@0
+.endfunc +ENDM
/* GLOBALS *******************************************************************/
.data -.globl _KiIdt
+PUBLIC _KiIdt _KiIdt: /* This is the Software Interrupt Table that we handle in this file: */ idt _KiTrap00, INT_32_DPL0 /* INT 00: Divide Error (#DE) */ @@ -47,26 +61,86 @@ idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */ idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */ idt _KiTrap0F, INT_32_DPL0 /* INT 2F: RESERVED */ -GENERATE_IDT_STUBS /* INT 30-FF: UNEXPECTED INTERRUPTS */ +i = 0 +.rept 208
- GENERATE_IDT_STUB %i
- i = i + 1
+.endr
-.globl _KiIdtDescriptor +PUBLIC _KiIdtDescriptor _KiIdtDescriptor: .short 0 .short 0x7FF .long _KiIdt
-.globl _KiUnexpectedEntrySize +PUBLIC _KiUnexpectedEntrySize _KiUnexpectedEntrySize: .long _KiUnexpectedInterrupt1 - _KiUnexpectedInterrupt0
+/******************************************************************************/ +.code32 .text -/* HARDWARE INTERRUPT HANDLERS ************************************************/
-.globl _KiStartUnexpectedRange@0 +TRAP_ENTRY KiTrap00, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap01, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap03, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap04, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap05, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap06, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap07, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap08, 0 +TRAP_ENTRY KiTrap09, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap0A, 0 +TRAP_ENTRY KiTrap0B, 0 +TRAP_ENTRY KiTrap0C, 0 +TRAP_ENTRY KiTrap0D, 0 +TRAP_ENTRY KiTrap0E, 0 +TRAP_ENTRY KiTrap0F, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap10, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap11, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap13, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiDebugService, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiUnexpectedInterruptTail, KI_PUSH_FAKE_ERROR_CODE
+ALIGN 4 +EXTERN @KiInterruptTemplateHandler@8 +PUBLIC _KiInterruptTemplate +_KiInterruptTemplate:
- KiEnterTrap KI_PUSH_FAKE_ERROR_CODE
+PUBLIC _KiInterruptTemplate2ndDispatch +_KiInterruptTemplate2ndDispatch:
- mov edx, 0
+PUBLIC _KiInterruptTemplateObject +_KiInterruptTemplateObject:
- mov eax, offset @KiInterruptTemplateHandler@8
- jmp eax
+PUBLIC _KiInterruptTemplateDispatch +_KiInterruptTemplateDispatch:
+EXTERN @KiSystemServiceHandler@8:PROC +PUBLIC _KiSystemService +_KiSystemService:
- KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
- jmp @KiSystemServiceHandler@8
+EXTERN @KiFastCallEntryHandler@8:PROC +PUBLIC _KiFastCallEntry +_KiFastCallEntry:
- KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
- jmp @KiFastCallEntryHandler@8
+PUBLIC _KiStartUnexpectedRange@0 _KiStartUnexpectedRange@0:
-GENERATE_INT_HANDLERS
-.globl _KiEndUnexpectedRange@0 +i = 0 +.rept 208
- GENERATE_INT_HANDLER %i
- i = i + 1
+.endr +PUBLIC _KiEndUnexpectedRange@0 _KiEndUnexpectedRange@0: jmp _KiUnexpectedInterruptTail
+END
Modified: trunk/reactos/ntoskrnl/ke/i386/traphdlr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/traphdlr.c... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/traphdlr.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/traphdlr.c [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -53,7 +53,15 @@ return ((TrapFrame->EFlags & EFLAGS_V86_MASK) || ((KiUserTrap(TrapFrame)) && (PsGetCurrentProcess()->VdmObjects))); }
+BOOLEAN +FORCEINLINE +KiV86Trap(IN PKTRAP_FRAME TrapFrame) +{
- /* Check if the V8086 flag is on */
- return ((TrapFrame->EFlags & EFLAGS_V86_MASK) != 0);
+}
/* TRAP EXIT CODE *************************************************************/
VOID @@ -223,7 +231,7 @@ DataOffset, TrapFrame); }
- /* Check for invalid operation */ if (Error & FSW_INVALID_OPERATION) {
@@ -540,7 +548,7 @@ KIRQL OldIrql;
/* Check for V86 GPF */
- if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1))
- if (__builtin_expect(KiV86Trap(TrapFrame), 1)) { /* Enter V86 trap */ KiEnterV86Trap(TrapFrame);
@@ -800,7 +808,7 @@ KIRQL OldIrql;
/* Check for V86 GPF */
- if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1))
- if (__builtin_expect(KiV86Trap(TrapFrame), 1)) { /* Enter V86 trap */ KiEnterV86Trap(TrapFrame);
@@ -845,7 +853,7 @@
/* Check for user-mode GPF */ if (KiUserTrap(TrapFrame))
- {
- { /* Should not be VDM */ ASSERT(KiVdmTrap(TrapFrame) == FALSE);
@@ -1502,19 +1510,13 @@ }
VOID -__attribute__((regparm(3))) -DECLSPEC_NORETURN -KiFastCallEntryHandler(IN ULONG ServiceNumber,
IN PVOID Arguments,IN PKTRAP_FRAME TrapFrame)+FASTCALL +DECLSPEC_NORETURN +KiFastCallEntryHandler(IN PKTRAP_FRAME TrapFrame,
IN PVOID Arguments){ PKTHREAD Thread;
- /* Fixup segments */
- Ke386SetFs(KGDT_R0_PCR);
- Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
- Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
- /* Set up a fake INT Stack and enable interrupts */ TrapFrame->HardwareSegSs = KGDT_R3_DATA | RPL_MASK; TrapFrame->HardwareEsp = (ULONG_PTR)Arguments;
@@ -1531,7 +1533,7 @@
/* Call the shared handler (inline) */ KiSystemCallHandler(TrapFrame,
ServiceNumber,
TrapFrame->Eax, Arguments, Thread, UserMode,@@ -1540,64 +1542,28 @@ }
VOID -__attribute__((regparm(3))) -DECLSPEC_NORETURN -KiSystemServiceHandler(IN ULONG ServiceNumber,
IN PVOID Arguments,IN PKTRAP_FRAME TrapFrame)-{
- USHORT SegFs;
+FASTCALL +DECLSPEC_NORETURN +KiSystemServiceHandler(IN PKTRAP_FRAME TrapFrame,
IN PVOID Arguments)+{ PKTHREAD Thread;
/* Save and fixup FS */
SegFs = Ke386GetFs();
Ke386SetFs(KGDT_R0_PCR);
/* Get the current thread */ Thread = KeGetCurrentThread();
/* Chain trap frames */ TrapFrame->Edx = (ULONG_PTR)Thread->TrapFrame;
/* Clear direction flag */
Ke386ClearDirectionFlag();
/* Call the shared handler (inline) */ KiSystemCallHandler(TrapFrame,
ServiceNumber,
TrapFrame->Eax, Arguments, Thread, KiUserTrap(TrapFrame), Thread->PreviousMode,
SegFs);-}
-/* CPU AND SOFTWARE TRAPS *****************************************************/
-KiTrap(KiTrap00, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap01, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap03, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap04, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap05, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap06, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap07, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap08, 0); -KiTrap(KiTrap09, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap0A, 0); -KiTrap(KiTrap0B, 0); -KiTrap(KiTrap0C, 0); -KiTrap(KiTrap0D, 0); -KiTrap(KiTrap0E, 0); -KiTrap(KiTrap0F, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap10, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap11, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap13, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiDebugService, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiSystemService, KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY); -KiTrap(KiFastCallEntry, KI_FAST_SYSTEM_CALL);
TrapFrame->SegFs);+}
/*
- @implemented
Modified: trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/usercall_a... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/usercall_asm.S [iso-8859-1] Thu Feb 11 00:24:59 2010 @@ -8,11 +8,14 @@
/* INCLUDES ******************************************************************/
-#include <asm.h> +#include <reactos/asm.h> +#include <ndk/i386/asm.h> #include <internal/i386/asmmacro.S> -.intel_syntax noprefix
/* FUNCTIONS ****************************************************************/
+.code32 +.text
.globl _KiGetUserModeStackAddress@0 .func KiGetUserModeStackAddress@0
_________________________________________________________________ Tutto lo spazio che ti serve, lo trovi su Hotmail http://www.windowslive.it/hotmail/SpazioDisponibile.aspx