arm64/gcs: Provide put_user_gcs()
In order for EL1 to write to an EL0 GCS it must use the GCSSTTR instruction rather than a normal STTR. Provide a put_user_gcs() which does this. Reviewed-by: Thiago Jung Bauermann <thiago.bauermann@linaro.org> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20241001-arm64-gcs-v13-10-222b78d87eee@kernel.org Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
committed by
Catalin Marinas
parent
dad947cc22
commit
d0aa2b4351
@@ -522,6 +522,24 @@ static inline int gcssttr(unsigned long __user *addr, unsigned long val)
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline void put_user_gcs(unsigned long val, unsigned long __user *addr,
|
||||
int *err)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!access_ok((char __user *)addr, sizeof(u64))) {
|
||||
*err = -EFAULT;
|
||||
return;
|
||||
}
|
||||
|
||||
uaccess_ttbr0_enable();
|
||||
ret = gcssttr(addr, val);
|
||||
if (ret != 0)
|
||||
*err = ret;
|
||||
uaccess_ttbr0_disable();
|
||||
}
|
||||
|
||||
|
||||
#endif /* CONFIG_ARM64_GCS */
|
||||
|
||||
#endif /* __ASM_UACCESS_H */
|
||||
|
||||
Reference in New Issue
Block a user