[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: dom0 PV looping on search_pre_exception_table()
On 08/12/2020 17:57, Manuel Bouyer wrote: > Hello, > for the first time I tried to boot a xen kernel from devel with > a NetBSD PV dom0. The kernel boots, but when the first userland prcess > is launched, it seems to enter a loop involving search_pre_exception_table() > (I see an endless stream from the dprintk() at arch/x86/extable.c:202) > > With xen 4.13 I see it, but exactly once: > (XEN) extable.c:202: Pre-exception: ffff82d08038c304 -> ffff82d08038c8c8 > > with devel: > (XEN) extable.c:202: Pre-exception: ffff82d040393309 -> ffff82d0403938c8 > > (XEN) extable.c:202: Pre-exception: ffff82d040393309 -> ffff82d0403938c8 > > (XEN) extable.c:202: Pre-exception: ffff82d040393309 -> ffff82d0403938c8 > > (XEN) extable.c:202: Pre-exception: ffff82d040393309 -> ffff82d0403938c8 > > (XEN) extable.c:202: Pre-exception: ffff82d040393309 -> ffff82d0403938c8 > > [...] > > the dom0 kernel is the same. > > At first glance it looks like a fault in the guest is not handled at it > should, > and the userland process keeps faulting on the same address. > > Any idea what to look at ? That is a reoccurring fault on IRET back to guest context, and is probably caused by some unwise-in-hindsight cleanup which doesn't escalate the failure to the failsafe callback. This ought to give something useful to debug with: ~Andrew diff --git a/xen/arch/x86/extable.c b/xen/arch/x86/extable.c index 70972f1085..62a7bcbe38 100644 --- a/xen/arch/x86/extable.c +++ b/xen/arch/x86/extable.c @@ -191,6 +191,10 @@ static int __init stub_selftest(void) __initcall(stub_selftest); #endif +#include <xen/sched.h> +#include <xen/softirq.h> +const char *vec_name(unsigned int vec); + unsigned long search_pre_exception_table(struct cpu_user_regs *regs) { @@ -199,7 +203,13 @@ search_pre_exception_table(struct cpu_user_regs *regs) __start___pre_ex_table, __stop___pre_ex_table-1, addr); if ( fixup ) { - dprintk(XENLOG_INFO, "Pre-exception: %p -> %p\n", _p(addr), _p(fixup)); + printk(XENLOG_ERR "IRET fault: %s[%04x]\n", + vec_name(regs->entry_vector), regs->error_code); + + domain_crash(current->domain); + for ( ;; ) + do_softirq(); + perfc_incr(exception_fixed); } return fixup; diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 0459cee9fb..1059f3ce66 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -687,7 +687,7 @@ const char *trapstr(unsigned int trapnr) return trapnr < ARRAY_SIZE(strings) ? strings[trapnr] : "???"; } -static const char *vec_name(unsigned int vec) +const char *vec_name(unsigned int vec) { static const char names[][4] = { #define P(x) [X86_EXC_ ## x] = "#" #x
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |