[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v9 4/5] xen/riscv: enable GENERIC_BUG_FRAME
On 02.07.2024 13:23, Oleksii Kurochko wrote: > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx> > --- > xen/arch/riscv/Kconfig | 1 + > xen/arch/riscv/traps.c | 31 +++++++++++++++++++++++++++++++ > xen/common/bug.c | 1 + > 3 files changed, 33 insertions(+) > > diff --git a/xen/arch/riscv/Kconfig b/xen/arch/riscv/Kconfig > index b4b354a778..74ad019fe7 100644 > --- a/xen/arch/riscv/Kconfig > +++ b/xen/arch/riscv/Kconfig > @@ -5,6 +5,7 @@ config RISCV > config RISCV_64 > def_bool y > select 64BIT > + select GENERIC_BUG_FRAME Any particular reason to put this here, and not higher up with RISCV? > @@ -101,8 +102,38 @@ static void do_unexpected_trap(const struct > cpu_user_regs *regs) > die(); > } > > +static bool is_valid_bug_insn(uint32_t insn) > +{ > + return insn == BUG_INSN_32 || > + (insn & COMPRESSED_INSN_MASK) == BUG_INSN_16; > +} > + > +/* Should be used only on Xen code */ > +static uint32_t read_instr(unsigned long pc) > +{ > + uint16_t instr16 = *(uint16_t *)pc; > + > + ASSERT(is_kernel_text(pc + 1) || is_kernel_inittext(pc + 1)); > + > + if ( GET_INSN_LENGTH(instr16) == 2 ) > + return instr16; > + > + ASSERT(is_kernel_text(pc + 3) || is_kernel_inittext(pc + 3)); > + > + return *(uint32_t *)pc; > +} Related to the point made further down: If either of these assertions fails, won't we come back again right here? If either of the is_kernel_*text() wasn't working quite right, wouldn't we be at risk of entering an infinite loop (presumably not quite infinite because of the stack overflowing at some point)? > void do_trap(struct cpu_user_regs *cpu_regs) > { > + register_t pc = cpu_regs->sepc; > + uint32_t instr = read_instr(pc); > + > + if ( ( is_valid_bug_insn(instr) ) && ( do_bug_frame(cpu_regs, pc) >= 0 ) > ) No consideration of the kind of exception? I'd expect it is one very specific one which the BUG insn would raise, and then there's no point fetching the insn when it's a different kind of exception. Further, nit: Certainly no need for the parentheses on the lhs of the &&. Having them on the rhs is a matter of taste, so okay, but then the blanks immediately inside will want dropping. > --- a/xen/common/bug.c > +++ b/xen/common/bug.c > @@ -1,6 +1,7 @@ > #include <xen/bug.h> > #include <xen/errno.h> > #include <xen/kernel.h> > +#include <xen/lib.h> > #include <xen/livepatch.h> > #include <xen/string.h> > #include <xen/types.h> Unrelated change? Or did you simply forget to mention in the description why it's needed? Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |