RISC-V: KVM: Fix GPA passed to __kvm_riscv_hfence_gvma_xyz() functions
authorAnup Patel <anup.patel@wdc.com>
Tue, 26 Oct 2021 17:01:36 +0000 (22:31 +0530)
committerPaolo Bonzini <pbonzini@redhat.com>
Sun, 31 Oct 2021 06:45:43 +0000 (02:45 -0400)
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: fd7bb4a251df ("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>
arch/riscv/include/asm/kvm_host.h
arch/riscv/kvm/tlb.S

index d27878d6adf9b2f4212995d2c1abff39255feabc..25ba21f98504120d8a723c13655d5bd583d35b4f 100644 (file)
@@ -214,9 +214,10 @@ static inline void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu) {}
 
 #define KVM_ARCH_WANT_MMU_NOTIFIER
 
-void __kvm_riscv_hfence_gvma_vmid_gpa(unsigned long gpa, unsigned long vmid);
+void __kvm_riscv_hfence_gvma_vmid_gpa(unsigned long gpa_divby_4,
+                                     unsigned long vmid);
 void __kvm_riscv_hfence_gvma_vmid(unsigned long vmid);
-void __kvm_riscv_hfence_gvma_gpa(unsigned long gpa);
+void __kvm_riscv_hfence_gvma_gpa(unsigned long gpa_divby_4);
 void __kvm_riscv_hfence_gvma_all(void);
 
 int kvm_riscv_stage2_map(struct kvm_vcpu *vcpu,
index c858570f08563e6fff1ab33a23dda771156c08c4..899f75d60badc34754653f57a72c5359dd02faf4 100644 (file)
@@ -31,7 +31,7 @@
 
 ENTRY(__kvm_riscv_hfence_gvma_vmid_gpa)
        /*
-        * rs1 = a0 (GPA)
+        * rs1 = a0 (GPA >> 2)
         * rs2 = a1 (VMID)
         * HFENCE.GVMA a0, a1
         * 0110001 01011 01010 000 00000 1110011
@@ -53,7 +53,7 @@ ENDPROC(__kvm_riscv_hfence_gvma_vmid)
 
 ENTRY(__kvm_riscv_hfence_gvma_gpa)
        /*
-        * rs1 = a0 (GPA)
+        * rs1 = a0 (GPA >> 2)
         * rs2 = zero
         * HFENCE.GVMA a0
         * 0110001 00000 01010 000 00000 1110011