Restore x18 in efi_arch_leave.
Some UEFI implementations trash this register and, as we use it as a platform register, the kernel doesn't save it before calling into the UEFI runtime services. As we have a copy in tpidr_el1 restore from there when exiting the EFI environment. PR: 237234, 237055 Reviewed by: manu Tested On: Ampere eMAG MFC after: 2 weeks Sponsored by: DARPA, AFRL Sponsored by: Ampere Computing (hardware) Differential Revision: https://reviews.freebsd.org/D20127
This commit is contained in:
parent
e9fb0d3782
commit
b278d30ff0
@ -259,6 +259,16 @@ efi_arch_leave(void)
|
|||||||
{
|
{
|
||||||
struct thread *td;
|
struct thread *td;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restore the pcpu pointer. Some UEFI implementations trash it and
|
||||||
|
* we don't store it before calling into them. To fix this we need
|
||||||
|
* to restore it after returning to the kernel context. As reading
|
||||||
|
* curthread will access x18 we need to restore it before loading
|
||||||
|
* the thread pointer.
|
||||||
|
*/
|
||||||
|
__asm __volatile(
|
||||||
|
"mrs x18, tpidr_el1 \n"
|
||||||
|
);
|
||||||
td = curthread;
|
td = curthread;
|
||||||
__asm __volatile(
|
__asm __volatile(
|
||||||
"msr ttbr0_el1, %0 \n"
|
"msr ttbr0_el1, %0 \n"
|
||||||
|
Loading…
Reference in New Issue
Block a user