On 15/07/20 22:52, Sean Christopherson wrote: > 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 Two lines of code, two bugs immediately before disappearing for two weeks. 2^3 paper bags... Paolo > 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 >