[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87k1fru7m3.fsf@concordia.ellerman.id.au>
Date: Thu, 18 Apr 2019 16:53:40 +1000
From: Michael Ellerman <mpe@...erman.id.au>
To: Christophe Leroy <christophe.leroy@....fr>,
Benjamin Herrenschmidt <benh@...nel.crashing.org>,
Paul Mackerras <paulus@...ba.org>, ruscur@...sell.cc
Cc: linux-kernel@...r.kernel.org, linuxppc-dev@...ts.ozlabs.org
Subject: Re: [PATCH v2 07/10] powerpc/8xx: Add Kernel Userspace Access Protection
Christophe Leroy <christophe.leroy@....fr> writes:
> diff --git a/arch/powerpc/include/asm/nohash/32/kup-8xx.h b/arch/powerpc/include/asm/nohash/32/kup-8xx.h
> new file mode 100644
> index 000000000000..a44cc6c1b901
> --- /dev/null
> +++ b/arch/powerpc/include/asm/nohash/32/kup-8xx.h
> @@ -0,0 +1,68 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _ASM_POWERPC_KUP_8XX_H_
> +#define _ASM_POWERPC_KUP_8XX_H_
> +
> +#include <asm/bug.h>
> +
> +#ifdef CONFIG_PPC_KUAP
> +
> +#ifdef __ASSEMBLY__
> +
> +.macro kuap_save_and_lock sp, thread, gpr1, gpr2, gpr3
> + lis \gpr2, MD_APG_KUAP@h /* only APG0 and APG1 are used */
> + mfspr \gpr1, SPRN_MD_AP
> + mtspr SPRN_MD_AP, \gpr2
> + stw \gpr1, STACK_REGS_KUAP(\sp)
> +.endm
> +
> +.macro kuap_restore sp, current, gpr1, gpr2, gpr3
> + lwz \gpr1, STACK_REGS_KUAP(\sp)
> + mtspr SPRN_MD_AP, \gpr1
> +.endm
> +
> +.macro kuap_check current, gpr
> +#ifdef CONFIG_PPC_KUAP_DEBUG
> + mfspr \gpr, SPRN_MD_AP
> + rlwinm \gpr, \gpr, 16, 0xffff
> +999: twnei \gpr, MD_APG_KUAP@h
> + EMIT_BUG_ENTRY 999b, __FILE__, __LINE__, (BUGFLAG_WARNING | BUGFLAG_ONCE)
> +#endif
> +.endm
> +
> +#else /* !__ASSEMBLY__ */
> +
> +#include <asm/reg.h>
> +
> +static inline void allow_user_access(void __user *to, const void __user *from,
> + unsigned long size)
> +{
> + mtspr(SPRN_MD_AP, MD_APG_INIT);
> +}
> +
> +static inline void prevent_user_access(void __user *to, const void __user *from,
> + unsigned long size)
> +{
> + mtspr(SPRN_MD_AP, MD_APG_KUAP);
> +}
> +
> +static inline void allow_read_from_user(const void __user *from, unsigned long size)
> +{
> + allow_user_access(NULL, from, size);
> +}
> +
> +static inline void allow_write_to_user(void __user *to, unsigned long size)
> +{
> + allow_user_access(to, NULL, size);
> +}
I dropped the two above functions when rebasing on my v6.
cheers
Powered by blists - more mailing lists