[v4.11,backport] KVM: ARM64: fix phy counter access failure in guest.

Message ID 20170720111534.9845-1-cdall@linaro.org
State New
Headers show

Commit Message

Christoffer Dall July 20, 2017, 11:15 a.m.
From: Hu Huajun <huhuajun@huawei.com>


Commit 02d50cdaff36c135d222015cffdca3ff11d168ea upstream.

When reading the cntpct_el0 in guest with VHE (Virtual Host Extension)
enabled in host, the "Unsupported guest sys_reg access" error reported.
The reason is cnthctl_el2.EL1PCTEN is not enabled, which is expected
to be done in kvm_timer_init_vhe(). The problem is kvm_timer_init_vhe
is called by cpu_init_hyp_mode, and which is called when VHE is disabled.
This patch remove the incorrect call to kvm_timer_init_vhe() from
cpu_init_hyp_mode(), and calls kvm_timer_init_vhe() to enable
cnthctl_el2.EL1PCTEN in cpu_hyp_reinit().

Fixes: 488f94d7212b ("KVM: arm64: Access CNTHCTL_EL2 bit fields correctly on VHE systems")
Cc: stable@vger.kernel.org
Signed-off-by: Hu Huajun <huhuajun@huawei.com>

Reviewed-by: Christoffer Dall <cdall@linaro.org>

Acked-by: Marc Zyngier <marc.zyngier@arm.com>

Signed-off-by: Christoffer Dall <cdall@linaro.org>

---
 arch/arm/kvm/arm.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

-- 
2.9.0

Comments

Greg KH Aug. 3, 2017, 5:55 p.m. | #1
On Thu, Jul 20, 2017 at 01:15:34PM +0200, Christoffer Dall wrote:
> From: Hu Huajun <huhuajun@huawei.com>

> 

> Commit 02d50cdaff36c135d222015cffdca3ff11d168ea upstream.

> 

> When reading the cntpct_el0 in guest with VHE (Virtual Host Extension)

> enabled in host, the "Unsupported guest sys_reg access" error reported.

> The reason is cnthctl_el2.EL1PCTEN is not enabled, which is expected

> to be done in kvm_timer_init_vhe(). The problem is kvm_timer_init_vhe

> is called by cpu_init_hyp_mode, and which is called when VHE is disabled.

> This patch remove the incorrect call to kvm_timer_init_vhe() from

> cpu_init_hyp_mode(), and calls kvm_timer_init_vhe() to enable

> cnthctl_el2.EL1PCTEN in cpu_hyp_reinit().

> 

> Fixes: 488f94d7212b ("KVM: arm64: Access CNTHCTL_EL2 bit fields correctly on VHE systems")

> Cc: stable@vger.kernel.org

> Signed-off-by: Hu Huajun <huhuajun@huawei.com>

> Reviewed-by: Christoffer Dall <cdall@linaro.org>

> Acked-by: Marc Zyngier <marc.zyngier@arm.com>

> Signed-off-by: Christoffer Dall <cdall@linaro.org>

> ---

>  arch/arm/kvm/arm.c | 4 +---

>  1 file changed, 1 insertion(+), 3 deletions(-)


4.11 is now end-of-life, sorry.

greg k-h
Christoffer Dall Aug. 3, 2017, 6 p.m. | #2
On Thu, Aug 3, 2017 at 7:55 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> On Thu, Jul 20, 2017 at 01:15:34PM +0200, Christoffer Dall wrote:

>> From: Hu Huajun <huhuajun@huawei.com>

>>

>> Commit 02d50cdaff36c135d222015cffdca3ff11d168ea upstream.

>>

>> When reading the cntpct_el0 in guest with VHE (Virtual Host Extension)

>> enabled in host, the "Unsupported guest sys_reg access" error reported.

>> The reason is cnthctl_el2.EL1PCTEN is not enabled, which is expected

>> to be done in kvm_timer_init_vhe(). The problem is kvm_timer_init_vhe

>> is called by cpu_init_hyp_mode, and which is called when VHE is disabled.

>> This patch remove the incorrect call to kvm_timer_init_vhe() from

>> cpu_init_hyp_mode(), and calls kvm_timer_init_vhe() to enable

>> cnthctl_el2.EL1PCTEN in cpu_hyp_reinit().

>>

>> Fixes: 488f94d7212b ("KVM: arm64: Access CNTHCTL_EL2 bit fields correctly on VHE systems")

>> Cc: stable@vger.kernel.org

>> Signed-off-by: Hu Huajun <huhuajun@huawei.com>

>> Reviewed-by: Christoffer Dall <cdall@linaro.org>

>> Acked-by: Marc Zyngier <marc.zyngier@arm.com>

>> Signed-off-by: Christoffer Dall <cdall@linaro.org>

>> ---

>>  arch/arm/kvm/arm.c | 4 +---

>>  1 file changed, 1 insertion(+), 3 deletions(-)

>

> 4.11 is now end-of-life, sorry.

>


That's fine, although I did receive a notice on July 18th that this
patch didn't apply, and sent this two days later.

I see now that EOL happened the day after that, so probably nobody
cares about this.

Thanks,
-Christoffer

Patch

diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 314eb6a..dc18862 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -1106,9 +1106,6 @@  static void cpu_init_hyp_mode(void *dummy)
 	__cpu_init_hyp_mode(pgd_ptr, hyp_stack_ptr, vector_ptr);
 	__cpu_init_stage2();
 
-	if (is_kernel_in_hyp_mode())
-		kvm_timer_init_vhe();
-
 	kvm_arm_init_debug();
 }
 
@@ -1120,6 +1117,7 @@  static void cpu_hyp_reinit(void)
 		 * event was cancelled before the CPU was reset.
 		 */
 		__cpu_init_stage2();
+		kvm_timer_init_vhe();
 	} else {
 		if (__hyp_get_vectors() == hyp_default_vectors)
 			cpu_init_hyp_mode(NULL);