Generate MSVC debugging info for KiUserExceptionDispatcher, KiIntSystemCall, KiFastSystemCall, KiFastSystemCallRet, KiSystemService, KiFastCallEntry, all systemcall stubs
Now usermode backtraces look as they should in WinDbg

svn path=/trunk/; revision=52705
This commit is contained in:
Timo Kreuzer 2011-07-17 00:38:46 +00:00
parent 005a7acbfc
commit 4040433bfa
6 changed files with 52 additions and 10 deletions

View file

@ -184,7 +184,8 @@ _KiRaiseUserExceptionDispatcher@0:
PUBLIC _KiUserExceptionDispatcher@8 PUBLIC _KiUserExceptionDispatcher@8
_KiUserExceptionDispatcher@8: .PROC KiUserExceptionDispatcher@8
FPO 0, 0, 0, 0, 0, FRAME_FPO
/* Clear direction flag */ /* Clear direction flag */
cld cld
@ -240,9 +241,11 @@ Exit:
call _RtlRaiseException@4 call _RtlRaiseException@4
ret 8 ret 8
.ENDP KiUserExceptionDispatcher@8
PUBLIC _KiIntSystemCall@0 PUBLIC _KiIntSystemCall@0
_KiIntSystemCall@0: .PROC KiIntSystemCall@0
FPO 0, 0, 0, 0, 0, FRAME_FPO
/* Set stack in EDX and do the interrupt */ /* Set stack in EDX and do the interrupt */
lea edx, [esp+8] lea edx, [esp+8]
@ -251,21 +254,26 @@ _KiIntSystemCall@0:
/* Return to caller */ /* Return to caller */
ret ret
.ENDP KiIntSystemCall@0
PUBLIC _KiFastSystemCall@0 PUBLIC _KiFastSystemCall@0
_KiFastSystemCall@0: .PROC KiFastSystemCall@0
FPO 0, 0, 0, 0, 0, FRAME_FPO
/* Put ESP in EDX and do the SYSENTER */ /* Put ESP in EDX and do the SYSENTER */
mov edx, esp mov edx, esp
sysenter sysenter
.ENDP KiFastSystemCall@0
PUBLIC _KiFastSystemCallRet@0 PUBLIC _KiFastSystemCallRet@0
_KiFastSystemCallRet@0: .PROC KiFastSystemCallRet@0
FPO 0, 0, 0, 0, 0, FRAME_FPO
/* Just return to caller */ /* Just return to caller */
ret ret
.ENDP KiFastSystemCallRet@0
PUBLIC _RtlpGetStackLimits@8 PUBLIC _RtlpGetStackLimits@8
_RtlpGetStackLimits@8: _RtlpGetStackLimits@8:

View file

@ -327,3 +327,10 @@ ENDM
#define NUL "\0" #define NUL "\0"
#endif #endif
/* Common definitions for FPO macro
see http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
#define FRAME_FPO 0
#define FRAME_TRAP 1
#define FRAME_TSS 2
#define FRAME_NONFPO 3

View file

@ -71,24 +71,42 @@ MACRO(MAKE_LABEL, Name, Stackbytes)
PUBLIC _&Name&@&Stackbytes PUBLIC _&Name&@&Stackbytes
_&Name&@&Stackbytes: _&Name&@&Stackbytes:
ENDM ENDM
MACRO(START_PROC, Name, Stackbytes)
PUBLIC _&Name&@&Stackbytes
.PROC &Name&@&Stackbytes
FPO 0, 0, 0, 0, 0, FRAME_FPO
ENDM
MACRO(END_PROC, Name, Stackbytes)
.ENDP &Name&@&Stackbytes
ENDM
#else #else
MACRO(MAKE_LABEL, Name, Stackbytes) MACRO(MAKE_LABEL, Name, Stackbytes)
PUBLIC &Name PUBLIC &Name
&Name: &Name:
ENDM ENDM
MACRO(START_PROC, Name, Stackbytes)
PUBLIC &Name
.PROC &Name
FPO 0, 0, 0, 0, 0, FRAME_FPO
ENDM
MACRO(END_PROC, Name, Stackbytes)
.ENDP &Name
ENDM
#endif #endif
MACRO(STUB_U, Name, ArgCount) MACRO(STUB_U, Name, ArgCount)
Stackbytes = 4 * &ArgCount Stackbytes = 4 * &ArgCount
MAKE_LABEL Zw&Name, %Stackbytes MAKE_LABEL Zw&Name, %Stackbytes
MAKE_LABEL Nt&Name, %Stackbytes START_PROC Nt&Name, %Stackbytes
STUBCODE_U SyscallId, %Stackbytes STUBCODE_U SyscallId, %Stackbytes
END_PROC Nt&Name, %Stackbytes
SyscallId = SyscallId + 1 SyscallId = SyscallId + 1
ENDM ENDM
MACRO(STUB_K, Name, ArgCount) MACRO(STUB_K, Name, ArgCount)
Stackbytes = 4 * &ArgCount Stackbytes = 4 * &ArgCount
MAKE_LABEL Zw&Name, %Stackbytes START_PROC Zw&Name, %Stackbytes
STUBCODE_K SyscallId, %Stackbytes STUBCODE_K SyscallId, %Stackbytes
END_PROC Zw&Name, %Stackbytes
SyscallId = SyscallId + 1 SyscallId = SyscallId + 1
ENDM ENDM

View file

@ -271,4 +271,11 @@ code = 1
#endif #endif
/* Common definitions for FPO macro
see http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
#define FRAME_FPO 0
#define FRAME_TRAP 1
#define FRAME_TSS 2
#define FRAME_NONFPO 3
#endif /* _ASM_INC_ */ #endif /* _ASM_INC_ */

View file

@ -216,8 +216,6 @@ MACRO(KiCallHandler, Handler)
nop nop
ENDM ENDM
#define FRAME_TRAP 1
MACRO(TRAP_ENTRY, Trap, Flags) MACRO(TRAP_ENTRY, Trap, Flags)
EXTERN @&Trap&Handler@4 :PROC EXTERN @&Trap&Handler@4 :PROC
PUBLIC _&Trap PUBLIC _&Trap

View file

@ -126,15 +126,19 @@ _KiInterruptTemplateDispatch:
EXTERN @KiSystemServiceHandler@8:PROC EXTERN @KiSystemServiceHandler@8:PROC
PUBLIC _KiSystemService PUBLIC _KiSystemService
_KiSystemService: .PROC KiSystemService
FPO 0, 0, 0, 0, 1, FRAME_TRAP
KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS) KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
KiCallHandler @KiSystemServiceHandler@8 KiCallHandler @KiSystemServiceHandler@8
.ENDP KiSystemService
EXTERN @KiFastCallEntryHandler@8:PROC EXTERN @KiFastCallEntryHandler@8:PROC
PUBLIC _KiFastCallEntry PUBLIC _KiFastCallEntry
_KiFastCallEntry: .PROC KiFastCallEntry
FPO 0, 0, 0, 0, 1, FRAME_TRAP
KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS) KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS)
KiCallHandler @KiFastCallEntryHandler@8 KiCallHandler @KiFastCallEntryHandler@8
.ENDP KiFastCallEntry
PUBLIC _KiStartUnexpectedRange@0 PUBLIC _KiStartUnexpectedRange@0
_KiStartUnexpectedRange@0: _KiStartUnexpectedRange@0: