Make trap handling cleaner / simplify stack layout by using the P1Home ... P5 members of KTRAP_FRAME and KEXCEPTION_FRAME as save area for function parameters.

svn path=/branches/ros-amd64-bringup/; revision=44781
This commit is contained in:
Timo Kreuzer 2009-12-28 00:37:29 +00:00
parent ea9bdd25e8
commit c8743e677e

View file

@ -67,13 +67,9 @@ _MsgTrapInfo:
* |-------------------| * |-------------------|
* | KTRAP_FRAME | * | KTRAP_FRAME |
* |-------------------| <- rbp * |-------------------| <- rbp
* | 0x20 bytes params |
* |-------------------|
* | KEXCEPTION_FRAME |
* |-------------------|
* | EXCEPTION_RECORD | * | EXCEPTION_RECORD |
* |-------------------| * |-------------------|
* | 0x28 bytes params | * | KEXCEPTION_FRAME |
* |-------------------| <- rsp * |-------------------| <- rsp
* *
*/ */
@ -84,7 +80,7 @@ _MsgTrapInfo:
.macro ENTER_TRAP_FRAME AllocSize Flags .macro ENTER_TRAP_FRAME AllocSize Flags
.set SIZE_INITIAL_FRAME, 7 * 8 .set SIZE_INITIAL_FRAME, 7 * 8
//.set SIZE_LOCAL_DATA, SIZE_EXCEPTION_RECORD + 0x28 //.set SIZE_LOCAL_DATA, SIZE_EXCEPTION_RECORD + 0x28
.set SIZE_TRAP_FRAME_ALLOC, SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME + \AllocSize .set SIZE_TRAP_FRAME_ALLOC, SIZE_KTRAP_FRAME - SIZE_INITIAL_FRAME
.set TRAPFLAGS, \Flags .set TRAPFLAGS, \Flags
/* Save rbp */ /* Save rbp */
@ -96,13 +92,7 @@ _MsgTrapInfo:
.allocstack SIZE_TRAP_FRAME_ALLOC .allocstack SIZE_TRAP_FRAME_ALLOC
/* Point rbp to the KTRAP_FRAME */ /* Point rbp to the KTRAP_FRAME */
lea rbp, [rsp + \AllocSize] lea rbp, [rsp]
// KTRAP_FRAME_P1Home
// KTRAP_FRAME_P2Home
// KTRAP_FRAME_P3Home
// KTRAP_FRAME_P4Home
// KTRAP_FRAME_P5
.if (TRAPFLAGS & TRAPFLAG_NONVOLATILES) .if (TRAPFLAGS & TRAPFLAG_NONVOLATILES)
/* Save non-volatile registers */ /* Save non-volatile registers */
@ -249,42 +239,43 @@ _MsgTrapInfo:
_InternalDispatchException: _InternalDispatchException:
/* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */ /* Allocate stack space for EXCEPTION_RECORD and KEXCEPTION_FRAME */
sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME + 0x28 sub rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
/* Set up EXCEPTION_RECORD */ /* Set up EXCEPTION_RECORD */
mov [rsp + 0x28 + EXCEPTION_RECORD_ExceptionCode], ecx mov eax, ecx
lea rcx, [rsp + SIZE_KEXCEPTION_FRAME]
mov [rcx + EXCEPTION_RECORD_ExceptionCode], eax
xor rax, rax xor rax, rax
mov [rsp + 0x28 + EXCEPTION_RECORD_ExceptionFlags], eax mov [rcx + EXCEPTION_RECORD_ExceptionFlags], eax
mov [rsp + 0x28 + EXCEPTION_RECORD_ExceptionRecord], rax mov [rcx + EXCEPTION_RECORD_ExceptionRecord], rax
mov rax, [rbp + KTRAP_FRAME_Rip] mov rax, [rbp + KTRAP_FRAME_Rip]
mov [rsp + 0x28 + EXCEPTION_RECORD_ExceptionAddress], rax mov [rcx + EXCEPTION_RECORD_ExceptionAddress], rax
mov [rsp + 0x28 + EXCEPTION_RECORD_NumberParameters], edx mov [rcx + EXCEPTION_RECORD_NumberParameters], edx
mov [rsp + 0x28 + EXCEPTION_RECORD_ExceptionInformation + 0x00], r9 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x00], r9
mov [rsp + 0x28 + EXCEPTION_RECORD_ExceptionInformation + 0x08], r10 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x08], r10
mov [rsp + 0x28 + EXCEPTION_RECORD_ExceptionInformation + 0x10], r11 mov [rcx + EXCEPTION_RECORD_ExceptionInformation + 0x10], r11
/* Set up KEXCEPTION_FRAME */ /* Set up KEXCEPTION_FRAME */
lea rdx, [rsp + 0x28 + SIZE_EXCEPTION_RECORD]
mov rax, [rbp + KTRAP_FRAME_Rbp] mov rax, [rbp + KTRAP_FRAME_Rbp]
mov [rdx + KEXCEPTION_FRAME_Rbp], rax mov [rsp + KEXCEPTION_FRAME_Rbp], rax
mov [rdx + KEXCEPTION_FRAME_Rbx], rbx mov [rsp + KEXCEPTION_FRAME_Rbx], rbx
mov [rdx + KEXCEPTION_FRAME_Rdi], rdi mov [rsp + KEXCEPTION_FRAME_Rdi], rdi
mov [rdx + KEXCEPTION_FRAME_Rsi], rsi mov [rsp + KEXCEPTION_FRAME_Rsi], rsi
mov [rdx + KEXCEPTION_FRAME_R12], r12 mov [rsp + KEXCEPTION_FRAME_R12], r12
mov [rdx + KEXCEPTION_FRAME_R13], r13 mov [rsp + KEXCEPTION_FRAME_R13], r13
mov [rdx + KEXCEPTION_FRAME_R14], r14 mov [rsp + KEXCEPTION_FRAME_R14], r14
mov [rdx + KEXCEPTION_FRAME_R15], r15 mov [rsp + KEXCEPTION_FRAME_R15], r15
mov qword ptr [rdx + KEXCEPTION_FRAME_Return], 0 mov qword ptr [rsp + KEXCEPTION_FRAME_Return], 0
/* Call KiDispatchException */ /* Call KiDispatchException */
lea rcx, [rsp + 0x28] // ExceptionRecord // rcx already points to ExceptionRecord
// rdx already points to ExceptionFrame mov rdx, rsp // ExceptionFrame
mov r8, rbp // TrapFrame mov r8, rbp // TrapFrame
mov r9b, [r8 + KTRAP_FRAME_PreviousMode] // PreviousMode mov r9b, [r8 + KTRAP_FRAME_PreviousMode] // PreviousMode
mov byte ptr [rsp + 0x20], 1 // FirstChance mov byte ptr [rsp + KEXCEPTION_FRAME_P5], 1 // FirstChance
call _KiDispatchException call _KiDispatchException
add rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME + 0x28 add rsp, SIZE_EXCEPTION_RECORD + SIZE_KEXCEPTION_FRAME
ret ret
/* SOFTWARE INTERRUPT SERVICES ***********************************************/ /* SOFTWARE INTERRUPT SERVICES ***********************************************/