Michal Suchanek 5f677e
From dae581864609d36fb58855fd59880b4941ce9d14 Mon Sep 17 00:00:00 2001
Michal Suchanek 5f677e
From: Michael Ellerman <mpe@ellerman.id.au>
Michal Suchanek 5f677e
Date: Fri, 24 Sep 2021 01:10:31 +1000
Michal Suchanek 5f677e
Subject: [PATCH] KVM: PPC: Book3S HV: Use GLOBAL_TOC for
Michal Suchanek 5f677e
 kvmppc_h_set_dabr/xdabr()
Michal Suchanek 5f677e
Michal Suchanek 5f677e
References: bsc#1156395
Michal Suchanek 5f677e
Patch-mainline: v5.16-rc2
Michal Suchanek 5f677e
Git-commit: dae581864609d36fb58855fd59880b4941ce9d14
Michal Suchanek 5f677e
Michal Suchanek 5f677e
kvmppc_h_set_dabr(), and kvmppc_h_set_xdabr() which jumps into
Michal Suchanek 5f677e
it, need to use _GLOBAL_TOC to setup the kernel TOC pointer, because
Michal Suchanek 5f677e
kvmppc_h_set_dabr() uses LOAD_REG_ADDR() to load dawr_force_enable.
Michal Suchanek 5f677e
Michal Suchanek 5f677e
When called from hcall_try_real_mode() we have the kernel TOC in r2,
Michal Suchanek 5f677e
established near the start of kvmppc_interrupt_hv(), so there is no
Michal Suchanek 5f677e
issue.
Michal Suchanek 5f677e
Michal Suchanek 5f677e
But they can also be called from kvmppc_pseries_do_hcall() which is
Michal Suchanek 5f677e
module code, so the access ends up happening with the kvm-hv module's
Michal Suchanek 5f677e
r2, which will not point at dawr_force_enable and could even cause a
Michal Suchanek 5f677e
fault.
Michal Suchanek 5f677e
Michal Suchanek 5f677e
With the current code layout and compilers we haven't observed a fault
Michal Suchanek 5f677e
in practice, the load hits somewhere in kvm-hv.ko and silently returns
Michal Suchanek 5f677e
some bogus value.
Michal Suchanek 5f677e
Michal Suchanek 5f677e
Note that we we expect p8/p9 guests to use the DAWR, but SLOF uses
Michal Suchanek 5f677e
h_set_dabr() to test if sc1 works correctly, see SLOF's
Michal Suchanek 5f677e
lib/libhvcall/brokensc1.c.
Michal Suchanek 5f677e
Michal Suchanek 5f677e
Fixes: c1fe190c0672 ("powerpc: Add force enable of DAWR on P9 option")
Michal Suchanek 5f677e
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Michal Suchanek 5f677e
Reviewed-by: Daniel Axtens <dja@axtens.net>
Michal Suchanek 5f677e
Link: https://lore.kernel.org/r/20210923151031.72408-1-mpe@ellerman.id.au
Michal Suchanek 5f677e
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek 5f677e
---
Michal Suchanek 5f677e
 arch/powerpc/kvm/book3s_hv_rmhandlers.S | 4 ++--
Michal Suchanek 5f677e
 1 file changed, 2 insertions(+), 2 deletions(-)
Michal Suchanek 5f677e
Michal Suchanek 5f677e
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
Michal Suchanek 5f677e
index eb776d0c5d8e..32a4b4d412b9 100644
Michal Suchanek 5f677e
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
Michal Suchanek 5f677e
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
Michal Suchanek 5f677e
@@ -2005,7 +2005,7 @@ hcall_real_table:
Michal Suchanek 5f677e
 	.globl	hcall_real_table_end
Michal Suchanek 5f677e
 hcall_real_table_end:
Michal Suchanek 5f677e
 
Michal Suchanek 5f677e
-_GLOBAL(kvmppc_h_set_xdabr)
Michal Suchanek 5f677e
+_GLOBAL_TOC(kvmppc_h_set_xdabr)
Michal Suchanek 5f677e
 EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr)
Michal Suchanek 5f677e
 	andi.	r0, r5, DABRX_USER | DABRX_KERNEL
Michal Suchanek 5f677e
 	beq	6f
Michal Suchanek 5f677e
@@ -2015,7 +2015,7 @@ EXPORT_SYMBOL_GPL(kvmppc_h_set_xdabr)
Michal Suchanek 5f677e
 6:	li	r3, H_PARAMETER
Michal Suchanek 5f677e
 	blr
Michal Suchanek 5f677e
 
Michal Suchanek 5f677e
-_GLOBAL(kvmppc_h_set_dabr)
Michal Suchanek 5f677e
+_GLOBAL_TOC(kvmppc_h_set_dabr)
Michal Suchanek 5f677e
 EXPORT_SYMBOL_GPL(kvmppc_h_set_dabr)
Michal Suchanek 5f677e
 	li	r5, DABRX_USER | DABRX_KERNEL
Michal Suchanek 5f677e
 3:
Michal Suchanek 5f677e
-- 
Michal Suchanek 5f677e
2.35.3
Michal Suchanek 5f677e