Ok, here's a patch that also makes -kernel-kqemu behave (with the previous patch it would abort with a "triple fault").
Due to the way kqemu sets up the mmu there should never be a GP fault in the mem access operations, so it would normally indicate some breakage and kqemu correctly aborts. However I looked it up in the amd64 specs and there can be a GP fault in a memory access when the sign extend bits ([63:52]) of the address are not in "canonical form" (for instance 0xff00000000000000 is not in canonical form). This patch will make such a GPF be reported to qemu. The patch only affects the x86-64 on x86-64 case.
diff --git a/common/common.c b/common/common.c index 285b072..29443ce 100644 --- a/common/common.c +++ b/common/common.c @@ -242,7 +242,7 @@ static inline uint64_t *mon_get_ptep_l3(struct kqemu_state *s, if (!(pml4e & PG_PRESENT_MASK)) { if (!alloc) return NULL; - /* allocage a new page */ + /* allocate a new page */ ptr = mon_alloc_page(s, &pdp_page_index); if (!ptr) return NULL; diff --git a/common/kqemu_int.h b/common/kqemu_int.h index d881d85..b2f0b6e 100644 --- a/common/kqemu_int.h +++ b/common/kqemu_int.h @@ -1065,6 +1065,9 @@ static inline void stq_fast(struct kqemu_state *s, unsigned long addr, #define MMU_EXCEPTION(label) \ ".section \"mmu_ex_table\", \"a\"\n"\ ".quad " #label "\n"\ + ".previous\n"\ + ".section \"seg_ex_table\", \"a\"\n"\ + ".quad " #label "\n"\ ".previous\n" #else #define MMU_EXCEPTION(label) \ diff --git a/common/monitor.c b/common/monitor.c index ed46845..b3b72dc 100644 --- a/common/monitor.c +++ b/common/monitor.c @@ -1515,6 +1515,10 @@ static void handle_mon_exception(struct kqemu_state *s, /* division exception from interp */ /* XXX: verify for fxsave/fxrstor */ s->regs = &s->regs1; +#ifdef __x86_64__ + } else if (intno == 0x0d && expected_monitor_exception(pc)) { + raise_exception(s, KQEMU_RET_SOFTMMU); +#endif } else { /* Note: the exception state is reliable only for goto_user handling */