[PATCHv4 07/17] arm64: sdei: explicitly simulate PAN/UAO entry

James Morse james.morse at arm.com
Thu Nov 26 13:42:46 EST 2020


Hi Mark,

On 13/11/2020 12:49, Mark Rutland wrote:
> SDEI enters the kernel with a non-architectural exception which does not
> manipulate PSTATE bits (e.g. PAN, UAO) in the same way as architectural
> exceptions. We currently fix this up with a combination of
> __uaccess_enable_hw_pan() and force_uaccess_access_begin(), but this has
> a few problems:
> 
> * When set_fs() is removed, force_uaccess_begin() will have no HW
>   side-effects, and UAO will need to be reset elsewhere.
> 
> * Kernels built without support for PAN or UAO will not reset these bits
>   upon SDEI entry, and may inherit the values used by a VM, leading to
>   unexpected behaviour.
> 
> * Kernels built *with* support for PAN or UAO, when run on systems with
>   mismatched support across CPUs, will not reset these bits upon SDEI
>   entry, and may inherit the values used by a VM, leading to unexpected
>   behaviour.

> To deal with all of these, let's always explicitly reset the PAN and UAO
> bits when an SDEI event is delivered to the kernel. As above, we must do
> so even when the kernel has chosen to not use PAN/UAO, or was not built
> with support for PAN/UAO generally.
> 
> The existing system_uses_ttbr0_pan() is redefined in terms of
> system_uses_hw_pan() both for clarity and as a minor optimization when
> HW PAN is not selected.

Reviewed-by: James Morse <james.morse at arm.com>


> diff --git a/arch/arm64/kernel/sdei.c b/arch/arm64/kernel/sdei.c
> index 4a5f24602aa0..908d7be70eac 100644
> --- a/arch/arm64/kernel/sdei.c
> +++ b/arch/arm64/kernel/sdei.c
> @@ -224,12 +234,11 @@ __sdei_handler(struct pt_regs *regs, struct sdei_registered_event *arg)
>  	mm_segment_t orig_addr_limit;
>  
>  	/*
> -	 * We didn't take an exception to get here, so the HW hasn't set PAN or
> -	 * cleared UAO, and the exception entry code hasn't reset addr_limit.
> -	 * Set PAN, then use force_uaccess_begin() to clear UAO and reset
> -	 * addr_limit.
> +	 * We didn't take an exception to get here, so the HW hasn't
> +	 * set/cleared bits in PSTATE that we may rely on. Intialize PAN/UAO,

(Initialize)

> +	 * then use force_uaccess_begin() to reset addr_limit.
>  	 */
> -	__uaccess_enable_hw_pan();
> +	__sdei_pstate_entry();
>  	orig_addr_limit = force_uaccess_begin();
>  
>  	nmi_enter();
> 


Thanks,

James



More information about the linux-arm-kernel mailing list