Module Name: src Committed By: skrll Date: Fri Jun 23 12:11:22 UTC 2023
Modified Files: src/sys/arch/riscv/include: frame.h Log Message: Pad the trapframe so it's a multiple of 16 bytes so that when a trapframe is created on the stack SP remains 16-byte aligned as per the ABI requirements. Patch from Rin with some updates from me. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/riscv/include/frame.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/riscv/include/frame.h diff -u src/sys/arch/riscv/include/frame.h:1.5 src/sys/arch/riscv/include/frame.h:1.6 --- src/sys/arch/riscv/include/frame.h:1.5 Sun May 7 12:41:48 2023 +++ src/sys/arch/riscv/include/frame.h Fri Jun 23 12:11:22 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: frame.h,v 1.5 2023/05/07 12:41:48 skrll Exp $ */ +/* $NetBSD: frame.h,v 1.6 2023/06/23 12:11:22 skrll Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -39,6 +39,7 @@ struct trapframe { register_t tf_tval; // supervisor trap value register_t tf_cause; // supervisor cause register register_t tf_sr; // supervisor status register + register_t tf_pad; // For 16-byte alignment #define tf_reg tf_regs.r_reg #define tf_pc tf_regs.r_pc #define tf_ra tf_reg[_X_RA] @@ -74,6 +75,12 @@ struct trapframe { #define tf_t6 tf_reg[_X_T6] }; +/* + * Ensure the trapframe is a multiple of 16bytes so that stack + * alignment is preserved. + */ +__CTASSERT((sizeof(struct trapframe) & (16 - 1)) == 0); + #ifdef _LP64 // For COMPAT_NETBSD32 coredumps struct trapframe32 { @@ -81,11 +88,11 @@ struct trapframe32 { register32_t tf_tval; register32_t tf_cause; register32_t tf_sr; + register32_t tf_pad; }; #endif - #define lwp_trapframe(l) ((l)->l_md.md_utf)