[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 07/14] xen/riscv: introduce exception handlers implementation
The patch introduces an implementation of basic exception handlers: - to save/restore context - to handle an exception itself. The handler calls wait_for_interrupt now, nothing more. Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> --- xen/arch/riscv/Makefile | 2 + xen/arch/riscv/entry.S | 97 ++++++++++++++++++++++++++++++ xen/arch/riscv/include/asm/traps.h | 13 ++++ xen/arch/riscv/traps.c | 13 ++++ 4 files changed, 125 insertions(+) create mode 100644 xen/arch/riscv/entry.S create mode 100644 xen/arch/riscv/include/asm/traps.h create mode 100644 xen/arch/riscv/traps.c diff --git a/xen/arch/riscv/Makefile b/xen/arch/riscv/Makefile index 1a4f1a6015..443f6bf15f 100644 --- a/xen/arch/riscv/Makefile +++ b/xen/arch/riscv/Makefile @@ -1,7 +1,9 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o +obj-y += entry.o obj-$(CONFIG_RISCV_64) += riscv64/ obj-y += sbi.o obj-y += setup.o +obj-y += traps.o $(TARGET): $(TARGET)-syms $(OBJCOPY) -O binary -S $< $@ diff --git a/xen/arch/riscv/entry.S b/xen/arch/riscv/entry.S new file mode 100644 index 0000000000..f7d46f42bb --- /dev/null +++ b/xen/arch/riscv/entry.S @@ -0,0 +1,97 @@ +#include <asm/asm.h> +#include <asm/processor.h> +#include <asm/riscv_encoding.h> +#include <asm/traps.h> + + .global handle_exception + .align 4 + +handle_exception: + + /* Exceptions from xen */ +save_to_stack: + /* Save context to stack */ + REG_S sp, (RISCV_CPU_USER_REGS_OFFSET(sp) - RISCV_CPU_USER_REGS_SIZE) (sp) + addi sp, sp, -RISCV_CPU_USER_REGS_SIZE + REG_S t0, RISCV_CPU_USER_REGS_OFFSET(t0)(sp) + j save_context + +save_context: + /* Save registers */ + REG_S ra, RISCV_CPU_USER_REGS_OFFSET(ra)(sp) + REG_S gp, RISCV_CPU_USER_REGS_OFFSET(gp)(sp) + REG_S t1, RISCV_CPU_USER_REGS_OFFSET(t1)(sp) + REG_S t2, RISCV_CPU_USER_REGS_OFFSET(t2)(sp) + REG_S s0, RISCV_CPU_USER_REGS_OFFSET(s0)(sp) + REG_S s1, RISCV_CPU_USER_REGS_OFFSET(s1)(sp) + REG_S a0, RISCV_CPU_USER_REGS_OFFSET(a0)(sp) + REG_S a1, RISCV_CPU_USER_REGS_OFFSET(a1)(sp) + REG_S a2, RISCV_CPU_USER_REGS_OFFSET(a2)(sp) + REG_S a3, RISCV_CPU_USER_REGS_OFFSET(a3)(sp) + REG_S a4, RISCV_CPU_USER_REGS_OFFSET(a4)(sp) + REG_S a5, RISCV_CPU_USER_REGS_OFFSET(a5)(sp) + REG_S a6, RISCV_CPU_USER_REGS_OFFSET(a6)(sp) + REG_S a7, RISCV_CPU_USER_REGS_OFFSET(a7)(sp) + REG_S s2, RISCV_CPU_USER_REGS_OFFSET(s2)(sp) + REG_S s3, RISCV_CPU_USER_REGS_OFFSET(s3)(sp) + REG_S s4, RISCV_CPU_USER_REGS_OFFSET(s4)(sp) + REG_S s5, RISCV_CPU_USER_REGS_OFFSET(s5)(sp) + REG_S s6, RISCV_CPU_USER_REGS_OFFSET(s6)(sp) + REG_S s7, RISCV_CPU_USER_REGS_OFFSET(s7)(sp) + REG_S s8, RISCV_CPU_USER_REGS_OFFSET(s8)(sp) + REG_S s9, RISCV_CPU_USER_REGS_OFFSET(s9)(sp) + REG_S s10, RISCV_CPU_USER_REGS_OFFSET(s10)(sp) + REG_S s11, RISCV_CPU_USER_REGS_OFFSET(s11)(sp) + REG_S t3, RISCV_CPU_USER_REGS_OFFSET(t3)(sp) + REG_S t4, RISCV_CPU_USER_REGS_OFFSET(t4)(sp) + REG_S t5, RISCV_CPU_USER_REGS_OFFSET(t5)(sp) + REG_S t6, RISCV_CPU_USER_REGS_OFFSET(t6)(sp) + csrr t0, CSR_SEPC + REG_S t0, RISCV_CPU_USER_REGS_OFFSET(sepc)(sp) + csrr t0, CSR_SSTATUS + REG_S t0, RISCV_CPU_USER_REGS_OFFSET(sstatus)(sp) + + mv a0, sp + jal __handle_exception + +restore_registers: + /* Restore stack_cpu_regs */ + REG_L t0, RISCV_CPU_USER_REGS_OFFSET(sepc)(sp) + csrw CSR_SEPC, t0 + REG_L t0, RISCV_CPU_USER_REGS_OFFSET(sstatus)(sp) + csrw CSR_SSTATUS, t0 + + REG_L ra, RISCV_CPU_USER_REGS_OFFSET(ra)(sp) + REG_L gp, RISCV_CPU_USER_REGS_OFFSET(gp)(sp) + REG_L t0, RISCV_CPU_USER_REGS_OFFSET(t0)(sp) + REG_L t1, RISCV_CPU_USER_REGS_OFFSET(t1)(sp) + REG_L t2, RISCV_CPU_USER_REGS_OFFSET(t2)(sp) + REG_L s0, RISCV_CPU_USER_REGS_OFFSET(s0)(sp) + REG_L s1, RISCV_CPU_USER_REGS_OFFSET(s1)(sp) + REG_L a0, RISCV_CPU_USER_REGS_OFFSET(a0)(sp) + REG_L a1, RISCV_CPU_USER_REGS_OFFSET(a1)(sp) + REG_L a2, RISCV_CPU_USER_REGS_OFFSET(a2)(sp) + REG_L a3, RISCV_CPU_USER_REGS_OFFSET(a3)(sp) + REG_L a4, RISCV_CPU_USER_REGS_OFFSET(a4)(sp) + REG_L a5, RISCV_CPU_USER_REGS_OFFSET(a5)(sp) + REG_L a6, RISCV_CPU_USER_REGS_OFFSET(a6)(sp) + REG_L a7, RISCV_CPU_USER_REGS_OFFSET(a7)(sp) + REG_L s2, RISCV_CPU_USER_REGS_OFFSET(s2)(sp) + REG_L s3, RISCV_CPU_USER_REGS_OFFSET(s3)(sp) + REG_L s4, RISCV_CPU_USER_REGS_OFFSET(s4)(sp) + REG_L s5, RISCV_CPU_USER_REGS_OFFSET(s5)(sp) + REG_L s6, RISCV_CPU_USER_REGS_OFFSET(s6)(sp) + REG_L s7, RISCV_CPU_USER_REGS_OFFSET(s7)(sp) + REG_L s8, RISCV_CPU_USER_REGS_OFFSET(s8)(sp) + REG_L s9, RISCV_CPU_USER_REGS_OFFSET(s9)(sp) + REG_L s10, RISCV_CPU_USER_REGS_OFFSET(s10)(sp) + REG_L s11, RISCV_CPU_USER_REGS_OFFSET(s11)(sp) + REG_L t3, RISCV_CPU_USER_REGS_OFFSET(t3)(sp) + REG_L t4, RISCV_CPU_USER_REGS_OFFSET(t4)(sp) + REG_L t5, RISCV_CPU_USER_REGS_OFFSET(t5)(sp) + REG_L t6, RISCV_CPU_USER_REGS_OFFSET(t6)(sp) + + /* Restore sp */ + REG_L sp, RISCV_CPU_USER_REGS_OFFSET(sp)(sp) + + sret diff --git a/xen/arch/riscv/include/asm/traps.h b/xen/arch/riscv/include/asm/traps.h new file mode 100644 index 0000000000..816ab1178a --- /dev/null +++ b/xen/arch/riscv/include/asm/traps.h @@ -0,0 +1,13 @@ +#ifndef __ASM_TRAPS_H__ +#define __ASM_TRAPS_H__ + +#include <asm/processor.h> + +#ifndef __ASSEMBLY__ + +void __handle_exception(struct cpu_user_regs *cpu_regs); +void handle_exception(void); + +#endif /* __ASSEMBLY__ */ + +#endif /* __ASM_TRAPS_H__ */ diff --git a/xen/arch/riscv/traps.c b/xen/arch/riscv/traps.c new file mode 100644 index 0000000000..3201b851ef --- /dev/null +++ b/xen/arch/riscv/traps.c @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2023 Vates + * + * RISC-V Trap handlers + */ +#include <asm/processor.h> +#include <asm/traps.h> + +void __handle_exception(struct cpu_user_regs *cpu_regs) +{ + wait_for_interrupt(); +} -- 2.39.0
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |