mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 08:58:07 +00:00
7c8de080d4
The parameter passed to HFENCE.GVMA instruction in rs1 register
is guest physical address right shifted by 2 (i.e. divided by 4).
Unfortunately, we overlooked the semantics of rs1 registers for
HFENCE.GVMA instruction and never right shifted guest physical
address by 2. This issue did not manifest for hypervisors till
now because:
1) Currently, only __kvm_riscv_hfence_gvma_all() and SBI
HFENCE calls are used to invalidate TLB.
2) All H-extension implementations (such as QEMU, Spike,
Rocket Core FPGA, etc) that we tried till now were
conservatively flushing everything upon any HFENCE.GVMA
instruction.
This patch fixes GPA passed to __kvm_riscv_hfence_gvma_vmid_gpa()
and __kvm_riscv_hfence_gvma_gpa() functions.
Fixes: fd7bb4a251
("RISC-V: KVM: Implement VMID allocator")
Reported-by: Ian Huang <ihuang@ventanamicro.com>
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Message-Id: <20211026170136.2147619-4-anup.patel@wdc.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
74 lines
1.5 KiB
ArmAsm
74 lines
1.5 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2019 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Anup Patel <anup.patel@wdc.com>
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/asm.h>
|
|
|
|
.text
|
|
.altmacro
|
|
.option norelax
|
|
|
|
/*
|
|
* Instruction encoding of hfence.gvma is:
|
|
* HFENCE.GVMA rs1, rs2
|
|
* HFENCE.GVMA zero, rs2
|
|
* HFENCE.GVMA rs1
|
|
* HFENCE.GVMA
|
|
*
|
|
* rs1!=zero and rs2!=zero ==> HFENCE.GVMA rs1, rs2
|
|
* rs1==zero and rs2!=zero ==> HFENCE.GVMA zero, rs2
|
|
* rs1!=zero and rs2==zero ==> HFENCE.GVMA rs1
|
|
* rs1==zero and rs2==zero ==> HFENCE.GVMA
|
|
*
|
|
* Instruction encoding of HFENCE.GVMA is:
|
|
* 0110001 rs2(5) rs1(5) 000 00000 1110011
|
|
*/
|
|
|
|
ENTRY(__kvm_riscv_hfence_gvma_vmid_gpa)
|
|
/*
|
|
* rs1 = a0 (GPA >> 2)
|
|
* rs2 = a1 (VMID)
|
|
* HFENCE.GVMA a0, a1
|
|
* 0110001 01011 01010 000 00000 1110011
|
|
*/
|
|
.word 0x62b50073
|
|
ret
|
|
ENDPROC(__kvm_riscv_hfence_gvma_vmid_gpa)
|
|
|
|
ENTRY(__kvm_riscv_hfence_gvma_vmid)
|
|
/*
|
|
* rs1 = zero
|
|
* rs2 = a0 (VMID)
|
|
* HFENCE.GVMA zero, a0
|
|
* 0110001 01010 00000 000 00000 1110011
|
|
*/
|
|
.word 0x62a00073
|
|
ret
|
|
ENDPROC(__kvm_riscv_hfence_gvma_vmid)
|
|
|
|
ENTRY(__kvm_riscv_hfence_gvma_gpa)
|
|
/*
|
|
* rs1 = a0 (GPA >> 2)
|
|
* rs2 = zero
|
|
* HFENCE.GVMA a0
|
|
* 0110001 00000 01010 000 00000 1110011
|
|
*/
|
|
.word 0x62050073
|
|
ret
|
|
ENDPROC(__kvm_riscv_hfence_gvma_gpa)
|
|
|
|
ENTRY(__kvm_riscv_hfence_gvma_all)
|
|
/*
|
|
* rs1 = zero
|
|
* rs2 = zero
|
|
* HFENCE.GVMA
|
|
* 0110001 00000 00000 000 00000 1110011
|
|
*/
|
|
.word 0x62000073
|
|
ret
|
|
ENDPROC(__kvm_riscv_hfence_gvma_all)
|