Skip to content

Commit cd32794

Browse files
bibo-maoopsiff
authored andcommitted
LoongArch: KVM: Fix GPA size issue about VM
[ Upstream commit 6bdbb73 ] 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. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> Signed-off-by: Xianglai Li <lixianglai@loongson.cn>
1 parent ef0b462 commit cd32794

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
@@ -661,6 +661,12 @@ static int kvm_handle_rdwr_fault(struct kvm_vcpu *vcpu, bool write)
661661
struct kvm_run *run = vcpu->run;
662662
unsigned long badv = vcpu->arch.badv;
663663

664+
/* Inject ADE exception if exceed max GPA size */
665+
if (unlikely(badv >= vcpu->kvm->arch.gpa_size)) {
666+
kvm_queue_exception(vcpu, EXCCODE_ADE, EXSUBCODE_ADEM);
667+
return RESUME_GUEST;
668+
}
669+
664670
ret = kvm_handle_mm_fault(vcpu, badv, write);
665671
if (ret) {
666672
/* 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)