Commit 6b9c98e6 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Catalin Marinas
Browse files

arm64/efi: Move uaccess en/disable out of efi_set_pgd()



efi_set_pgd() will no longer be called when invoking EFI runtime
services via the efi_rts_wq work queue, but the uaccess en/disable are
still needed when using PAN emulation using TTBR0 switching. So move
these into the callers.

Acked-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 1068cb52
Loading
Loading
Loading
Loading
+3 −10
Original line number Diff line number Diff line
@@ -126,21 +126,14 @@ static inline void efi_set_pgd(struct mm_struct *mm)
		if (mm != current->active_mm) {
			/*
			 * Update the current thread's saved ttbr0 since it is
			 * restored as part of a return from exception. Enable
			 * access to the valid TTBR0_EL1 and invoke the errata
			 * workaround directly since there is no return from
			 * exception when invoking the EFI run-time services.
			 * restored as part of a return from exception.
			 */
			update_saved_ttbr0(current, mm);
			uaccess_ttbr0_enable();
			post_ttbr_update_workaround();
		} else {
			/*
			 * Defer the switch to the current thread's TTBR0_EL1
			 * until uaccess_enable(). Restore the current
			 * thread's saved ttbr0 corresponding to its active_mm
			 * Restore the current thread's saved ttbr0
			 * corresponding to its active_mm
			 */
			uaccess_ttbr0_disable();
			update_saved_ttbr0(current, current->active_mm);
		}
	}
+18 −0
Original line number Diff line number Diff line
@@ -169,12 +169,30 @@ void arch_efi_call_virt_setup(void)
{
	efi_runtime_assert_lock_held();
	efi_virtmap_load();

	/*
	 * Enable access to the valid TTBR0_EL1 and invoke the errata
	 * workaround directly since there is no return from exception when
	 * invoking the EFI run-time services.
	 */
	uaccess_ttbr0_enable();
	post_ttbr_update_workaround();

	__efi_fpsimd_begin();
}

void arch_efi_call_virt_teardown(void)
{
	__efi_fpsimd_end();

	/*
	 * Defer the switch to the current thread's TTBR0_EL1 until
	 * uaccess_enable(). Do so before efi_virtmap_unload() updates the
	 * saved TTBR0 value, so the userland page tables are not activated
	 * inadvertently over the back of an exception.
	 */
	uaccess_ttbr0_disable();

	efi_virtmap_unload();
}