eeb89e2bb1
When PTI is enabled on x86-32 the kernel uses the GDT mapped in the fixmap
for the simple reason that this address is also mapped for user-space.
The efi_call_phys_prolog()/efi_call_phys_epilog() wrappers change the GDT
to call EFI runtime services and switch back to the kernel GDT when they
return. But the switch-back uses the writable GDT, not the fixmap GDT.
When that happened and and the CPU returns to user-space it switches to the
user %cr3 and tries to restore user segment registers. This fails because
the writable GDT is not mapped in the user page-table, and without a GDT
the fault handlers also can't be launched. The result is a triple fault and
reboot of the machine.
Fix that by restoring the GDT back to the fixmap GDT which is also mapped
in the user page-table.
Fixes:
|
||
---|---|---|
.. | ||
atom | ||
ce4100 | ||
efi | ||
geode | ||
goldfish | ||
intel | ||
intel-mid | ||
intel-quark | ||
iris | ||
olpc | ||
scx200 | ||
sfi | ||
ts5500 | ||
uv | ||
Makefile |