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:
andrew 2019-05-01 17:12:49 +00:00
parent e9fb0d3782
commit b278d30ff0

View File

@ -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"