[PATCH v2] Align SBI trap registers to a nice boundary for performance reasons.
Raj Vishwanathan
raj.vishwanathan at gmail.com
Thu Feb 6 11:22:40 PST 2025
Align SBI_TRAP_CONTEXT_SIZE to a multiple of 16 bytes. If it is not
aligned to 16 bytes for RV64, it can create performance problems.
Aligning it correctly can fix the performance issues.
Signed-off-by: Raj Vishwanathan <Raj.Vishwanathan at gmail.com>
--
Test: Performance issues seen and fix Verified on FPGA.
Other methods.
Run qemu with monitor to check the SP during cpu_in
and cpu_out.
Add sbi_printf to the function sbi_trap_handler to check
the alignment of sbi_trap_context
---
include/sbi/sbi_trap.h | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h
index d5182bf..82e9c08 100644
--- a/include/sbi/sbi_trap.h
+++ b/include/sbi/sbi_trap.h
@@ -112,13 +112,16 @@
/** Size (in bytes) of sbi_trap_info */
#define SBI_TRAP_INFO_SIZE SBI_TRAP_INFO_OFFSET(last)
+/** Stack pointer is aligned to 16 bytes */
+#define STACK_BOUNDARY 16
+#define ALIGN_TO_BOUNDARY(x,a) (((x) + (a) - 1) & ~((a) - 1))
+
/** Size (in bytes) of sbi_trap_context */
-#define SBI_TRAP_CONTEXT_SIZE (SBI_TRAP_REGS_SIZE + \
- SBI_TRAP_INFO_SIZE + \
- __SIZEOF_POINTER__)
+#define SBI_TRAP_CONTEXT_SIZE ALIGN_TO_BOUNDARY((SBI_TRAP_REGS_SIZE + \
+ SBI_TRAP_INFO_SIZE + \
+ __SIZEOF_POINTER__),STACK_BOUNDARY)
#ifndef __ASSEMBLER__
-
#include <sbi/sbi_types.h>
#include <sbi/sbi_scratch.h>
--
2.43.0
More information about the opensbi
mailing list