Skip to content

Commit 6bdbb73

Browse files
bibo-maochenhuacai
authored andcommitted
LoongArch: KVM: Fix GPA size issue about VM
Physical address space is 48 bit on Loongson-3A5000 physical machine, however it is 47 bit for VM on Loongson-3A5000 system. Size of physical address space of VM is the same with the size of virtual user space (a half) of physical machine. Variable cpu_vabits represents user address space, kernel address space is not included (user space and kernel space are both a half of total). Here cpu_vabits, rather than cpu_vabits - 1, is to represent the size of guest physical address space. Also there is strict checking about page fault GPA address, inject error if it is larger than maximum GPA address of VM. Cc: stable@vger.kernel.org Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent 78d7bc5 commit 6bdbb73

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

arch/loongarch/kvm/exit.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,12 @@ static int kvm_handle_rdwr_fault(struct kvm_vcpu *vcpu, bool write)
669669
struct kvm_run *run = vcpu->run;
670670
unsigned long badv = vcpu->arch.badv;
671671

672+
/* Inject ADE exception if exceed max GPA size */
673+
if (unlikely(badv >= vcpu->kvm->arch.gpa_size)) {
674+
kvm_queue_exception(vcpu, EXCCODE_ADE, EXSUBCODE_ADEM);
675+
return RESUME_GUEST;
676+
}
677+
672678
ret = kvm_handle_mm_fault(vcpu, badv, write);
673679
if (ret) {
674680
/* Treat as MMIO */

arch/loongarch/kvm/vm.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
4848
if (kvm_pvtime_supported())
4949
kvm->arch.pv_features |= BIT(KVM_FEATURE_STEAL_TIME);
5050

51-
kvm->arch.gpa_size = BIT(cpu_vabits - 1);
51+
/*
52+
* cpu_vabits means user address space only (a half of total).
53+
* GPA size of VM is the same with the size of user address space.
54+
*/
55+
kvm->arch.gpa_size = BIT(cpu_vabits);
5256
kvm->arch.root_level = CONFIG_PGTABLE_LEVELS - 1;
5357
kvm->arch.invalid_ptes[0] = 0;
5458
kvm->arch.invalid_ptes[1] = (unsigned long)invalid_pte_table;

0 commit comments

Comments
 (0)