[PATCH] powerpc: Add support for userspace P9 copy paste
Cyril Bur
cyrilbur at gmail.com
Tue Apr 26 16:42:09 AEST 2016
On Tue, 26 Apr 2016 10:28:50 +1000
Chris Smart <chris at distroguy.com> wrote:
> The copy paste facility introduced in POWER9 provides an optimised
> mechanism for a userspace application to copy a cacheline. This is
> provided by a pair of instructions, copy and paste, while a third,
> cp_abort (copy paste abort), provides a clean up of the state in case of
> a failure.
>
> The copy instruction will read a 128 byte cacheline and store it in an
> internal buffer. The subsequent paste instruction will store this
> internal buffer to memory and set a CR field if the paste succeeds.
>
> Since the state of the copy paste buffer is internal (and not
> architecturally visible), in the unlikely event of a context switch, the
> state cannot be stored and the paste should therefore fail.
>
> The cp_abort instruction exists to fail and clean up any such
> interrupted copy paste sequence and is to be called by the kernel as
> part of the context switch. Doing so prevents data from a preceding copy
> in one process leaking into the paste of another.
>
> This code enables use of the cp_abort instruction if a supported
> processor is detected.
>
> NOTE: this is for userspace only, not in kernel, and does not deal
> with KVM guests.
>
> Patch created with much assistance from Michael Neuling
> <mikey at neuling.org>
>
Hi Chris,
Patch looks good. Looks like you've put 8 spaces (instead of a tab) on the
PPC_CP_ABORT line.
Apart from that,
Reviewed-by: Cyril Bur <cyrilbur at gmail.com>
> Signed-off-by: Chris Smart <chris at distroguy.com>
> ---
>
> Note: A follow-up patch is expected soon with a working self-test.
>
> arch/powerpc/include/asm/ppc-opcode.h | 2 ++
> arch/powerpc/kernel/entry_64.S | 9 +++++++++
> 2 files changed, 11 insertions(+)
>
> diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
> index 7ab04fc59e24..1d035c1cc889 100644
> --- a/arch/powerpc/include/asm/ppc-opcode.h
> +++ b/arch/powerpc/include/asm/ppc-opcode.h
> @@ -131,6 +131,7 @@
> /* sorted alphabetically */
> #define PPC_INST_BHRBE 0x7c00025c
> #define PPC_INST_CLRBHRB 0x7c00035c
> +#define PPC_INST_CP_ABORT 0x7c00068c
> #define PPC_INST_DCBA 0x7c0005ec
> #define PPC_INST_DCBA_MASK 0xfc0007fe
> #define PPC_INST_DCBAL 0x7c2005ec
> @@ -285,6 +286,7 @@
> #endif
>
> /* Deal with instructions that older assemblers aren't aware of */
> +#define PPC_CP_ABORT stringify_in_c(.long PPC_INST_CP_ABORT)
> #define PPC_DCBAL(a, b) stringify_in_c(.long PPC_INST_DCBAL | \
> __PPC_RA(a) | __PPC_RB(b))
> #define PPC_DCBZL(a, b) stringify_in_c(.long PPC_INST_DCBZL | \
> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
> index 8b9d68676d2b..ab1457c3f1d1 100644
> --- a/arch/powerpc/kernel/entry_64.S
> +++ b/arch/powerpc/kernel/entry_64.S
> @@ -36,6 +36,7 @@
> #include <asm/hw_irq.h>
> #include <asm/context_tracking.h>
> #include <asm/tm.h>
> +#include <asm/ppc-opcode.h>
>
> /*
> * System calls.
> @@ -508,6 +509,14 @@ BEGIN_FTR_SECTION
> ldarx r6,0,r1
> END_FTR_SECTION_IFSET(CPU_FTR_STCX_CHECKS_ADDRESS)
>
> +BEGIN_FTR_SECTION
> +/*
> + * A cp_abort (copy paste abort) here ensures that when context switching, a
> + * copy from one process can't leak into the paste of another.
> + */
> + PPC_CP_ABORT
> +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
> +
> #ifdef CONFIG_PPC_BOOK3S
> /* Cancel all explict user streams as they will have no use after context
> * switch and will stop the HW from creating streams itself
More information about the Linuxppc-dev
mailing list