Explicitly zero cr4 in prepare_64() instead of "zeroing" it in the common enter_long_mode(). Clobbering cr4 in enter_long_mode() breaks switch_to_5level(), which sets cr4.LA57 before calling enter_long_mode() and obviously expects cr4 to be preserved. Fixes: d86ef58 ("cstart: do not assume CR4 starts as zero") Cc: Nadav Amit <namit@xxxxxxxxxx> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> --- Two lines of code, two bugs. I'm pretty sure Paolo should win some kind of award. :-D x86/cstart64.S | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x86/cstart64.S b/x86/cstart64.S index 3ae98d3..2d16688 100644 --- a/x86/cstart64.S +++ b/x86/cstart64.S @@ -175,8 +175,12 @@ prepare_64: lgdt gdt64_desc setup_segments + xor %eax, %eax + mov %eax, %cr4 + enter_long_mode: - mov $(1 << 5), %eax // pae + mov %cr4, %eax + bts $5, %eax // pae mov %eax, %cr4 mov pt_root, %eax -- 2.26.0