On Tue, Apr 12, 2022, Varad Gautam wrote: > These can be shared across EFI and non-EFI builds. > > Signed-off-by: Varad Gautam <varad.gautam@xxxxxxxx> > --- > diff --git a/x86/start32.S b/x86/start32.S > new file mode 100644 > index 0000000..9e00474 > --- /dev/null > +++ b/x86/start32.S > @@ -0,0 +1,62 @@ > +/* Common 32-bit code between EFI and non-EFI bootstrapping. */ > + > +.code32 > + > +MSR_GS_BASE = 0xc0000101 > + > +.macro setup_percpu_area > + lea -4096(%esp), %eax > + mov $0, %edx > + mov $MSR_GS_BASE, %ecx > + wrmsr > +.endm > + > +.macro setup_segments > + mov $MSR_GS_BASE, %ecx > + rdmsr > + > + mov $0x10, %bx > + mov %bx, %ds > + mov %bx, %es > + mov %bx, %fs > + mov %bx, %gs > + mov %bx, %ss > + > + /* restore MSR_GS_BASE */ > + wrmsr > +.endm > + > +prepare_64: > + lgdt gdt_descr > + setup_segments > + > + xor %eax, %eax > + mov %eax, %cr4 > + > +enter_long_mode: > + mov %cr4, %eax > + bts $5, %eax // pae > + mov %eax, %cr4 > + > + mov pt_root, %eax > + mov %eax, %cr3 > + > +efer = 0xc0000080 > + mov $efer, %ecx > + rdmsr > + bts $8, %eax > + wrmsr > + > + mov %cr0, %eax > + bts $0, %eax > + bts $31, %eax > + mov %eax, %cr0 > + ret > + > +ap_start32: > + setup_segments > + mov $-4096, %esp > + lock xaddl %esp, smp_stacktop > + setup_percpu_area > + call prepare_64 I suspect this will conflict with my idea of using a dedicated percpu area. But can't that be remedied by adding a prep patch to drop setup_percpu_area and add a C helper to the setup (using the dedicated area), called from ap_start64()? I don't see any instances of gs: being used before reset_apic(). Then the funky save/restore of MSR_GS_BASE also disappears. > + ljmpl $8, $ap_start64 > -- > 2.32.0 >