Lines Matching +full:pch +full:- +full:pic +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
34 ++vcpu->stat.cpucfg_exits; in kvm_emu_cpucfg()
35 index = vcpu->arch.gprs[rj]; in kvm_emu_cpucfg()
45 case 0 ... (KVM_MAX_CPUCFG_REGS - 1): in kvm_emu_cpucfg()
46 vcpu->arch.gprs[rd] = vcpu->arch.cpucfg[index]; in kvm_emu_cpucfg()
49 /* CPUCFG emulation between 0x40000000 -- 0x400000ff */ in kvm_emu_cpucfg()
50 vcpu->arch.gprs[rd] = *(unsigned int *)KVM_SIGNATURE; in kvm_emu_cpucfg()
53 ret = vcpu->kvm->arch.pv_features & LOONGARCH_PV_FEAT_MASK; in kvm_emu_cpucfg()
54 vcpu->arch.gprs[rd] = ret; in kvm_emu_cpucfg()
57 vcpu->arch.gprs[rd] = 0; in kvm_emu_cpucfg()
68 struct loongarch_csrs *csr = vcpu->arch.csr; in kvm_emu_read_csr()
71 * From LoongArch Reference Manual Volume 1 Chapter 4.2.1 in kvm_emu_read_csr()
77 pr_warn_once("Unsupported csrrd 0x%x with pc %lx\n", csrid, vcpu->arch.pc); in kvm_emu_read_csr()
85 struct loongarch_csrs *csr = vcpu->arch.csr; in kvm_emu_write_csr()
91 pr_warn_once("Unsupported csrwr 0x%x with pc %lx\n", csrid, vcpu->arch.pc); in kvm_emu_write_csr()
100 struct loongarch_csrs *csr = vcpu->arch.csr; in kvm_emu_xchg_csr()
108 pr_warn_once("Unsupported csrxchg 0x%x with pc %lx\n", csrid, vcpu->arch.pc); in kvm_emu_xchg_csr()
121 * rj = 1 means csrwr in kvm_handle_csr()
122 * rj != 0,1 means csrxchg in kvm_handle_csr()
128 if (csrid >= LOONGARCH_CSR_PERFCTRL0 && csrid <= vcpu->arch.max_pmu_csrid) { in kvm_handle_csr()
129 if (kvm_guest_has_pmu(&vcpu->arch)) { in kvm_handle_csr()
130 vcpu->arch.pc -= 4; in kvm_handle_csr()
140 vcpu->arch.gprs[rd] = val; in kvm_handle_csr()
142 case 1: /* process csrwr */ in kvm_handle_csr()
143 val = vcpu->arch.gprs[rd]; in kvm_handle_csr()
145 vcpu->arch.gprs[rd] = val; in kvm_handle_csr()
148 val = vcpu->arch.gprs[rd]; in kvm_handle_csr()
149 csr_mask = vcpu->arch.gprs[rj]; in kvm_handle_csr()
151 vcpu->arch.gprs[rd] = val; in kvm_handle_csr()
169 addr = vcpu->arch.gprs[rj]; in kvm_emu_iocsr()
170 run->iocsr_io.phys_addr = addr; in kvm_emu_iocsr()
171 run->iocsr_io.is_write = 0; in kvm_emu_iocsr()
172 val = &vcpu->arch.gprs[rd]; in kvm_emu_iocsr()
177 run->iocsr_io.len = 1; in kvm_emu_iocsr()
180 run->iocsr_io.len = 2; in kvm_emu_iocsr()
183 run->iocsr_io.len = 4; in kvm_emu_iocsr()
186 run->iocsr_io.len = 8; in kvm_emu_iocsr()
189 run->iocsr_io.len = 1; in kvm_emu_iocsr()
190 run->iocsr_io.is_write = 1; in kvm_emu_iocsr()
193 run->iocsr_io.len = 2; in kvm_emu_iocsr()
194 run->iocsr_io.is_write = 1; in kvm_emu_iocsr()
197 run->iocsr_io.len = 4; in kvm_emu_iocsr()
198 run->iocsr_io.is_write = 1; in kvm_emu_iocsr()
201 run->iocsr_io.len = 8; in kvm_emu_iocsr()
202 run->iocsr_io.is_write = 1; in kvm_emu_iocsr()
208 if (run->iocsr_io.is_write) { in kvm_emu_iocsr()
209 idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_emu_iocsr()
210 ret = kvm_io_bus_write(vcpu, KVM_IOCSR_BUS, addr, run->iocsr_io.len, val); in kvm_emu_iocsr()
211 srcu_read_unlock(&vcpu->kvm->srcu, idx); in kvm_emu_iocsr()
217 memcpy(run->iocsr_io.data, val, run->iocsr_io.len); in kvm_emu_iocsr()
219 trace_kvm_iocsr(KVM_TRACE_IOCSR_WRITE, run->iocsr_io.len, addr, val); in kvm_emu_iocsr()
221 idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_emu_iocsr()
222 ret = kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr, run->iocsr_io.len, val); in kvm_emu_iocsr()
223 srcu_read_unlock(&vcpu->kvm->srcu, idx); in kvm_emu_iocsr()
229 vcpu->arch.io_gpr = rd; in kvm_emu_iocsr()
231 trace_kvm_iocsr(KVM_TRACE_IOCSR_READ, run->iocsr_io.len, addr, NULL); in kvm_emu_iocsr()
240 unsigned long *gpr = &vcpu->arch.gprs[vcpu->arch.io_gpr]; in kvm_complete_iocsr_read()
242 switch (run->iocsr_io.len) { in kvm_complete_iocsr_read()
243 case 1: in kvm_complete_iocsr_read()
244 *gpr = *(s8 *)run->iocsr_io.data; in kvm_complete_iocsr_read()
247 *gpr = *(s16 *)run->iocsr_io.data; in kvm_complete_iocsr_read()
250 *gpr = *(s32 *)run->iocsr_io.data; in kvm_complete_iocsr_read()
253 *gpr = *(s64 *)run->iocsr_io.data; in kvm_complete_iocsr_read()
257 run->iocsr_io.len, vcpu->arch.badv); in kvm_complete_iocsr_read()
267 ++vcpu->stat.idle_exits; in kvm_emu_idle()
281 struct kvm_run *run = vcpu->run; in kvm_trap_handle_gspr()
284 inst.word = vcpu->arch.badi; in kvm_trap_handle_gspr()
285 curr_pc = vcpu->arch.pc; in kvm_trap_handle_gspr()
286 update_pc(&vcpu->arch); in kvm_trap_handle_gspr()
332 vcpu->arch.pc = curr_pc; in kvm_trap_handle_gspr()
340 * 1) Execute CPUCFG instruction;
354 vcpu->run->exit_reason = KVM_EXIT_MMIO; in kvm_handle_gspr()
357 vcpu->run->exit_reason = KVM_EXIT_LOONGARCH_IOCSR; in kvm_handle_gspr()
371 struct kvm_run *run = vcpu->run; in kvm_emu_mmio_read()
373 run->mmio.phys_addr = vcpu->arch.badv; in kvm_emu_mmio_read()
374 vcpu->mmio_needed = 2; /* signed */ in kvm_emu_mmio_read()
385 run->mmio.len = 4; in kvm_emu_mmio_read()
388 run->mmio.len = 8; in kvm_emu_mmio_read()
400 run->mmio.len = 1; in kvm_emu_mmio_read()
403 vcpu->mmio_needed = 1; /* unsigned */ in kvm_emu_mmio_read()
404 run->mmio.len = 1; in kvm_emu_mmio_read()
407 run->mmio.len = 2; in kvm_emu_mmio_read()
410 vcpu->mmio_needed = 1; /* unsigned */ in kvm_emu_mmio_read()
411 run->mmio.len = 2; in kvm_emu_mmio_read()
414 run->mmio.len = 4; in kvm_emu_mmio_read()
417 vcpu->mmio_needed = 1; /* unsigned */ in kvm_emu_mmio_read()
418 run->mmio.len = 4; in kvm_emu_mmio_read()
421 run->mmio.len = 8; in kvm_emu_mmio_read()
434 run->mmio.len = 1; in kvm_emu_mmio_read()
437 run->mmio.len = 1; in kvm_emu_mmio_read()
438 vcpu->mmio_needed = 1; /* unsigned */ in kvm_emu_mmio_read()
441 run->mmio.len = 2; in kvm_emu_mmio_read()
444 run->mmio.len = 2; in kvm_emu_mmio_read()
445 vcpu->mmio_needed = 1; /* unsigned */ in kvm_emu_mmio_read()
448 run->mmio.len = 4; in kvm_emu_mmio_read()
451 run->mmio.len = 4; in kvm_emu_mmio_read()
452 vcpu->mmio_needed = 1; /* unsigned */ in kvm_emu_mmio_read()
455 run->mmio.len = 8; in kvm_emu_mmio_read()
467 trace_kvm_mmio(KVM_TRACE_MMIO_READ, run->mmio.len, run->mmio.phys_addr, NULL); in kvm_emu_mmio_read()
470 * If mmio device such as PCH-PIC is emulated in KVM, in kvm_emu_mmio_read()
474 idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_emu_mmio_read()
475 ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, vcpu->arch.badv, in kvm_emu_mmio_read()
476 run->mmio.len, &vcpu->arch.gprs[rd]); in kvm_emu_mmio_read()
477 srcu_read_unlock(&vcpu->kvm->srcu, idx); in kvm_emu_mmio_read()
479 update_pc(&vcpu->arch); in kvm_emu_mmio_read()
480 vcpu->mmio_needed = 0; in kvm_emu_mmio_read()
485 vcpu->arch.io_gpr = rd; in kvm_emu_mmio_read()
486 run->mmio.is_write = 0; in kvm_emu_mmio_read()
487 vcpu->mmio_is_write = 0; in kvm_emu_mmio_read()
492 inst.word, vcpu->arch.pc, vcpu->arch.badv); in kvm_emu_mmio_read()
494 vcpu->mmio_needed = 0; in kvm_emu_mmio_read()
502 unsigned long *gpr = &vcpu->arch.gprs[vcpu->arch.io_gpr]; in kvm_complete_mmio_read()
505 update_pc(&vcpu->arch); in kvm_complete_mmio_read()
506 switch (run->mmio.len) { in kvm_complete_mmio_read()
507 case 1: in kvm_complete_mmio_read()
508 if (vcpu->mmio_needed == 2) in kvm_complete_mmio_read()
509 *gpr = *(s8 *)run->mmio.data; in kvm_complete_mmio_read()
511 *gpr = *(u8 *)run->mmio.data; in kvm_complete_mmio_read()
514 if (vcpu->mmio_needed == 2) in kvm_complete_mmio_read()
515 *gpr = *(s16 *)run->mmio.data; in kvm_complete_mmio_read()
517 *gpr = *(u16 *)run->mmio.data; in kvm_complete_mmio_read()
520 if (vcpu->mmio_needed == 2) in kvm_complete_mmio_read()
521 *gpr = *(s32 *)run->mmio.data; in kvm_complete_mmio_read()
523 *gpr = *(u32 *)run->mmio.data; in kvm_complete_mmio_read()
526 *gpr = *(s64 *)run->mmio.data; in kvm_complete_mmio_read()
530 run->mmio.len, vcpu->arch.badv); in kvm_complete_mmio_read()
535 trace_kvm_mmio(KVM_TRACE_MMIO_READ, run->mmio.len, in kvm_complete_mmio_read()
536 run->mmio.phys_addr, run->mmio.data); in kvm_complete_mmio_read()
546 struct kvm_run *run = vcpu->run; in kvm_emu_mmio_write()
547 void *data = run->mmio.data; in kvm_emu_mmio_write()
553 curr_pc = vcpu->arch.pc; in kvm_emu_mmio_write()
554 update_pc(&vcpu->arch); in kvm_emu_mmio_write()
557 run->mmio.phys_addr = vcpu->arch.badv; in kvm_emu_mmio_write()
566 run->mmio.len = 4; in kvm_emu_mmio_write()
567 *(unsigned int *)data = vcpu->arch.gprs[rd]; in kvm_emu_mmio_write()
570 run->mmio.len = 8; in kvm_emu_mmio_write()
571 *(unsigned long *)data = vcpu->arch.gprs[rd]; in kvm_emu_mmio_write()
581 rd_val = vcpu->arch.gprs[rd]; in kvm_emu_mmio_write()
585 run->mmio.len = 1; in kvm_emu_mmio_write()
589 run->mmio.len = 2; in kvm_emu_mmio_write()
593 run->mmio.len = 4; in kvm_emu_mmio_write()
597 run->mmio.len = 8; in kvm_emu_mmio_write()
611 run->mmio.len = 1; in kvm_emu_mmio_write()
612 *(unsigned char *)data = vcpu->arch.gprs[rd]; in kvm_emu_mmio_write()
615 run->mmio.len = 2; in kvm_emu_mmio_write()
616 *(unsigned short *)data = vcpu->arch.gprs[rd]; in kvm_emu_mmio_write()
619 run->mmio.len = 4; in kvm_emu_mmio_write()
620 *(unsigned int *)data = vcpu->arch.gprs[rd]; in kvm_emu_mmio_write()
623 run->mmio.len = 8; in kvm_emu_mmio_write()
624 *(unsigned long *)data = vcpu->arch.gprs[rd]; in kvm_emu_mmio_write()
636 trace_kvm_mmio(KVM_TRACE_MMIO_WRITE, run->mmio.len, run->mmio.phys_addr, data); in kvm_emu_mmio_write()
639 * If mmio device such as PCH-PIC is emulated in KVM, in kvm_emu_mmio_write()
643 idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_emu_mmio_write()
644 ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, vcpu->arch.badv, run->mmio.len, data); in kvm_emu_mmio_write()
645 srcu_read_unlock(&vcpu->kvm->srcu, idx); in kvm_emu_mmio_write()
649 run->mmio.is_write = 1; in kvm_emu_mmio_write()
650 vcpu->mmio_needed = 1; in kvm_emu_mmio_write()
651 vcpu->mmio_is_write = 1; in kvm_emu_mmio_write()
655 vcpu->arch.pc = curr_pc; in kvm_emu_mmio_write()
657 inst.word, vcpu->arch.pc, vcpu->arch.badv); in kvm_emu_mmio_write()
669 struct kvm_run *run = vcpu->run; in kvm_handle_rdwr_fault()
670 unsigned long badv = vcpu->arch.badv; in kvm_handle_rdwr_fault()
673 if (unlikely(badv >= vcpu->kvm->arch.gpa_size)) { in kvm_handle_rdwr_fault()
681 inst.word = vcpu->arch.badi; in kvm_handle_rdwr_fault()
686 if (kvm_is_ifetch_fault(&vcpu->arch)) { in kvm_handle_rdwr_fault()
698 run->exit_reason = KVM_EXIT_MMIO; in kvm_handle_rdwr_fault()
720 update_pc(&vcpu->arch); in kvm_complete_user_service()
721 kvm_write_reg(vcpu, LOONGARCH_GPR_A0, run->hypercall.ret); in kvm_complete_user_service()
727 * kvm_handle_fpu_disabled() - Guest used fpu however it is disabled at host
735 struct kvm_run *run = vcpu->run; in kvm_handle_fpu_disabled()
737 if (!kvm_guest_has_fpu(&vcpu->arch)) { in kvm_handle_fpu_disabled()
747 if (WARN_ON(vcpu->arch.aux_inuse & KVM_LARCH_FPU)) { in kvm_handle_fpu_disabled()
749 run->exit_reason = KVM_EXIT_INTERNAL_ERROR; in kvm_handle_fpu_disabled()
769 vcpu->arch.st.guest_addr = data; in kvm_save_notify()
773 vcpu->arch.st.last_steal = current->sched_info.run_delay; in kvm_save_notify()
784 * kvm_handle_lsx_disabled() - Guest used LSX while disabled in root.
799 * kvm_handle_lasx_disabled() - Guest used LASX while disabled in root.
835 dest = kvm_get_vcpu_by_cpuid(vcpu->kvm, cpu + min); in kvm_send_pv_ipi()
836 cpu = find_next_bit((void *)&ipi_bitmap, BITS_PER_LONG, cpu + 1); in kvm_send_pv_ipi()
881 inst.word = vcpu->arch.badi; in kvm_handle_hypercall()
887 vcpu->stat.hypercall_exits++; in kvm_handle_hypercall()
896 vcpu->stat.hypercall_exits++; in kvm_handle_hypercall()
897 vcpu->run->exit_reason = KVM_EXIT_HYPERCALL; in kvm_handle_hypercall()
898 vcpu->run->hypercall.nr = KVM_HCALL_USER_SERVICE; in kvm_handle_hypercall()
899 vcpu->run->hypercall.args[0] = kvm_read_reg(vcpu, LOONGARCH_GPR_A0); in kvm_handle_hypercall()
900 vcpu->run->hypercall.args[1] = kvm_read_reg(vcpu, LOONGARCH_GPR_A1); in kvm_handle_hypercall()
901 vcpu->run->hypercall.args[2] = kvm_read_reg(vcpu, LOONGARCH_GPR_A2); in kvm_handle_hypercall()
902 vcpu->run->hypercall.args[3] = kvm_read_reg(vcpu, LOONGARCH_GPR_A3); in kvm_handle_hypercall()
903 vcpu->run->hypercall.args[4] = kvm_read_reg(vcpu, LOONGARCH_GPR_A4); in kvm_handle_hypercall()
904 vcpu->run->hypercall.args[5] = kvm_read_reg(vcpu, LOONGARCH_GPR_A5); in kvm_handle_hypercall()
905 vcpu->run->hypercall.flags = 0; in kvm_handle_hypercall()
907 * Set invalid return value by default, let user-mode VMM modify it. in kvm_handle_hypercall()
909 vcpu->run->hypercall.ret = KVM_HCALL_INVALID_CODE; in kvm_handle_hypercall()
914 if (vcpu->guest_debug & KVM_GUESTDBG_SW_BP_MASK) { in kvm_handle_hypercall()
915 vcpu->run->exit_reason = KVM_EXIT_DEBUG; in kvm_handle_hypercall()
927 update_pc(&vcpu->arch); in kvm_handle_hypercall()
941 inst = vcpu->arch.badi; in kvm_fault_ni()
942 badv = vcpu->arch.badv; in kvm_fault_ni()
943 estat = vcpu->arch.host_estat; in kvm_fault_ni()
946 ecode, vcpu->arch.pc, inst, badv, read_gcsr_estat()); in kvm_fault_ni()
954 [0 ... EXCCODE_INT_START - 1] = kvm_fault_ni,