mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 03:05:40 +00:00
[KE]
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:
parent
ea9bdd25e8
commit
c8743e677e
1 changed files with 29 additions and 38 deletions
|
@ -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 ***********************************************/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue