| From 5ef799fd79133916f1701e91b048b0a618d1defc Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 25 Aug 2020 17:55:35 +1000 |
| Subject: powerpc/64s: handle ISA v3.1 local copy-paste context switches |
| |
| From: Nicholas Piggin <npiggin@gmail.com> |
| |
| [ Upstream commit dc462267d2d7aacffc3c1d99b02d7a7c59db7c66 ] |
| |
| The ISA v3.1 the copy-paste facility has a new memory move functionality |
| which allows the copy buffer to be pasted to domestic memory (RAM) as |
| opposed to foreign memory (accelerator). |
| |
| This means the POWER9 trick of avoiding the cp_abort on context switch if |
| the process had not mapped foreign memory does not work on POWER10. Do the |
| cp_abort unconditionally there. |
| |
| KVM must also cp_abort on guest exit to prevent copy buffer state leaking |
| between contexts. |
| |
| Signed-off-by: Nicholas Piggin <npiggin@gmail.com> |
| Acked-by: Paul Mackerras <paulus@ozlabs.org> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/20200825075535.224536-1-npiggin@gmail.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/kernel/process.c | 16 +++++++++------- |
| arch/powerpc/kvm/book3s_hv.c | 7 +++++++ |
| arch/powerpc/kvm/book3s_hv_rmhandlers.S | 8 ++++++++ |
| 3 files changed, 24 insertions(+), 7 deletions(-) |
| |
| diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c |
| index 73a57043ee662..3f2dc0675ea7a 100644 |
| --- a/arch/powerpc/kernel/process.c |
| +++ b/arch/powerpc/kernel/process.c |
| @@ -1256,15 +1256,17 @@ struct task_struct *__switch_to(struct task_struct *prev, |
| restore_math(current->thread.regs); |
| |
| /* |
| - * The copy-paste buffer can only store into foreign real |
| - * addresses, so unprivileged processes can not see the |
| - * data or use it in any way unless they have foreign real |
| - * mappings. If the new process has the foreign real address |
| - * mappings, we must issue a cp_abort to clear any state and |
| - * prevent snooping, corruption or a covert channel. |
| + * On POWER9 the copy-paste buffer can only paste into |
| + * foreign real addresses, so unprivileged processes can not |
| + * see the data or use it in any way unless they have |
| + * foreign real mappings. If the new process has the foreign |
| + * real address mappings, we must issue a cp_abort to clear |
| + * any state and prevent snooping, corruption or a covert |
| + * channel. ISA v3.1 supports paste into local memory. |
| */ |
| if (current->mm && |
| - atomic_read(¤t->mm->context.vas_windows)) |
| + (cpu_has_feature(CPU_FTR_ARCH_31) || |
| + atomic_read(¤t->mm->context.vas_windows))) |
| asm volatile(PPC_CP_ABORT); |
| } |
| #endif /* CONFIG_PPC_BOOK3S_64 */ |
| diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c |
| index 4ba06a2a306cf..3bd3118c76330 100644 |
| --- a/arch/powerpc/kvm/book3s_hv.c |
| +++ b/arch/powerpc/kvm/book3s_hv.c |
| @@ -3530,6 +3530,13 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, |
| */ |
| asm volatile("eieio; tlbsync; ptesync"); |
| |
| + /* |
| + * cp_abort is required if the processor supports local copy-paste |
| + * to clear the copy buffer that was under control of the guest. |
| + */ |
| + if (cpu_has_feature(CPU_FTR_ARCH_31)) |
| + asm volatile(PPC_CP_ABORT); |
| + |
| mtspr(SPRN_LPID, vcpu->kvm->arch.host_lpid); /* restore host LPID */ |
| isync(); |
| |
| diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
| index 799d6d0f4eade..cd9995ee84419 100644 |
| --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
| +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S |
| @@ -1830,6 +1830,14 @@ END_FTR_SECTION_IFSET(CPU_FTR_P9_RADIX_PREFETCH_BUG) |
| 2: |
| #endif /* CONFIG_PPC_RADIX_MMU */ |
| |
| + /* |
| + * cp_abort is required if the processor supports local copy-paste |
| + * to clear the copy buffer that was under control of the guest. |
| + */ |
| +BEGIN_FTR_SECTION |
| + PPC_CP_ABORT |
| +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31) |
| + |
| /* |
| * POWER7/POWER8 guest -> host partition switch code. |
| * We don't have to lock against tlbies but we do |
| -- |
| 2.27.0 |
| |