Re: 4.12 REGRESSION, 4.12 does not boot as VirtualBox guest

From: Hans de Goede
Date: Mon Jun 12 2017 - 12:51:36 EST


Hi,

On 12-06-17 13:52, Peter Zijlstra wrote:
On Mon, Jun 12, 2017 at 10:16:53AM +0200, Thomas Gleixner wrote:
On Sat, 10 Jun 2017, Linus Torvalds wrote:

On Fri, Jun 9, 2017 at 3:33 AM, Hans de Goede <hdegoede@xxxxxxxxxx> wrote:

Sorry for escalating this right up to you, but this issue
does not seem to be getting any attention and I'm not sure
which subsys maintainer to poke about this.

Looks like x86. Added people.

The problem is that the 4.12-rc# kernels fail to boot on
VirtualBox guests hosted on any machine with a Sky Lake
(and probably also a Kaby Lake) CPU, for details see:

https://bugzilla.kernel.org/show_bug.cgi?id=195961

Looks like the WARN/BUG rework. Peter????

I wasn't aware we'd call WARN _that_ early. Does something like so make
it work?

Yes it does, with this patch the oops is back (unrelated problem) and
the kernel boots again :)

You can add my:

Tested-by: Hans de Goede <hdegoede@xxxxxxxxxx>

Regards,

Hans




---
arch/x86/include/asm/extable.h | 1 +
arch/x86/kernel/traps.c | 2 +-
arch/x86/mm/extable.c | 3 +++
3 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/extable.h b/arch/x86/include/asm/extable.h
index b8ad261d11dc..c66d19e3c23e 100644
--- a/arch/x86/include/asm/extable.h
+++ b/arch/x86/include/asm/extable.h
@@ -29,6 +29,7 @@ struct pt_regs;
} while (0)
extern int fixup_exception(struct pt_regs *regs, int trapnr);
+extern int fixup_bug(struct pt_regs *regs, int trapnr);
extern bool ex_has_fault_handler(unsigned long ip);
extern void early_fixup_exception(struct pt_regs *regs, int trapnr);
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 3995d3a777d4..bf54309b85da 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -182,7 +182,7 @@ int is_valid_bugaddr(unsigned long addr)
return ud == INSN_UD0 || ud == INSN_UD2;
}
-static int fixup_bug(struct pt_regs *regs, int trapnr)
+int fixup_bug(struct pt_regs *regs, int trapnr)
{
if (trapnr != X86_TRAP_UD)
return 0;
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index 35ea061010a1..0ea8afcb929c 100644
--- a/arch/x86/mm/extable.c
+++ b/arch/x86/mm/extable.c
@@ -162,6 +162,9 @@ void __init early_fixup_exception(struct pt_regs *regs, int trapnr)
if (fixup_exception(regs, trapnr))
return;
+ if (fixup_bug(regs, trapnr))
+ return;
+
fail:
early_printk("PANIC: early exception 0x%02x IP %lx:%lx error %lx cr2 0x%lx\n",
(unsigned)trapnr, (unsigned long)regs->cs, regs->ip,