fixup trap.S. Almost there...

svn path=/branches/ros-amd64-bringup/; revision=45333
This commit is contained in:
Timo Kreuzer 2010-01-30 01:17:06 +00:00
parent e2151932e4
commit f0c278391b

View file

@ -10,13 +10,18 @@
#include <reactos/asm.h>
#include <ndk/amd64/asm.h>
EXTERN _KiDispatchException:PROC
EXTERN _FrLdrDbgPrint:PROC
EXTERN _KeBugCheckWithTf:PROC
EXTERN _MmAccessFault:PROC
/* GLOBALS *******************************************************************/
.data
.global _MsgUnimplemented
PUBLIC _MsgUnimplemented
_MsgUnimplemented:
.ascii "WARNING: %s at %s:%d is UNIMPLEMENTED!\n\0"
.ascii "WARNING: %s at %s:%d is UNIMPLEMENTED!\n"
_MsgPageFault:
.ascii "Page fault! Code = 0x%x, RIP = %p, FaultingAddress = %p\n\0"
@ -39,31 +44,31 @@ _MsgDoubleFault:
_MsgTrapInfo:
.ascii "Trap: %s at %p\n\0"
.macro TRAPINFO func
MACRO(TRAPINFO, func)
#if 0
jmp 2f
.equ expr, 12
1: .asciz "\func"
2:
sub rsp, 0x20
lea rcx, _MsgTrapInfo[rip]
sub rsp, 32
lea rcx, RIP(_MsgTrapInfo)
lea rdx, 1b[rip]
mov r8, [rbp + KTRAP_FRAME_Rip]
call _FrLdrDbgPrint[rip]
add rsp, 0x20
add rsp, 32
#endif
.endm
ENDM
/* Helper Macros *************************************************************/
#define TRAPFLAG_VOLATILES 0x01
#define TRAPFLAG_NONVOLATILES 0x02
#define TRAPFLAG_XMM 0x04
#define TRAPFLAG_SEGMENTS 0x08
#define TRAPFLAG_DEBUG 0x10
#define TRAPFLAG_VOLATILES HEX(01)
#define TRAPFLAG_NONVOLATILES HEX(02)
#define TRAPFLAG_XMM HEX(04)
#define TRAPFLAG_SEGMENTS HEX(08)
#define TRAPFLAG_DEBUG HEX(10)
#define TRAPFLAG_SYSTEMSERVICE (TRAPFLAG_VOLATILES|TRAPFLAG_DEBUG)
#define TRAPFLAG_ALL 0xff
#define TRAPFLAG_ALL HEX(ff)
/*
* Stack Layout:
@ -80,10 +85,10 @@ _MsgTrapInfo:
/*
* ENTER_TRAP_FRAME - Allocate SIZE_KTRAP_FRAME and save registers to it
*/
.macro ENTER_TRAP_FRAME Flags
MACRO(ENTER_TRAP_FRAME, Flags)
SIZE_INITIAL_FRAME = 7 * 8
SIZE_TRAP_FRAME_ALLOC = SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME
TRAPFLAGS = \Flags
TRAPFLAGS = VAL(Flags)
/* Save rbp */
push rbp
@ -177,13 +182,13 @@ endif
/* Make sure the direction flag is cleared */
cld
.endm
ENDM
/*
* LEAVE_TRAP_FRAME - Restore registers and free stack space
*/
.macro LEAVE_TRAP_FRAME
MACRO(LEAVE_TRAP_FRAME)
if (TRAPFLAGS AND TRAPFLAG_SEGMENTS)
/* Restore segment selectors */
@ -232,8 +237,8 @@ endif
mov rbp, [rbp + KTRAP_FRAME_Rbp]
/* Adjust stack pointer (plus one qword for rbp, one for error code) */
add rsp, SIZE_TRAP_FRAME_ALLOC + 0x10
.endm
add rsp, SIZE_TRAP_FRAME_ALLOC + HEX(10)
ENDM
/* FUNCTIONS *****************************************************************/
@ -242,6 +247,7 @@ endif
.code64
ALIGN 8
PUBLIC _InterruptDispatchTable
_InterruptDispatchTable:
Vector = 0
@ -249,7 +255,7 @@ REPEAT 256
push Vector
jmp _KiUnexpectedInterrupt
ALIGN 8
Vector = Vector + 1
Vector = Vector+1
ENDR
// rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params
@ -267,9 +273,9 @@ _InternalDispatchException:
mov rax, [rbp + KTRAP_FRAME_Rip]
mov [rcx + EXCEPTION_RECORD_ExceptionAddress], rax
mov [rcx + EXCEPTION_RECORD_NumberParameters], edx
mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x00], r9
mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x08], r10
mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x10], r11
mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(00)], r9
mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(08)], r10
mov [rcx + EXCEPTION_RECORD_ExceptionInformation + HEX(10)], r11
/* Set up KEXCEPTION_FRAME */
mov rax, [rbp + KTRAP_FRAME_Rbp]
@ -327,7 +333,8 @@ PUBLIC _KiDivideErrorFault
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
UNIMPLEMENTED KiDivideErrorFault
@ -339,13 +346,14 @@ PUBLIC _KiDebugTrapOrFault
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
ENTER_TRAP_FRAME TRAPFLAG_ALL
TRAPINFO KiDebugTrapOrFault
/* Checkif the frame was from kernelmode */
/* Check if the frame was from kernelmode */
test word ptr [rbp + KTRAP_FRAME_SegCs], 3
jz KiDebugTrapOrFaultKMode
@ -372,7 +380,8 @@ PUBLIC _KiNmiInterrupt
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
UNIMPLEMENTED KiNmiInterrupt
@ -384,15 +393,16 @@ PUBLIC _KiBreakpointTrap
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
ENTER_TRAP_FRAME TRAPFLAG_ALL
TRAPINFO KiBreakpointTrap
// lea rcx, _MsgBreakpointTrap[rip]
// lea rcx, RIP(_MsgBreakpointTrap)
// mov rdx, rsp
// call _FrLdrDbgPrint[rip]
// call RIP(_FrLdrDbgPrint)
/* Dispatch the exception */
mov eax, STATUS_BREAKPOINT
@ -412,7 +422,8 @@ PUBLIC _KiOverflowTrap
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
UNIMPLEMENTED KiOverflowTrap
jmp $
@ -425,11 +436,12 @@ PUBLIC _KiBoundFault
push 0
.allocstack 8
sub rsp, 0x20
.allocstack 0x20
sub rsp, 32
.allocstack 32
mov [rsp + 8], rbx
.savereg rbx, 8
.endprolog
UNIMPLEMENTED KiBoundFault
@ -441,7 +453,8 @@ PUBLIC _KiInvalidOpcodeFault
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
ENTER_TRAP_FRAME TRAPFLAG_ALL
@ -450,8 +463,8 @@ PUBLIC _KiInvalidOpcodeFault
// DISPATCH_EXCEPTION STATUS_BREAKPOINT, 3, 0, 0, 0
mov rdx, [rbp + KTRAP_FRAME_Rip]
lea rcx, _MsgInvalidOpcodeFault[rip]
call _FrLdrDbgPrint[rip]
lea rcx, RIP(_MsgInvalidOpcodeFault)
call RIP(_FrLdrDbgPrint)
jmp $
/* Return */
@ -464,7 +477,8 @@ PUBLIC _KiNpxNotAvailableFault
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
UNIMPLEMENTED KiNpxNotAvailableFault
@ -476,20 +490,21 @@ PUBLIC _KiDoubleFaultAbort
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
ENTER_TRAP_FRAME TRAPFLAG_ALL
lea rcx, _MsgDoubleFault[rip]
lea rcx, RIP(_MsgDoubleFault)
mov rdx, [rbp + KTRAP_FRAME_FaultAddress]
mov r8, rbp
call _FrLdrDbgPrint[rip]
call RIP(_FrLdrDbgPrint)
/* Bugcheck code UNEXPECTED_KERNEL_MODE_TRAP */
mov rcx, 0x0000007F
mov rcx, HEX(0000007F)
/* Set double fault parameters */
mov rdx, 0x00000008 // EXCEPTION_DOUBLE_FAULT
mov rdx, 8 // EXCEPTION_DOUBLE_FAULT
mov r8, 0
mov r9, 0
mov [rbp + KTRAP_FRAME_P5], rbp // trap frame (HACKY)
@ -504,7 +519,8 @@ PUBLIC _KiNpxSegmentOverrunAbort
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
UNIMPLEMENTED KiNpxSegmentOverrunAbort
@ -515,6 +531,7 @@ PUBLIC _KiInvalidTssFault
.PROC _KiInvalidTssFault
.pushframe 1
/* We have an error code */
.endprolog
UNIMPLEMENTED KiInvalidTssFault
@ -525,6 +542,7 @@ PUBLIC _KiSegmentNotPresentFault
.PROC _KiSegmentNotPresentFault
.pushframe 1
/* We have an error code */
.endprolog
UNIMPLEMENTED KiSegmentNotPresentFault
@ -535,6 +553,7 @@ PUBLIC _KiStackFault
.PROC _KiStackFault
.pushframe 1
/* We have an error code */
.endprolog
UNIMPLEMENTED KiStackFault
@ -545,6 +564,7 @@ PUBLIC _KiGeneralProtectionFault
.PROC _KiGeneralProtectionFault
.pushframe 1
/* We have an error code */
.endprolog
cli
ENTER_TRAP_FRAME TRAPFLAG_ALL
@ -552,10 +572,10 @@ PUBLIC _KiGeneralProtectionFault
TRAPINFO KiGeneralProtectionFault
mov rdx, [rbp + KTRAP_FRAME_Rip]
lea rcx, _MsgGeneralProtFault[rip]
call _FrLdrDbgPrint[rip]
lea rcx, RIP(_MsgGeneralProtFault)
call RIP(_FrLdrDbgPrint)
/* Checkif this was from user-mode */
/* Check if this was from user-mode */
cmp byte ptr [rbp + KTRAP_FRAME_PreviousMode], KernelMode
jnz KiGpfUserMode
@ -564,33 +584,33 @@ PUBLIC _KiGeneralProtectionFault
mov rax, [rax]
/* Check for MSR failure */
cmp al, 0xF
cmp al, HEX(0F)
jz KiGpfMsr
/* Check for IRET */
cmp ax, 0xCF48
cmp ax, HEX(0CF48)
je KiGpfIret
/* Check for pop ds/es/fs/gs */
xor edx, edx
cmp al, 0x1F
cmp al, HEX(1F)
jz KiGpfPopSegDs
cmp al, 0x07
cmp al, HEX(07)
jz KiGpfPopSegEs
cmp ax, 0xA10F
cmp ax, HEX(0A10F)
jz KiGpfPopSegFs
cmp ax, 0xA90F
cmp ax, HEX(0A90F)
jz KiGpfPopSegGs
mov dx, 0x002B // KGDT64_R3_DATA | RPL_MASK
mov dx, HEX(002B) // KGDT64_R3_DATA | RPL_MASK
cmp [rbp + KTRAP_FRAME_SegDs], dx
jne KiGpfPopSegDs
cmp [rbp + KTRAP_FRAME_SegEs], dx
jne KiGpfPopSegEs
cmp [rbp + KTRAP_FRAME_SegGs], dx
jne KiGpfPopSegGs
mov dx, 0x0053 // KGDT64_R3_CMTEB | RPL_MASK
mov dx, HEX(0053) // KGDT64_R3_CMTEB | RPL_MASK
cmp [rbp + KTRAP_FRAME_SegFs], dx
jne KiGpfPopSegFs
@ -598,7 +618,7 @@ KiGpfFatal:
/* Bugcheck */
mov ecx, UNEXPECTED_KERNEL_MODE_TRAP
mov rdx, 0x0000D // EXCEPTION_GP_FAULT
mov rdx, HEX(000D) // EXCEPTION_GP_FAULT
xor r8, r8
mov r9, [rbp + KTRAP_FRAME_ErrorCode] // error code
sub rsp, 8
@ -657,17 +677,18 @@ PUBLIC _KiPageFault
.PROC _KiPageFault
.pushframe 1
/* We have an error code */
.endprolog
ENTER_TRAP_FRAME TRAPFLAG_ALL
TRAPINFO KiPageFault
#if 0
lea rcx, _MsgPageFault[rip]
lea rcx, RIP(_MsgPageFault)
mov rdx, [rbp + KTRAP_FRAME_ErrorCode]
mov r8, [rbp + KTRAP_FRAME_Rip]
mov r9, [rbp + KTRAP_FRAME_FaultAddress]
call _FrLdrDbgPrint[rip]
call RIP(_FrLdrDbgPrint)
#endif
/* Save page fault address */
@ -727,7 +748,8 @@ PUBLIC _KiFloatingErrorFault
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x8
.allocstack 8
.endprolog
UNIMPLEMENTED KiFloatingErrorFault
@ -738,6 +760,7 @@ PUBLIC _KiAlignmentFault
.PROC _KiAlignmentFault
.pushframe 1
/* We have an error code */
.endprolog
UNIMPLEMENTED KiAlignmentFault
@ -749,7 +772,8 @@ PUBLIC _KiMcheckAbort
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x08
.allocstack 8
.endprolog
UNIMPLEMENTED KiMcheckAbort
@ -761,7 +785,8 @@ PUBLIC _KiXmmException
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x08
.allocstack 8
.endprolog
UNIMPLEMENTED KiXmmException
@ -771,6 +796,7 @@ PUBLIC _KiXmmException
PUBLIC _KiApcInterrupt
.PROC _KiApcInterrupt
.pushframe 1
.endprolog
UNIMPLEMENTED KiApcInterrupt
@ -780,9 +806,10 @@ PUBLIC _KiApcInterrupt
PUBLIC _KiRaiseAssertion
.PROC _KiRaiseAssertion
.pushframe 1
.endprolog
UNIMPLEMENTED KiRaiseAssertion
jmp $
.ENDP _KiRaiseAssertion
@ -791,7 +818,8 @@ PUBLIC _KiDebugServiceTrap
.pushframe 0
/* Push pseudo error code */
push 0
.allocstack 0x08
.allocstack 8
.endprolog
ENTER_TRAP_FRAME TRAPFLAG_ALL
@ -815,6 +843,7 @@ PUBLIC _KiDebugServiceTrap
PUBLIC _KiDpcInterrupt
.PROC _KiDpcInterrupt
.pushframe 1
.endprolog
UNIMPLEMENTED KiDpcInterrupt
@ -824,6 +853,7 @@ PUBLIC _KiDpcInterrupt
PUBLIC _KiIpiInterrupt
.PROC _KiIpiInterrupt
.pushframe 1
.endprolog
UNIMPLEMENTED KiIpiInterrupt
@ -833,6 +863,7 @@ PUBLIC _KiIpiInterrupt
PUBLIC _KiUnexpectedInterrupt
.PROC _KiUnexpectedInterrupt
.pushframe 0
.endprolog
/* The error code is the vector */
@ -853,6 +884,10 @@ PUBLIC _KiUnexpectedInterrupt
PUBLIC _KiSystemFatalException
.PROC _KiSystemFatalException
.endprolog
.ENDP _KiSystemFatalException
END