From 8bfb0c8da5b224ebfd4118aad94a68a4c240e344 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 17 Dec 2023 20:24:15 -0500 Subject: kernel/amd64: trap: Fix stack issues This fixes a bug relating to a lack of error code (pushed by hardware) misaligning the stack. Signed-off-by: Ian Moffett --- sys/arch/amd64/trap.S | 18 +++++---------- sys/include/arch/amd64/frameasm.h | 46 ++++++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/sys/arch/amd64/trap.S b/sys/arch/amd64/trap.S index 46e36bb..9dc1f6a 100644 --- a/sys/arch/amd64/trap.S +++ b/sys/arch/amd64/trap.S @@ -37,8 +37,7 @@ __KERNEL_META "$Hyra$: trap.S, Ian Marco Moffett, \ .text .globl breakpoint_handler breakpoint_handler: - push $0 - push_trapframe $TRAP_BREAKPOINT + push_trapframe_ec $TRAP_BREAKPOINT handle_trap @@ -48,8 +47,7 @@ breakpoint_handler: .globl arith_err arith_err: - push $0 - push_trapframe $TRAP_ARITH_ERR + push_trapframe_ec $TRAP_ARITH_ERR handle_trap @@ -59,8 +57,7 @@ arith_err: .globl overflow overflow: - push $0 - push_trapframe $TRAP_OVERFLOW + push_trapframe_ec $TRAP_OVERFLOW handle_trap @@ -70,8 +67,7 @@ overflow: .globl bound_range bound_range: - push $0 - push_trapframe $TRAP_BOUND_RANGE + push_trapframe_ec $TRAP_BOUND_RANGE handle_trap @@ -81,8 +77,7 @@ bound_range: .globl invl_op invl_op: - push $0 - push_trapframe $TRAP_INVLOP + push_trapframe_ec $TRAP_INVLOP handle_trap @@ -142,8 +137,7 @@ page_fault: .globl nmi nmi: - push $0 - push_trapframe $TRAP_NMI + push_trapframe_ec $TRAP_NMI handle_trap diff --git a/sys/include/arch/amd64/frameasm.h b/sys/include/arch/amd64/frameasm.h index bf02d00..2d251e7 100644 --- a/sys/include/arch/amd64/frameasm.h +++ b/sys/include/arch/amd64/frameasm.h @@ -31,21 +31,13 @@ #define _AMD64_FRAMEASM_H_ /* - * XXX: Before this macro is invoked, - * you should determine if an error - * code will be present already on the - * stack. If not, push a null qword as - * padding (e.g push $0). - * - * There *must* be a value used - * as an error code whether that be - * a real error code or just padding. - * - * Failing to do so will result in - * undefined behaviour. + * If the interrupt has an error code, this macro shall + * be used to create the trapframe. * + * XXX: A trapframe created with this must be popped with + * pop_trapframe_ec */ -.macro push_trapframe trapno +.macro push_trapframe_ec trapno push %r15 push %r14 push %r13 @@ -64,7 +56,11 @@ push \trapno .endm -.macro pop_trapframe +/* + * If the interrupt has an error code, this macro shall + * be used to cleanup the trapframe. + */ +.macro pop_trapframe_ec add $8, %rsp /* Trapno */ pop %rax pop %rcx @@ -80,7 +76,27 @@ pop %r13 pop %r14 pop %r15 +.endm + +/* + * If the interrupt has no error code, this macro + * shall be used to create the trapframe. + * + * XXX: A trapframe created with this must be popped + * with pop_trapframe + */ +.macro push_trapframe trapno + push $0 + push_trapframe_ec \trapno +.endm + + +/* + * If the interrupt has no error code, this macro shall + * be used to cleanup the trapframe. + */ +.macro pop_trapframe + pop_trapframe_ec add $8, %rsp /* Pop error code */ - iretq .endm #endif /* !_AMD64_FRAMEASM_H_ */ -- cgit v1.2.3