[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

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Thu Feb 11 00:24:59 CET 2010


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?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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.S?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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?rev=45565&view=auto
==============================================================================
--- 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 at 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 = native

Modified: trunk/reactos/hal/halx86/hal.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/hal.rbuild?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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.rbuild?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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=45565&view=auto
==============================================================================
--- 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 at 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 = native

Modified: trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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_asm.S?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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/i386/asmmacro.S?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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 at relsoft.net)
+ *                  Timo Kreuzer (timo.kreuzer at 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 at 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_PCR
+        mov 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], ecx
+        mov [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], eax
+            mov [esp - FrameSize + KTRAP_FRAME_ES], ecx
+            mov eax, [esp - FrameSize + KTRAP_FRAME_V86_FS]
+            mov ecx, [esp - FrameSize + KTRAP_FRAME_V86_GS]
+            mov [esp - FrameSize + KTRAP_FRAME_FS], eax
+            mov [esp - FrameSize + KTRAP_FRAME_GS], ecx
+            jmp set_sane_segs
+
+        not_v86_trap:
+
+            /* Save segment selectors */
+            mov eax, ds
+            mov ecx, es
+            mov [esp - FrameSize + KTRAP_FRAME_DS], eax
+            mov [esp - FrameSize + KTRAP_FRAME_ES], ecx
+            mov eax, fs
+            mov ecx, gs
+            mov [esp - FrameSize + KTRAP_FRAME_FS], eax
+            mov [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_PCR
+        mov 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 at 4 :PROC
+    PUBLIC _&Trap
+    _&Trap:
+    KiEnterTrap Flags
+    jmp @&Trap&Handler at 4
+ENDM
+

Modified: trunk/reactos/ntoskrnl/include/internal/trap_x.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/trap_x.h?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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 at relsoft.net)
+ *                  Timo Kreuzer (timo.kreuzer at 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 at 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 at 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 at 8
+PUBLIC _KiInterruptTemplate
+_KiInterruptTemplate:
+    KiEnterTrap KI_PUSH_FAKE_ERROR_CODE
+PUBLIC _KiInterruptTemplate2ndDispatch
+_KiInterruptTemplate2ndDispatch:
+    mov edx, 0
+PUBLIC _KiInterruptTemplateObject
+_KiInterruptTemplateObject:
+    mov eax, offset @KiInterruptTemplateHandler at 8
+    jmp eax
+PUBLIC _KiInterruptTemplateDispatch
+_KiInterruptTemplateDispatch:
+
+EXTERN @KiSystemServiceHandler at 8:PROC
+PUBLIC _KiSystemService
+_KiSystemService:
+    KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
+    jmp @KiSystemServiceHandler at 8
+
+EXTERN @KiFastCallEntryHandler at 8:PROC
+PUBLIC _KiFastCallEntry
+_KiFastCallEntry:
+    KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
+    jmp @KiFastCallEntryHandler at 8
+
+PUBLIC _KiStartUnexpectedRange at 0
 _KiStartUnexpectedRange at 0:
-
-GENERATE_INT_HANDLERS
-
-.globl _KiEndUnexpectedRange at 0
+i = 0
+.rept 208
+    GENERATE_INT_HANDLER %i
+    i = i + 1
+.endr
+PUBLIC _KiEndUnexpectedRange at 0
 _KiEndUnexpectedRange at 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?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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_asm.S?rev=45565&r1=45564&r2=45565&view=diff
==============================================================================
--- 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 at 0
 .func KiGetUserModeStackAddress at 0




More information about the Ros-diffs mailing list