|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v6 4/6] xen/riscv: introduce trap_init()
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
Reviewed-by: Alistair Francis <alistair.francis@xxxxxxx>
---
Changes in V6:
- trap_init() is now called after enabling the MMU.
- Add additional explanatory comments.
---
Changes in V5:
- Nothing changed
---
Changes in V4:
- Nothing changed
---
Changes in V3:
- Nothing changed
---
Changes in V2:
- Rename setup_trap_handler() to trap_init().
- Add Reviewed-by to the commit message.
---
xen/arch/riscv/include/asm/traps.h | 1 +
xen/arch/riscv/setup.c | 3 +++
xen/arch/riscv/traps.c | 25 +++++++++++++++++++++++++
3 files changed, 29 insertions(+)
diff --git a/xen/arch/riscv/include/asm/traps.h
b/xen/arch/riscv/include/asm/traps.h
index f3fb6b25d1..f1879294ef 100644
--- a/xen/arch/riscv/include/asm/traps.h
+++ b/xen/arch/riscv/include/asm/traps.h
@@ -7,6 +7,7 @@
void do_trap(struct cpu_user_regs *cpu_regs);
void handle_trap(void);
+void trap_init(void);
#endif /* __ASSEMBLY__ */
diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
index 845d18d86f..1cae0e5ccc 100644
--- a/xen/arch/riscv/setup.c
+++ b/xen/arch/riscv/setup.c
@@ -3,6 +3,7 @@
#include <asm/early_printk.h>
#include <asm/mm.h>
+#include <asm/traps.h>
/* Xen stack for bringing up the first CPU. */
unsigned char __initdata cpu0_boot_stack[STACK_SIZE]
@@ -25,6 +26,8 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
void __init noreturn cont_after_mmu_is_enabled(void)
{
+ trap_init();
+
early_printk("All set up\n");
for ( ;; )
diff --git a/xen/arch/riscv/traps.c b/xen/arch/riscv/traps.c
index ea1012e83e..48c1059954 100644
--- a/xen/arch/riscv/traps.c
+++ b/xen/arch/riscv/traps.c
@@ -12,6 +12,31 @@
#include <asm/processor.h>
#include <asm/traps.h>
+#define cast_to_bug_frame(addr) \
+ (const struct bug_frame *)(addr)
+
+/*
+ * Initialize the trap handling.
+ *
+ * The function is called after MMU is enabled.
+ */
+void trap_init(void)
+{
+ /*
+ * When the MMU is off, addr varialbe will be a physical address otherwise
+ * it would be a virtual address.
+ *
+ * It will work fine as:
+ * - access to addr is PC-relative.
+ * - -nopie is used. -nopie really suppresses the compiler emitting
+ * code going through .got (which then indeed would mean using absolute
+ * addresses).
+ */
+ unsigned long addr = (unsigned long)&handle_trap;
+
+ csr_write(CSR_STVEC, addr);
+}
+
static const char *decode_trap_cause(unsigned long cause)
{
static const char *const trap_causes[] = {
--
2.40.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |