[ros-dev] [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

Gabriel ilardi gabrielilardi at hotmail.it
Thu Feb 11 09:27:28 CET 2010


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)

PuTTYEntered 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 at 24))>
<ntoskrnl.exe:a4e2 (ntoskrnl/ke/bug.c:1448 (KeBugCheckEx at 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 at 20))>
<ntoskrnl.exe:dbb6c (lib/rtl/i386/except_asm.s:153 (RtlpExecuteHandler at 20))>
<ntoskrnl.exe:325a (ntoskrnl/ke/i386/exp.c:938 (KiDispatchException at 20))>
<ntoskrnl.exe:36e3 (ntoskrnl/ke/i386/exp.c:1144 (KiDispatchExceptionFromTrapFrame at 28))>
<ntoskrnl.exe:67e0 (ntoskrnl/ke/i386/traphdlr.c:1181 (@KiTrap0EHandler at 4))>
<00000000>
kdb:> 

Gabriel.

> Date: Wed, 10 Feb 2010 23:24:59 +0000
> To: ros-diffs at reactos.org
> From: tkreuzer at 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?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
> 
> 
 		 	   		  
_________________________________________________________________
Tutto lo spazio che ti serve, lo trovi su Hotmail
http://www.windowslive.it/hotmail/SpazioDisponibile.aspx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20100211/2fd6039f/attachment-0001.htm>


More information about the Ros-dev mailing list