]> Git Repo - linux.git/commitdiff
LoongArch: KVM: Implement kvm exception vectors
authorTianrui Zhao <[email protected]>
Mon, 2 Oct 2023 02:01:29 +0000 (10:01 +0800)
committerHuacai Chen <[email protected]>
Mon, 2 Oct 2023 02:01:29 +0000 (10:01 +0800)
Implement kvm exception vectors, using kvm_fault_tables array to save
the handle function pointers and it is used when vcpu handle guest exit.

Reviewed-by: Bibo Mao <[email protected]>
Tested-by: Huacai Chen <[email protected]>
Signed-off-by: Tianrui Zhao <[email protected]>
Signed-off-by: Huacai Chen <[email protected]>
arch/loongarch/kvm/exit.c

index e855ab9099b2411c896bd81655dff7d6c5df9370..ce8de3fa472cc64c14c80099ec55e06d24bf79be 100644 (file)
@@ -658,3 +658,39 @@ static int kvm_handle_fpu_disabled(struct kvm_vcpu *vcpu)
 
        return RESUME_GUEST;
 }
+
+/*
+ * LoongArch KVM callback handling for unimplemented guest exiting
+ */
+static int kvm_fault_ni(struct kvm_vcpu *vcpu)
+{
+       unsigned int ecode, inst;
+       unsigned long estat, badv;
+
+       /* Fetch the instruction */
+       inst = vcpu->arch.badi;
+       badv = vcpu->arch.badv;
+       estat = vcpu->arch.host_estat;
+       ecode = (estat & CSR_ESTAT_EXC) >> CSR_ESTAT_EXC_SHIFT;
+       kvm_err("ECode: %d PC=%#lx Inst=0x%08x BadVaddr=%#lx ESTAT=%#lx\n",
+                       ecode, vcpu->arch.pc, inst, badv, read_gcsr_estat());
+       kvm_arch_vcpu_dump_regs(vcpu);
+       kvm_queue_exception(vcpu, EXCCODE_INE, 0);
+
+       return RESUME_GUEST;
+}
+
+static exit_handle_fn kvm_fault_tables[EXCCODE_INT_START] = {
+       [0 ... EXCCODE_INT_START - 1]   = kvm_fault_ni,
+       [EXCCODE_TLBI]                  = kvm_handle_read_fault,
+       [EXCCODE_TLBL]                  = kvm_handle_read_fault,
+       [EXCCODE_TLBS]                  = kvm_handle_write_fault,
+       [EXCCODE_TLBM]                  = kvm_handle_write_fault,
+       [EXCCODE_FPDIS]                 = kvm_handle_fpu_disabled,
+       [EXCCODE_GSPR]                  = kvm_handle_gspr,
+};
+
+int kvm_handle_fault(struct kvm_vcpu *vcpu, int fault)
+{
+       return kvm_fault_tables[fault](vcpu);
+}
This page took 0.058204 seconds and 4 git commands to generate.