Lines Matching refs:vcpu
42 unsigned long kvm_compute_return_epc(struct kvm_vcpu *vcpu, in kvm_compute_return_epc() argument
47 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_compute_return_epc()
55 insn.word = kvm_get_inst((uint32_t *) epc, vcpu); in kvm_compute_return_epc()
201 enum emulation_result update_pc(struct kvm_vcpu *vcpu, uint32_t cause) in update_pc() argument
207 branch_pc = kvm_compute_return_epc(vcpu, vcpu->arch.pc); in update_pc()
211 vcpu->arch.pc = branch_pc; in update_pc()
213 vcpu->arch.pc); in update_pc()
216 vcpu->arch.pc += 4; in update_pc()
218 kvm_debug("update_pc(): New PC: %#lx\n", vcpu->arch.pc); in update_pc()
231 static inline int kvm_mips_count_disabled(struct kvm_vcpu *vcpu) in kvm_mips_count_disabled() argument
233 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_count_disabled()
235 return (vcpu->arch.count_ctl & KVM_REG_MIPS_COUNT_CTL_DC) || in kvm_mips_count_disabled()
246 static uint32_t kvm_mips_ktime_to_count(struct kvm_vcpu *vcpu, ktime_t now) in kvm_mips_ktime_to_count() argument
252 delta = now_ns + vcpu->arch.count_dyn_bias; in kvm_mips_ktime_to_count()
254 if (delta >= vcpu->arch.count_period) { in kvm_mips_ktime_to_count()
256 periods = div64_s64(now_ns, vcpu->arch.count_period); in kvm_mips_ktime_to_count()
257 vcpu->arch.count_dyn_bias = -periods * vcpu->arch.count_period; in kvm_mips_ktime_to_count()
259 delta = now_ns + vcpu->arch.count_dyn_bias; in kvm_mips_ktime_to_count()
272 return div_u64(delta * vcpu->arch.count_hz, NSEC_PER_SEC); in kvm_mips_ktime_to_count()
285 static inline ktime_t kvm_mips_count_time(struct kvm_vcpu *vcpu) in kvm_mips_count_time() argument
287 if (unlikely(vcpu->arch.count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) in kvm_mips_count_time()
288 return vcpu->arch.count_resume; in kvm_mips_count_time()
303 static uint32_t kvm_mips_read_count_running(struct kvm_vcpu *vcpu, ktime_t now) in kvm_mips_read_count_running() argument
305 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_read_count_running()
311 count = vcpu->arch.count_bias + kvm_mips_ktime_to_count(vcpu, now); in kvm_mips_read_count_running()
327 expires = hrtimer_get_expires(&vcpu->arch.comparecount_timer); in kvm_mips_read_count_running()
328 threshold = ktime_add_ns(now, vcpu->arch.count_period / 4); in kvm_mips_read_count_running()
334 running = hrtimer_cancel(&vcpu->arch.comparecount_timer); in kvm_mips_read_count_running()
337 kvm_mips_callbacks->queue_timer_int(vcpu); in kvm_mips_read_count_running()
345 vcpu->arch.count_period); in kvm_mips_read_count_running()
346 hrtimer_start(&vcpu->arch.comparecount_timer, expires, in kvm_mips_read_count_running()
363 uint32_t kvm_mips_read_count(struct kvm_vcpu *vcpu) in kvm_mips_read_count() argument
365 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_read_count()
368 if (kvm_mips_count_disabled(vcpu)) in kvm_mips_read_count()
371 return kvm_mips_read_count_running(vcpu, ktime_get()); in kvm_mips_read_count()
390 static ktime_t kvm_mips_freeze_hrtimer(struct kvm_vcpu *vcpu, in kvm_mips_freeze_hrtimer() argument
396 hrtimer_cancel(&vcpu->arch.comparecount_timer); in kvm_mips_freeze_hrtimer()
400 *count = kvm_mips_read_count_running(vcpu, now); in kvm_mips_freeze_hrtimer()
421 static void kvm_mips_resume_hrtimer(struct kvm_vcpu *vcpu, in kvm_mips_resume_hrtimer() argument
424 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_resume_hrtimer()
432 delta = div_u64(delta * NSEC_PER_SEC, vcpu->arch.count_hz); in kvm_mips_resume_hrtimer()
436 hrtimer_cancel(&vcpu->arch.comparecount_timer); in kvm_mips_resume_hrtimer()
437 hrtimer_start(&vcpu->arch.comparecount_timer, expire, HRTIMER_MODE_ABS); in kvm_mips_resume_hrtimer()
447 void kvm_mips_write_count(struct kvm_vcpu *vcpu, uint32_t count) in kvm_mips_write_count() argument
449 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_write_count()
453 now = kvm_mips_count_time(vcpu); in kvm_mips_write_count()
454 vcpu->arch.count_bias = count - kvm_mips_ktime_to_count(vcpu, now); in kvm_mips_write_count()
456 if (kvm_mips_count_disabled(vcpu)) in kvm_mips_write_count()
461 kvm_mips_resume_hrtimer(vcpu, now, count); in kvm_mips_write_count()
471 void kvm_mips_init_count(struct kvm_vcpu *vcpu) in kvm_mips_init_count() argument
474 vcpu->arch.count_hz = 100*1000*1000; in kvm_mips_init_count()
475 vcpu->arch.count_period = div_u64((u64)NSEC_PER_SEC << 32, in kvm_mips_init_count()
476 vcpu->arch.count_hz); in kvm_mips_init_count()
477 vcpu->arch.count_dyn_bias = 0; in kvm_mips_init_count()
480 kvm_mips_write_count(vcpu, 0); in kvm_mips_init_count()
494 int kvm_mips_set_count_hz(struct kvm_vcpu *vcpu, s64 count_hz) in kvm_mips_set_count_hz() argument
496 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_set_count_hz()
505 if (vcpu->arch.count_hz == count_hz) in kvm_mips_set_count_hz()
509 dc = kvm_mips_count_disabled(vcpu); in kvm_mips_set_count_hz()
511 now = kvm_mips_count_time(vcpu); in kvm_mips_set_count_hz()
514 now = kvm_mips_freeze_hrtimer(vcpu, &count); in kvm_mips_set_count_hz()
518 vcpu->arch.count_hz = count_hz; in kvm_mips_set_count_hz()
519 vcpu->arch.count_period = div_u64((u64)NSEC_PER_SEC << 32, count_hz); in kvm_mips_set_count_hz()
520 vcpu->arch.count_dyn_bias = 0; in kvm_mips_set_count_hz()
523 vcpu->arch.count_bias = count - kvm_mips_ktime_to_count(vcpu, now); in kvm_mips_set_count_hz()
527 kvm_mips_resume_hrtimer(vcpu, now, count); in kvm_mips_set_count_hz()
541 void kvm_mips_write_compare(struct kvm_vcpu *vcpu, uint32_t compare, bool ack) in kvm_mips_write_compare() argument
543 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_write_compare()
553 kvm_mips_callbacks->dequeue_timer_int(vcpu); in kvm_mips_write_compare()
559 dc = kvm_mips_count_disabled(vcpu); in kvm_mips_write_compare()
561 now = kvm_mips_freeze_hrtimer(vcpu, &count); in kvm_mips_write_compare()
564 kvm_mips_callbacks->dequeue_timer_int(vcpu); in kvm_mips_write_compare()
570 kvm_mips_resume_hrtimer(vcpu, now, count); in kvm_mips_write_compare()
585 static ktime_t kvm_mips_count_disable(struct kvm_vcpu *vcpu) in kvm_mips_count_disable() argument
587 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_count_disable()
592 hrtimer_cancel(&vcpu->arch.comparecount_timer); in kvm_mips_count_disable()
596 count = kvm_mips_read_count_running(vcpu, now); in kvm_mips_count_disable()
612 void kvm_mips_count_disable_cause(struct kvm_vcpu *vcpu) in kvm_mips_count_disable_cause() argument
614 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_count_disable_cause()
617 if (!(vcpu->arch.count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) in kvm_mips_count_disable_cause()
618 kvm_mips_count_disable(vcpu); in kvm_mips_count_disable_cause()
632 void kvm_mips_count_enable_cause(struct kvm_vcpu *vcpu) in kvm_mips_count_enable_cause() argument
634 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_count_enable_cause()
645 kvm_mips_write_count(vcpu, count); in kvm_mips_count_enable_cause()
658 int kvm_mips_set_count_ctl(struct kvm_vcpu *vcpu, s64 count_ctl) in kvm_mips_set_count_ctl() argument
660 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_set_count_ctl()
661 s64 changed = count_ctl ^ vcpu->arch.count_ctl; in kvm_mips_set_count_ctl()
671 vcpu->arch.count_ctl = count_ctl; in kvm_mips_set_count_ctl()
679 vcpu->arch.count_resume = ktime_get(); in kvm_mips_set_count_ctl()
682 vcpu->arch.count_resume = kvm_mips_count_disable(vcpu); in kvm_mips_set_count_ctl()
692 vcpu->arch.count_hz); in kvm_mips_set_count_ctl()
693 expire = ktime_add_ns(vcpu->arch.count_resume, delta); in kvm_mips_set_count_ctl()
699 kvm_mips_callbacks->queue_timer_int(vcpu); in kvm_mips_set_count_ctl()
702 count = kvm_mips_read_count_running(vcpu, now); in kvm_mips_set_count_ctl()
703 kvm_mips_resume_hrtimer(vcpu, now, count); in kvm_mips_set_count_ctl()
720 int kvm_mips_set_count_resume(struct kvm_vcpu *vcpu, s64 count_resume) in kvm_mips_set_count_resume() argument
730 vcpu->arch.count_resume = ns_to_ktime(count_resume); in kvm_mips_set_count_resume()
742 enum hrtimer_restart kvm_mips_count_timeout(struct kvm_vcpu *vcpu) in kvm_mips_count_timeout() argument
745 hrtimer_add_expires_ns(&vcpu->arch.comparecount_timer, in kvm_mips_count_timeout()
746 vcpu->arch.count_period); in kvm_mips_count_timeout()
750 enum emulation_result kvm_mips_emul_eret(struct kvm_vcpu *vcpu) in kvm_mips_emul_eret() argument
752 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emul_eret()
756 kvm_debug("[%#lx] ERET to %#lx\n", vcpu->arch.pc, in kvm_mips_emul_eret()
759 vcpu->arch.pc = kvm_read_c0_guest_epc(cop0); in kvm_mips_emul_eret()
763 vcpu->arch.pc = kvm_read_c0_guest_errorepc(cop0); in kvm_mips_emul_eret()
766 vcpu->arch.pc); in kvm_mips_emul_eret()
773 enum emulation_result kvm_mips_emul_wait(struct kvm_vcpu *vcpu) in kvm_mips_emul_wait() argument
775 kvm_debug("[%#lx] !!!WAIT!!! (%#lx)\n", vcpu->arch.pc, in kvm_mips_emul_wait()
776 vcpu->arch.pending_exceptions); in kvm_mips_emul_wait()
778 ++vcpu->stat.wait_exits; in kvm_mips_emul_wait()
779 trace_kvm_exit(vcpu, WAIT_EXITS); in kvm_mips_emul_wait()
780 if (!vcpu->arch.pending_exceptions) { in kvm_mips_emul_wait()
781 vcpu->arch.wait = 1; in kvm_mips_emul_wait()
782 kvm_vcpu_block(vcpu); in kvm_mips_emul_wait()
788 if (kvm_check_request(KVM_REQ_UNHALT, vcpu)) { in kvm_mips_emul_wait()
789 clear_bit(KVM_REQ_UNHALT, &vcpu->requests); in kvm_mips_emul_wait()
790 vcpu->run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN; in kvm_mips_emul_wait()
801 enum emulation_result kvm_mips_emul_tlbr(struct kvm_vcpu *vcpu) in kvm_mips_emul_tlbr() argument
803 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emul_tlbr()
804 uint32_t pc = vcpu->arch.pc; in kvm_mips_emul_tlbr()
811 enum emulation_result kvm_mips_emul_tlbwi(struct kvm_vcpu *vcpu) in kvm_mips_emul_tlbwi() argument
813 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emul_tlbwi()
816 uint32_t pc = vcpu->arch.pc; in kvm_mips_emul_tlbwi()
828 tlb = &vcpu->arch.guest_tlb[index]; in kvm_mips_emul_tlbwi()
833 kvm_mips_host_tlb_inv(vcpu, tlb->tlb_hi); in kvm_mips_emul_tlbwi()
850 enum emulation_result kvm_mips_emul_tlbwr(struct kvm_vcpu *vcpu) in kvm_mips_emul_tlbwr() argument
852 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emul_tlbwr()
854 uint32_t pc = vcpu->arch.pc; in kvm_mips_emul_tlbwr()
860 tlb = &vcpu->arch.guest_tlb[index]; in kvm_mips_emul_tlbwr()
866 kvm_mips_host_tlb_inv(vcpu, tlb->tlb_hi); in kvm_mips_emul_tlbwr()
881 enum emulation_result kvm_mips_emul_tlbp(struct kvm_vcpu *vcpu) in kvm_mips_emul_tlbp() argument
883 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emul_tlbp()
885 uint32_t pc = vcpu->arch.pc; in kvm_mips_emul_tlbp()
888 index = kvm_mips_guest_tlb_lookup(vcpu, entryhi); in kvm_mips_emul_tlbp()
905 unsigned int kvm_mips_config1_wrmask(struct kvm_vcpu *vcpu) in kvm_mips_config1_wrmask() argument
910 if (kvm_mips_guest_can_have_fpu(&vcpu->arch)) in kvm_mips_config1_wrmask()
923 unsigned int kvm_mips_config3_wrmask(struct kvm_vcpu *vcpu) in kvm_mips_config3_wrmask() argument
929 if (kvm_mips_guest_can_have_msa(&vcpu->arch)) in kvm_mips_config3_wrmask()
942 unsigned int kvm_mips_config4_wrmask(struct kvm_vcpu *vcpu) in kvm_mips_config4_wrmask() argument
955 unsigned int kvm_mips_config5_wrmask(struct kvm_vcpu *vcpu) in kvm_mips_config5_wrmask() argument
960 if (kvm_mips_guest_has_msa(&vcpu->arch)) in kvm_mips_config5_wrmask()
967 if (kvm_mips_guest_has_fpu(&vcpu->arch)) { in kvm_mips_config5_wrmask()
978 struct kvm_vcpu *vcpu) in kvm_mips_emulate_CP0() argument
980 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_CP0()
983 uint32_t pc = vcpu->arch.pc; in kvm_mips_emulate_CP0()
990 curr_pc = vcpu->arch.pc; in kvm_mips_emulate_CP0()
991 er = update_pc(vcpu, cause); in kvm_mips_emulate_CP0()
1006 er = kvm_mips_emul_tlbr(vcpu); in kvm_mips_emulate_CP0()
1009 er = kvm_mips_emul_tlbwi(vcpu); in kvm_mips_emulate_CP0()
1012 er = kvm_mips_emul_tlbwr(vcpu); in kvm_mips_emulate_CP0()
1015 er = kvm_mips_emul_tlbp(vcpu); in kvm_mips_emulate_CP0()
1021 er = kvm_mips_emul_eret(vcpu); in kvm_mips_emulate_CP0()
1025 er = kvm_mips_emul_wait(vcpu); in kvm_mips_emulate_CP0()
1036 vcpu->arch.gprs[rt] = kvm_mips_read_count(vcpu); in kvm_mips_emulate_CP0()
1038 vcpu->arch.gprs[rt] = 0x0; in kvm_mips_emulate_CP0()
1040 kvm_mips_trans_mfc0(inst, opc, vcpu); in kvm_mips_emulate_CP0()
1043 vcpu->arch.gprs[rt] = cop0->reg[rd][sel]; in kvm_mips_emulate_CP0()
1046 kvm_mips_trans_mfc0(inst, opc, vcpu); in kvm_mips_emulate_CP0()
1052 pc, rd, sel, rt, vcpu->arch.gprs[rt]); in kvm_mips_emulate_CP0()
1057 vcpu->arch.gprs[rt] = cop0->reg[rd][sel]; in kvm_mips_emulate_CP0()
1065 && (vcpu->arch.gprs[rt] >= in kvm_mips_emulate_CP0()
1068 vcpu->arch.gprs[rt]); in kvm_mips_emulate_CP0()
1077 vcpu->arch.gprs[rt]); in kvm_mips_emulate_CP0()
1082 vcpu->arch.gprs[rt] & ASID_MASK; in kvm_mips_emulate_CP0()
1083 if ((KSEGX(vcpu->arch.gprs[rt]) != CKSEG0) && in kvm_mips_emulate_CP0()
1089 vcpu->arch.gprs[rt] in kvm_mips_emulate_CP0()
1096 vcpu->arch.gprs[rt]); in kvm_mips_emulate_CP0()
1100 kvm_mips_write_count(vcpu, vcpu->arch.gprs[rt]); in kvm_mips_emulate_CP0()
1105 vcpu->arch.gprs[rt]); in kvm_mips_emulate_CP0()
1109 kvm_mips_write_compare(vcpu, in kvm_mips_emulate_CP0()
1110 vcpu->arch.gprs[rt], in kvm_mips_emulate_CP0()
1116 val = vcpu->arch.gprs[rt]; in kvm_mips_emulate_CP0()
1127 if (!kvm_mips_guest_has_fpu(&vcpu->arch)) in kvm_mips_emulate_CP0()
1147 kvm_drop_fpu(vcpu); in kvm_mips_emulate_CP0()
1158 vcpu->arch.fpu_inuse & KVM_MIPS_FPU_MSA) in kvm_mips_emulate_CP0()
1159 kvm_lose_fpu(vcpu); in kvm_mips_emulate_CP0()
1169 vcpu->arch.fpu_inuse & KVM_MIPS_FPU_FPU) in kvm_mips_emulate_CP0()
1181 if (!kvm_mips_guest_has_fpu(&vcpu->arch)) in kvm_mips_emulate_CP0()
1182 kvm_mips_trans_mtc0(inst, opc, vcpu); in kvm_mips_emulate_CP0()
1188 val = vcpu->arch.gprs[rt]; in kvm_mips_emulate_CP0()
1191 wrmask = kvm_mips_config5_wrmask(vcpu); in kvm_mips_emulate_CP0()
1204 vcpu->arch.fpu_inuse & KVM_MIPS_FPU_FPU) in kvm_mips_emulate_CP0()
1214 vcpu->arch.fpu_inuse & KVM_MIPS_FPU_MSA) in kvm_mips_emulate_CP0()
1225 new_cause = vcpu->arch.gprs[rt]; in kvm_mips_emulate_CP0()
1232 kvm_mips_count_disable_cause(vcpu); in kvm_mips_emulate_CP0()
1234 kvm_mips_count_enable_cause(vcpu); in kvm_mips_emulate_CP0()
1237 cop0->reg[rd][sel] = vcpu->arch.gprs[rt]; in kvm_mips_emulate_CP0()
1239 kvm_mips_trans_mtc0(inst, opc, vcpu); in kvm_mips_emulate_CP0()
1249 vcpu->arch.pc, rt, rd, sel); in kvm_mips_emulate_CP0()
1258 vcpu->arch.gprs[rt] = in kvm_mips_emulate_CP0()
1264 vcpu->arch.pc); in kvm_mips_emulate_CP0()
1268 vcpu->arch.pc); in kvm_mips_emulate_CP0()
1289 vcpu->arch.gprs[rt]); in kvm_mips_emulate_CP0()
1290 vcpu->arch.gprs[rd] = vcpu->arch.gprs[rt]; in kvm_mips_emulate_CP0()
1295 vcpu->arch.pc, copz); in kvm_mips_emulate_CP0()
1304 vcpu->arch.pc = curr_pc; in kvm_mips_emulate_CP0()
1318 struct kvm_vcpu *vcpu) in kvm_mips_emulate_store() argument
1330 curr_pc = vcpu->arch.pc; in kvm_mips_emulate_store()
1331 er = update_pc(vcpu, cause); in kvm_mips_emulate_store()
1348 kvm_mips_callbacks->gva_to_gpa(vcpu->arch. in kvm_mips_emulate_store()
1356 vcpu->mmio_needed = 1; in kvm_mips_emulate_store()
1357 vcpu->mmio_is_write = 1; in kvm_mips_emulate_store()
1358 *(u8 *) data = vcpu->arch.gprs[rt]; in kvm_mips_emulate_store()
1360 vcpu->arch.host_cp0_badvaddr, vcpu->arch.gprs[rt], in kvm_mips_emulate_store()
1372 kvm_mips_callbacks->gva_to_gpa(vcpu->arch. in kvm_mips_emulate_store()
1381 vcpu->mmio_needed = 1; in kvm_mips_emulate_store()
1382 vcpu->mmio_is_write = 1; in kvm_mips_emulate_store()
1383 *(uint32_t *) data = vcpu->arch.gprs[rt]; in kvm_mips_emulate_store()
1386 vcpu->arch.pc, vcpu->arch.host_cp0_badvaddr, in kvm_mips_emulate_store()
1387 vcpu->arch.gprs[rt], *(uint32_t *) data); in kvm_mips_emulate_store()
1397 kvm_mips_callbacks->gva_to_gpa(vcpu->arch. in kvm_mips_emulate_store()
1406 vcpu->mmio_needed = 1; in kvm_mips_emulate_store()
1407 vcpu->mmio_is_write = 1; in kvm_mips_emulate_store()
1408 *(uint16_t *) data = vcpu->arch.gprs[rt]; in kvm_mips_emulate_store()
1411 vcpu->arch.pc, vcpu->arch.host_cp0_badvaddr, in kvm_mips_emulate_store()
1412 vcpu->arch.gprs[rt], *(uint32_t *) data); in kvm_mips_emulate_store()
1423 vcpu->arch.pc = curr_pc; in kvm_mips_emulate_store()
1430 struct kvm_vcpu *vcpu) in kvm_mips_emulate_load() argument
1441 vcpu->arch.pending_load_cause = cause; in kvm_mips_emulate_load()
1442 vcpu->arch.io_gpr = rt; in kvm_mips_emulate_load()
1454 kvm_mips_callbacks->gva_to_gpa(vcpu->arch. in kvm_mips_emulate_load()
1463 vcpu->mmio_needed = 1; in kvm_mips_emulate_load()
1464 vcpu->mmio_is_write = 0; in kvm_mips_emulate_load()
1477 kvm_mips_callbacks->gva_to_gpa(vcpu->arch. in kvm_mips_emulate_load()
1486 vcpu->mmio_needed = 1; in kvm_mips_emulate_load()
1487 vcpu->mmio_is_write = 0; in kvm_mips_emulate_load()
1490 vcpu->mmio_needed = 2; in kvm_mips_emulate_load()
1492 vcpu->mmio_needed = 1; in kvm_mips_emulate_load()
1506 kvm_mips_callbacks->gva_to_gpa(vcpu->arch. in kvm_mips_emulate_load()
1515 vcpu->mmio_is_write = 0; in kvm_mips_emulate_load()
1518 vcpu->mmio_needed = 2; in kvm_mips_emulate_load()
1520 vcpu->mmio_needed = 1; in kvm_mips_emulate_load()
1533 int kvm_mips_sync_icache(unsigned long va, struct kvm_vcpu *vcpu) in kvm_mips_sync_icache() argument
1536 struct kvm *kvm = vcpu->kvm; in kvm_mips_sync_icache()
1546 kvm_arch_vcpu_dump_regs(vcpu); in kvm_mips_sync_icache()
1575 struct kvm_vcpu *vcpu) in kvm_mips_emulate_cache() argument
1577 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_cache()
1580 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_cache()
1588 curr_pc = vcpu->arch.pc; in kvm_mips_emulate_cache()
1589 er = update_pc(vcpu, cause); in kvm_mips_emulate_cache()
1611 vcpu->arch.pc, vcpu->arch.gprs[31], cache, op, base, in kvm_mips_emulate_cache()
1625 kvm_mips_trans_cache_index(inst, opc, vcpu); in kvm_mips_emulate_cache()
1632 if (kvm_mips_host_tlb_lookup(vcpu, va) < 0) in kvm_mips_emulate_cache()
1633 kvm_mips_handle_kseg0_tlb_fault(va, vcpu); in kvm_mips_emulate_cache()
1639 if (kvm_mips_host_tlb_lookup(vcpu, va) >= 0) in kvm_mips_emulate_cache()
1646 index = kvm_mips_guest_tlb_lookup(vcpu, (va & VPN2_MASK) | in kvm_mips_emulate_cache()
1651 vcpu->arch.host_cp0_entryhi = (va & VPN2_MASK); in kvm_mips_emulate_cache()
1652 vcpu->arch.host_cp0_badvaddr = va; in kvm_mips_emulate_cache()
1654 vcpu); in kvm_mips_emulate_cache()
1658 struct kvm_mips_tlb *tlb = &vcpu->arch.guest_tlb[index]; in kvm_mips_emulate_cache()
1665 run, vcpu); in kvm_mips_emulate_cache()
1673 kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, in kvm_mips_emulate_cache()
1699 kvm_mips_trans_cache_va(inst, opc, vcpu); in kvm_mips_emulate_cache()
1707 kvm_mips_trans_cache_va(inst, opc, vcpu); in kvm_mips_emulate_cache()
1721 vcpu->arch.pc = curr_pc; in kvm_mips_emulate_cache()
1728 struct kvm_vcpu *vcpu) in kvm_mips_emulate_inst() argument
1737 inst = kvm_get_inst(opc, vcpu); in kvm_mips_emulate_inst()
1741 er = kvm_mips_emulate_CP0(inst, opc, cause, run, vcpu); in kvm_mips_emulate_inst()
1746 er = kvm_mips_emulate_store(inst, cause, run, vcpu); in kvm_mips_emulate_inst()
1753 er = kvm_mips_emulate_load(inst, cause, run, vcpu); in kvm_mips_emulate_inst()
1757 ++vcpu->stat.cache_exits; in kvm_mips_emulate_inst()
1758 trace_kvm_exit(vcpu, CACHE_EXITS); in kvm_mips_emulate_inst()
1759 er = kvm_mips_emulate_cache(inst, opc, cause, run, vcpu); in kvm_mips_emulate_inst()
1765 kvm_arch_vcpu_dump_regs(vcpu); in kvm_mips_emulate_inst()
1776 struct kvm_vcpu *vcpu) in kvm_mips_emulate_syscall() argument
1778 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_syscall()
1779 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_syscall()
1811 struct kvm_vcpu *vcpu) in kvm_mips_emulate_tlbmiss_ld() argument
1813 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_tlbmiss_ld()
1814 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_tlbmiss_ld()
1815 unsigned long entryhi = (vcpu->arch. host_cp0_badvaddr & VPN2_MASK) | in kvm_mips_emulate_tlbmiss_ld()
1845 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); in kvm_mips_emulate_tlbmiss_ld()
1857 struct kvm_vcpu *vcpu) in kvm_mips_emulate_tlbinv_ld() argument
1859 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_tlbinv_ld()
1860 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_tlbinv_ld()
1862 (vcpu->arch.host_cp0_badvaddr & VPN2_MASK) | in kvm_mips_emulate_tlbinv_ld()
1891 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); in kvm_mips_emulate_tlbinv_ld()
1903 struct kvm_vcpu *vcpu) in kvm_mips_emulate_tlbmiss_st() argument
1905 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_tlbmiss_st()
1906 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_tlbmiss_st()
1907 unsigned long entryhi = (vcpu->arch.host_cp0_badvaddr & VPN2_MASK) | in kvm_mips_emulate_tlbmiss_st()
1935 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); in kvm_mips_emulate_tlbmiss_st()
1947 struct kvm_vcpu *vcpu) in kvm_mips_emulate_tlbinv_st() argument
1949 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_tlbinv_st()
1950 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_tlbinv_st()
1951 unsigned long entryhi = (vcpu->arch.host_cp0_badvaddr & VPN2_MASK) | in kvm_mips_emulate_tlbinv_st()
1979 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); in kvm_mips_emulate_tlbinv_st()
1991 struct kvm_vcpu *vcpu) in kvm_mips_handle_tlbmod() argument
1995 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_handle_tlbmod()
1996 unsigned long entryhi = (vcpu->arch.host_cp0_badvaddr & VPN2_MASK) | in kvm_mips_handle_tlbmod()
2001 index = kvm_mips_guest_tlb_lookup(vcpu, entryhi); in kvm_mips_handle_tlbmod()
2004 kvm_mips_host_tlb_inv(vcpu, vcpu->arch.host_cp0_badvaddr); in kvm_mips_handle_tlbmod()
2007 kvm_mips_dump_guest_tlbs(vcpu); in kvm_mips_handle_tlbmod()
2013 er = kvm_mips_emulate_tlbmod(cause, opc, run, vcpu); in kvm_mips_handle_tlbmod()
2020 struct kvm_vcpu *vcpu) in kvm_mips_emulate_tlbmod() argument
2022 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_tlbmod()
2023 unsigned long entryhi = (vcpu->arch.host_cp0_badvaddr & VPN2_MASK) | in kvm_mips_emulate_tlbmod()
2025 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_tlbmod()
2050 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); in kvm_mips_emulate_tlbmod()
2062 struct kvm_vcpu *vcpu) in kvm_mips_emulate_fpu_exc() argument
2064 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_fpu_exc()
2065 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_fpu_exc()
2091 struct kvm_vcpu *vcpu) in kvm_mips_emulate_ri_exc() argument
2093 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_ri_exc()
2094 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_ri_exc()
2126 struct kvm_vcpu *vcpu) in kvm_mips_emulate_bp_exc() argument
2128 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_bp_exc()
2129 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_bp_exc()
2161 struct kvm_vcpu *vcpu) in kvm_mips_emulate_trap_exc() argument
2163 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_trap_exc()
2164 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_trap_exc()
2196 struct kvm_vcpu *vcpu) in kvm_mips_emulate_msafpe_exc() argument
2198 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_msafpe_exc()
2199 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_msafpe_exc()
2231 struct kvm_vcpu *vcpu) in kvm_mips_emulate_fpe_exc() argument
2233 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_fpe_exc()
2234 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_fpe_exc()
2266 struct kvm_vcpu *vcpu) in kvm_mips_emulate_msadis_exc() argument
2268 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_msadis_exc()
2269 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_msadis_exc()
2315 struct kvm_vcpu *vcpu) in kvm_mips_handle_ri() argument
2317 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_handle_ri()
2318 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_handle_ri()
2327 curr_pc = vcpu->arch.pc; in kvm_mips_handle_ri()
2328 er = update_pc(vcpu, cause); in kvm_mips_handle_ri()
2336 inst = kvm_get_inst(opc, vcpu); in kvm_mips_handle_ri()
2344 int usermode = !KVM_GUEST_KERNEL_MODE(vcpu); in kvm_mips_handle_ri()
2362 arch->gprs[rt] = kvm_mips_read_count(vcpu); in kvm_mips_handle_ri()
2394 vcpu->arch.pc = curr_pc; in kvm_mips_handle_ri()
2395 return kvm_mips_emulate_ri_exc(cause, opc, run, vcpu); in kvm_mips_handle_ri()
2398 enum emulation_result kvm_mips_complete_mmio_load(struct kvm_vcpu *vcpu, in kvm_mips_complete_mmio_load() argument
2401 unsigned long *gpr = &vcpu->arch.gprs[vcpu->arch.io_gpr]; in kvm_mips_complete_mmio_load()
2410 er = update_pc(vcpu, vcpu->arch.pending_load_cause); in kvm_mips_complete_mmio_load()
2420 if (vcpu->mmio_needed == 2) in kvm_mips_complete_mmio_load()
2427 if (vcpu->mmio_needed == 2) in kvm_mips_complete_mmio_load()
2434 if (vcpu->arch.pending_load_cause & CAUSEF_BD) in kvm_mips_complete_mmio_load()
2436 vcpu->arch.pc, run->mmio.len, vcpu->arch.io_gpr, *gpr, in kvm_mips_complete_mmio_load()
2437 vcpu->mmio_needed); in kvm_mips_complete_mmio_load()
2446 struct kvm_vcpu *vcpu) in kvm_mips_emulate_exc() argument
2449 struct mips_coproc *cop0 = vcpu->arch.cop0; in kvm_mips_emulate_exc()
2450 struct kvm_vcpu_arch *arch = &vcpu->arch; in kvm_mips_emulate_exc()
2468 kvm_write_c0_guest_badvaddr(cop0, vcpu->arch.host_cp0_badvaddr); in kvm_mips_emulate_exc()
2484 struct kvm_vcpu *vcpu) in kvm_mips_check_privilege() argument
2488 unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr; in kvm_mips_check_privilege()
2490 int usermode = !KVM_GUEST_KERNEL_MODE(vcpu); in kvm_mips_check_privilege()
2565 kvm_mips_emulate_exc(cause, opc, run, vcpu); in kvm_mips_check_privilege()
2580 struct kvm_vcpu *vcpu) in kvm_mips_handle_tlbmiss() argument
2584 unsigned long va = vcpu->arch.host_cp0_badvaddr; in kvm_mips_handle_tlbmiss()
2588 vcpu->arch.host_cp0_badvaddr, vcpu->arch.host_cp0_entryhi); in kvm_mips_handle_tlbmiss()
2596 index = kvm_mips_guest_tlb_lookup(vcpu, in kvm_mips_handle_tlbmiss()
2599 (vcpu->arch.cop0) & ASID_MASK)); in kvm_mips_handle_tlbmiss()
2602 er = kvm_mips_emulate_tlbmiss_ld(cause, opc, run, vcpu); in kvm_mips_handle_tlbmiss()
2604 er = kvm_mips_emulate_tlbmiss_st(cause, opc, run, vcpu); in kvm_mips_handle_tlbmiss()
2611 struct kvm_mips_tlb *tlb = &vcpu->arch.guest_tlb[index]; in kvm_mips_handle_tlbmiss()
2620 vcpu); in kvm_mips_handle_tlbmiss()
2623 vcpu); in kvm_mips_handle_tlbmiss()
2636 kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, NULL, in kvm_mips_handle_tlbmiss()