Lines Matching refs:vlapic

62 #define	x2apic(vlapic)	(((vlapic)->msr_apicbase & APICBASE_X2APIC) ? 1 : 0)  argument
70 #define VLAPIC_TIMER_LOCK(vlapic) mtx_lock_spin(&((vlapic)->timer_mtx)) argument
71 #define VLAPIC_TIMER_UNLOCK(vlapic) mtx_unlock_spin(&((vlapic)->timer_mtx)) argument
72 #define VLAPIC_TIMER_LOCKED(vlapic) mtx_owned(&((vlapic)->timer_mtx)) argument
81 static void vlapic_set_error(struct vlapic *, uint32_t, bool);
83 static void vlapic_reset(struct vlapic *vlapic);
86 vlapic_get_id(struct vlapic *vlapic) in vlapic_get_id() argument
89 if (x2apic(vlapic)) in vlapic_get_id()
90 return (vlapic->vcpuid); in vlapic_get_id()
92 return (vlapic->vcpuid << 24); in vlapic_get_id()
96 x2apic_ldr(struct vlapic *vlapic) in x2apic_ldr() argument
101 apicid = vlapic_get_id(vlapic); in x2apic_ldr()
108 vlapic_dfr_write_handler(struct vlapic *vlapic) in vlapic_dfr_write_handler() argument
112 lapic = vlapic->apic_page; in vlapic_dfr_write_handler()
113 if (x2apic(vlapic)) { in vlapic_dfr_write_handler()
114 VM_CTR1(vlapic->vm, "ignoring write to DFR in x2apic mode: %#x", in vlapic_dfr_write_handler()
124 VLAPIC_CTR0(vlapic, "vlapic DFR in Flat Model"); in vlapic_dfr_write_handler()
126 VLAPIC_CTR0(vlapic, "vlapic DFR in Cluster Model"); in vlapic_dfr_write_handler()
128 VLAPIC_CTR1(vlapic, "DFR in Unknown Model %#x", lapic->dfr); in vlapic_dfr_write_handler()
132 vlapic_ldr_write_handler(struct vlapic *vlapic) in vlapic_ldr_write_handler() argument
136 lapic = vlapic->apic_page; in vlapic_ldr_write_handler()
139 if (x2apic(vlapic)) { in vlapic_ldr_write_handler()
140 VLAPIC_CTR1(vlapic, "ignoring write to LDR in x2apic mode: %#x", in vlapic_ldr_write_handler()
142 lapic->ldr = x2apic_ldr(vlapic); in vlapic_ldr_write_handler()
145 VLAPIC_CTR1(vlapic, "vlapic LDR set to %#x", lapic->ldr); in vlapic_ldr_write_handler()
150 vlapic_id_write_handler(struct vlapic *vlapic) in vlapic_id_write_handler() argument
158 lapic = vlapic->apic_page; in vlapic_id_write_handler()
159 lapic->id = vlapic_get_id(vlapic); in vlapic_id_write_handler()
198 vlapic_get_ccr(struct vlapic *vlapic) in vlapic_get_ccr() argument
205 lapic = vlapic->apic_page; in vlapic_get_ccr()
207 VLAPIC_TIMER_LOCK(vlapic); in vlapic_get_ccr()
208 if (callout_active(&vlapic->callout)) { in vlapic_get_ccr()
214 if (bintime_cmp(&vlapic->timer_fire_bt, &bt_now, >)) { in vlapic_get_ccr()
215 bt_rem = vlapic->timer_fire_bt; in vlapic_get_ccr()
217 ccr += bt_rem.sec * BT2FREQ(&vlapic->timer_freq_bt); in vlapic_get_ccr()
218 ccr += bt_rem.frac / vlapic->timer_freq_bt.frac; in vlapic_get_ccr()
223 VLAPIC_CTR2(vlapic, "vlapic ccr_timer = %#x, icr_timer = %#x", in vlapic_get_ccr()
225 VLAPIC_TIMER_UNLOCK(vlapic); in vlapic_get_ccr()
230 vlapic_dcr_write_handler(struct vlapic *vlapic) in vlapic_dcr_write_handler() argument
235 lapic = vlapic->apic_page; in vlapic_dcr_write_handler()
236 VLAPIC_TIMER_LOCK(vlapic); in vlapic_dcr_write_handler()
239 VLAPIC_CTR2(vlapic, "vlapic dcr_timer=%#x, divisor=%d", in vlapic_dcr_write_handler()
248 FREQ2BT(VLAPIC_BUS_FREQ / divisor, &vlapic->timer_freq_bt); in vlapic_dcr_write_handler()
249 vlapic->timer_period_bt = vlapic->timer_freq_bt; in vlapic_dcr_write_handler()
250 bintime_mul(&vlapic->timer_period_bt, lapic->icr_timer); in vlapic_dcr_write_handler()
252 VLAPIC_TIMER_UNLOCK(vlapic); in vlapic_dcr_write_handler()
256 vlapic_esr_write_handler(struct vlapic *vlapic) in vlapic_esr_write_handler() argument
260 lapic = vlapic->apic_page; in vlapic_esr_write_handler()
261 lapic->esr = vlapic->esr_pending; in vlapic_esr_write_handler()
262 vlapic->esr_pending = 0; in vlapic_esr_write_handler()
266 vlapic_set_intr_ready(struct vlapic *vlapic, int vector, bool level) in vlapic_set_intr_ready() argument
274 lapic = vlapic->apic_page; in vlapic_set_intr_ready()
276 VLAPIC_CTR1(vlapic, "vlapic is software disabled, ignoring " in vlapic_set_intr_ready()
282 vlapic_set_error(vlapic, APIC_ESR_RECEIVE_ILLEGAL_VECTOR, in vlapic_set_intr_ready()
284 VLAPIC_CTR1(vlapic, "vlapic ignoring interrupt to vector %d", in vlapic_set_intr_ready()
289 if (vlapic->ops.set_intr_ready) in vlapic_set_intr_ready()
290 return ((*vlapic->ops.set_intr_ready)(vlapic, vector, level)); in vlapic_set_intr_ready()
304 VLAPIC_CTR3(vlapic, "vlapic TMR[%d] is 0x%08x but " in vlapic_set_intr_ready()
309 VLAPIC_CTR_IRR(vlapic, "vlapic_set_intr_ready"); in vlapic_set_intr_ready()
314 vlapic_get_lvtptr(struct vlapic *vlapic, uint32_t offset) in vlapic_get_lvtptr() argument
316 struct LAPIC *lapic = vlapic->apic_page; in vlapic_get_lvtptr()
368 vlapic_get_lvt(struct vlapic *vlapic, uint32_t offset) in vlapic_get_lvt() argument
374 val = atomic_load_acq_32(&vlapic->lvt_last[idx]); in vlapic_get_lvt()
379 vlapic_lvt_write_handler(struct vlapic *vlapic, uint32_t offset) in vlapic_lvt_write_handler() argument
385 lapic = vlapic->apic_page; in vlapic_lvt_write_handler()
386 lvtptr = vlapic_get_lvtptr(vlapic, offset); in vlapic_lvt_write_handler()
409 atomic_store_rel_32(&vlapic->lvt_last[idx], val); in vlapic_lvt_write_handler()
413 vlapic_mask_lvts(struct vlapic *vlapic) in vlapic_mask_lvts() argument
415 struct LAPIC *lapic = vlapic->apic_page; in vlapic_mask_lvts()
418 vlapic_lvt_write_handler(vlapic, APIC_OFFSET_CMCI_LVT); in vlapic_mask_lvts()
421 vlapic_lvt_write_handler(vlapic, APIC_OFFSET_TIMER_LVT); in vlapic_mask_lvts()
424 vlapic_lvt_write_handler(vlapic, APIC_OFFSET_THERM_LVT); in vlapic_mask_lvts()
427 vlapic_lvt_write_handler(vlapic, APIC_OFFSET_PERF_LVT); in vlapic_mask_lvts()
430 vlapic_lvt_write_handler(vlapic, APIC_OFFSET_LINT0_LVT); in vlapic_mask_lvts()
433 vlapic_lvt_write_handler(vlapic, APIC_OFFSET_LINT1_LVT); in vlapic_mask_lvts()
436 vlapic_lvt_write_handler(vlapic, APIC_OFFSET_ERROR_LVT); in vlapic_mask_lvts()
440 vlapic_fire_lvt(struct vlapic *vlapic, u_int lvt) in vlapic_fire_lvt() argument
444 reg = atomic_load_acq_32(&vlapic->lvt_last[lvt]); in vlapic_fire_lvt()
454 vlapic_set_error(vlapic, APIC_ESR_SEND_ILLEGAL_VECTOR, in vlapic_fire_lvt()
458 if (vlapic_set_intr_ready(vlapic, vec, false)) in vlapic_fire_lvt()
459 vcpu_notify_event(vlapic->vcpu, true); in vlapic_fire_lvt()
462 vm_inject_nmi(vlapic->vcpu); in vlapic_fire_lvt()
465 vm_inject_extint(vlapic->vcpu); in vlapic_fire_lvt()
476 dump_isrvec_stk(struct vlapic *vlapic) in dump_isrvec_stk() argument
481 isrptr = &vlapic->apic_page->isr0; in dump_isrvec_stk()
485 for (i = 0; i <= vlapic->isrvec_stk_top; i++) in dump_isrvec_stk()
486 printf("isrvec_stk[%d] = %d\n", i, vlapic->isrvec_stk[i]); in dump_isrvec_stk()
495 vlapic_update_ppr(struct vlapic *vlapic) in vlapic_update_ppr() argument
505 isrvec = vlapic->isrvec_stk[vlapic->isrvec_stk_top]; in vlapic_update_ppr()
506 tpr = vlapic->apic_page->tpr; in vlapic_update_ppr()
513 if (vlapic->isrvec_stk_top == 0 && isrvec != 0) in vlapic_update_ppr()
521 for (i = 1; i <= vlapic->isrvec_stk_top; i++) { in vlapic_update_ppr()
522 curprio = PRIO(vlapic->isrvec_stk[i]); in vlapic_update_ppr()
524 dump_isrvec_stk(vlapic); in vlapic_update_ppr()
535 isrptr = &vlapic->apic_page->isr0; in vlapic_update_ppr()
539 if (i > vlapic->isrvec_stk_top || in vlapic_update_ppr()
540 vlapic->isrvec_stk[i] != vector) { in vlapic_update_ppr()
541 dump_isrvec_stk(vlapic); in vlapic_update_ppr()
555 vlapic->apic_page->ppr = ppr; in vlapic_update_ppr()
556 VLAPIC_CTR1(vlapic, "vlapic_update_ppr 0x%02x", ppr); in vlapic_update_ppr()
560 vlapic_sync_tpr(struct vlapic *vlapic) in vlapic_sync_tpr() argument
562 vlapic_update_ppr(vlapic); in vlapic_sync_tpr()
568 vlapic_process_eoi(struct vlapic *vlapic) in vlapic_process_eoi() argument
570 struct LAPIC *lapic = vlapic->apic_page; in vlapic_process_eoi()
581 if (vlapic->isrvec_stk_top <= 0) { in vlapic_process_eoi()
583 vlapic->isrvec_stk_top); in vlapic_process_eoi()
587 VLAPIC_CTR1(vlapic, "EOI vector %d", vector); in vlapic_process_eoi()
588 VLAPIC_CTR_ISR(vlapic, "vlapic_process_eoi"); in vlapic_process_eoi()
589 vlapic->isrvec_stk_top--; in vlapic_process_eoi()
590 vlapic_update_ppr(vlapic); in vlapic_process_eoi()
592 vioapic_process_eoi(vlapic->vm, vector); in vlapic_process_eoi()
597 VLAPIC_CTR0(vlapic, "Gratuitous EOI"); in vlapic_process_eoi()
598 vmm_stat_incr(vlapic->vcpu, VLAPIC_GRATUITOUS_EOI, 1); in vlapic_process_eoi()
609 vlapic_periodic_timer(struct vlapic *vlapic) in vlapic_periodic_timer() argument
613 lvt = vlapic_get_lvt(vlapic, APIC_OFFSET_TIMER_LVT); in vlapic_periodic_timer()
621 vlapic_set_error(struct vlapic *vlapic, uint32_t mask, bool lvt_error) in vlapic_set_error() argument
624 vlapic->esr_pending |= mask; in vlapic_set_error()
633 if (vlapic_fire_lvt(vlapic, APIC_LVT_ERROR)) { in vlapic_set_error()
634 vmm_stat_incr(vlapic->vcpu, VLAPIC_INTR_ERROR, 1); in vlapic_set_error()
641 vlapic_fire_timer(struct vlapic *vlapic) in vlapic_fire_timer() argument
644 KASSERT(VLAPIC_TIMER_LOCKED(vlapic), ("vlapic_fire_timer not locked")); in vlapic_fire_timer()
646 if (vlapic_fire_lvt(vlapic, APIC_LVT_TIMER)) { in vlapic_fire_timer()
647 VLAPIC_CTR0(vlapic, "vlapic timer fired"); in vlapic_fire_timer()
648 vmm_stat_incr(vlapic->vcpu, VLAPIC_INTR_TIMER, 1); in vlapic_fire_timer()
656 vlapic_fire_cmci(struct vlapic *vlapic) in vlapic_fire_cmci() argument
659 if (vlapic_fire_lvt(vlapic, APIC_LVT_CMCI)) { in vlapic_fire_cmci()
660 vmm_stat_incr(vlapic->vcpu, VLAPIC_INTR_CMC, 1); in vlapic_fire_cmci()
668 vlapic_trigger_lvt(struct vlapic *vlapic, int vector) in vlapic_trigger_lvt() argument
671 if (vlapic_enabled(vlapic) == false) { in vlapic_trigger_lvt()
679 vm_inject_extint(vlapic->vcpu); in vlapic_trigger_lvt()
682 vm_inject_nmi(vlapic->vcpu); in vlapic_trigger_lvt()
698 if (vlapic_fire_lvt(vlapic, vector)) { in vlapic_trigger_lvt()
699 vmm_stat_array_incr(vlapic->vcpu, LVTS_TRIGGERRED, in vlapic_trigger_lvt()
710 vlapic_callout_reset(struct vlapic *vlapic, sbintime_t t) in vlapic_callout_reset() argument
712 callout_reset_sbt_curcpu(&vlapic->callout, t, 0, in vlapic_callout_reset()
713 vlapic_callout_handler, vlapic, 0); in vlapic_callout_reset()
719 struct vlapic *vlapic; in vlapic_callout_handler() local
723 vlapic = arg; in vlapic_callout_handler()
725 VLAPIC_TIMER_LOCK(vlapic); in vlapic_callout_handler()
726 if (callout_pending(&vlapic->callout)) /* callout was reset */ in vlapic_callout_handler()
729 if (!callout_active(&vlapic->callout)) /* callout was stopped */ in vlapic_callout_handler()
732 callout_deactivate(&vlapic->callout); in vlapic_callout_handler()
734 vlapic_fire_timer(vlapic); in vlapic_callout_handler()
736 if (vlapic_periodic_timer(vlapic)) { in vlapic_callout_handler()
738 KASSERT(bintime_cmp(&btnow, &vlapic->timer_fire_bt, >=), in vlapic_callout_handler()
740 btnow.sec, btnow.frac, vlapic->timer_fire_bt.sec, in vlapic_callout_handler()
741 vlapic->timer_fire_bt.frac)); in vlapic_callout_handler()
748 bintime_sub(&bt, &vlapic->timer_fire_bt); in vlapic_callout_handler()
750 rem_sbt = bttosbt(vlapic->timer_period_bt); in vlapic_callout_handler()
751 if (bintime_cmp(&bt, &vlapic->timer_period_bt, <)) { in vlapic_callout_handler()
763 vlapic->timer_fire_bt = btnow; in vlapic_callout_handler()
764 VLAPIC_CTR2(vlapic, "vlapic timer lagging by %lu " in vlapic_callout_handler()
767 bttosbt(vlapic->timer_period_bt) / SBT_1US); in vlapic_callout_handler()
770 bintime_add(&vlapic->timer_fire_bt, &vlapic->timer_period_bt); in vlapic_callout_handler()
771 vlapic_callout_reset(vlapic, rem_sbt); in vlapic_callout_handler()
774 VLAPIC_TIMER_UNLOCK(vlapic); in vlapic_callout_handler()
778 vlapic_icrtmr_write_handler(struct vlapic *vlapic) in vlapic_icrtmr_write_handler() argument
784 VLAPIC_TIMER_LOCK(vlapic); in vlapic_icrtmr_write_handler()
786 lapic = vlapic->apic_page; in vlapic_icrtmr_write_handler()
789 vlapic->timer_period_bt = vlapic->timer_freq_bt; in vlapic_icrtmr_write_handler()
790 bintime_mul(&vlapic->timer_period_bt, icr_timer); in vlapic_icrtmr_write_handler()
793 binuptime(&vlapic->timer_fire_bt); in vlapic_icrtmr_write_handler()
794 bintime_add(&vlapic->timer_fire_bt, &vlapic->timer_period_bt); in vlapic_icrtmr_write_handler()
796 sbt = bttosbt(vlapic->timer_period_bt); in vlapic_icrtmr_write_handler()
797 vlapic_callout_reset(vlapic, sbt); in vlapic_icrtmr_write_handler()
799 callout_stop(&vlapic->callout); in vlapic_icrtmr_write_handler()
801 VLAPIC_TIMER_UNLOCK(vlapic); in vlapic_icrtmr_write_handler()
815 struct vlapic *vlapic; in vlapic_calcdest() local
865 vlapic = vm_lapic(vm_vcpu(vm, vcpuid)); in vlapic_calcdest()
866 dfr = vlapic->apic_page->dfr; in vlapic_calcdest()
867 ldr = vlapic->apic_page->ldr; in vlapic_calcdest()
875 if (x2apic(vlapic)) { in vlapic_calcdest()
890 VLAPIC_CTR1(vlapic, "vlapic has bad logical " in vlapic_calcdest()
908 vlapic_set_tpr(struct vlapic *vlapic, uint8_t val) in vlapic_set_tpr() argument
910 struct LAPIC *lapic = vlapic->apic_page; in vlapic_set_tpr()
913 VLAPIC_CTR2(vlapic, "vlapic TPR changed from %#x to %#x", in vlapic_set_tpr()
916 vlapic_update_ppr(vlapic); in vlapic_set_tpr()
921 vlapic_get_tpr(struct vlapic *vlapic) in vlapic_get_tpr() argument
923 struct LAPIC *lapic = vlapic->apic_page; in vlapic_get_tpr()
929 vlapic_set_cr8(struct vlapic *vlapic, uint64_t val) in vlapic_set_cr8() argument
934 vm_inject_gp(vlapic->vcpu); in vlapic_set_cr8()
939 vlapic_set_tpr(vlapic, tpr); in vlapic_set_cr8()
943 vlapic_get_cr8(struct vlapic *vlapic) in vlapic_get_cr8() argument
947 tpr = vlapic_get_tpr(vlapic); in vlapic_get_cr8()
1032 vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu) in vlapic_icrlo_write_handler() argument
1043 lapic = vlapic->apic_page; in vlapic_icrlo_write_handler()
1047 if (x2apic(vlapic)) in vlapic_icrlo_write_handler()
1056 VLAPIC_CTR2(vlapic, "icrlo 0x%016lx triggered ipi %d", icrval, vec); in vlapic_icrlo_write_handler()
1060 vlapic_calcdest(vlapic->vm, &dmask, dest, phys, false, x2apic(vlapic)); in vlapic_icrlo_write_handler()
1063 CPU_SETOF(vlapic->vcpuid, &dmask); in vlapic_icrlo_write_handler()
1066 dmask = vm_active_cpus(vlapic->vm); in vlapic_icrlo_write_handler()
1069 dmask = vm_active_cpus(vlapic->vm); in vlapic_icrlo_write_handler()
1070 CPU_CLR(vlapic->vcpuid, &dmask); in vlapic_icrlo_write_handler()
1080 VLAPIC_CTR1(vlapic, "Ignoring invalid ICR %016lx", icrval); in vlapic_icrlo_write_handler()
1093 vlapic_set_error(vlapic, APIC_ESR_SEND_ILLEGAL_VECTOR, in vlapic_icrlo_write_handler()
1095 VLAPIC_CTR1(vlapic, "Ignoring invalid IPI %d", vec); in vlapic_icrlo_write_handler()
1100 vcpu = vm_vcpu(vlapic->vm, i); in vlapic_icrlo_write_handler()
1102 vmm_stat_incr(vlapic->vcpu, VLAPIC_IPI_SEND, 1); in vlapic_icrlo_write_handler()
1104 VLAPIC_CTR2(vlapic, in vlapic_icrlo_write_handler()
1111 vcpu = vm_vcpu(vlapic->vm, i); in vlapic_icrlo_write_handler()
1113 VLAPIC_CTR1(vlapic, in vlapic_icrlo_write_handler()
1120 if (!vlapic->ipi_exit) { in vlapic_icrlo_write_handler()
1124 i = vm_apicid2vcpuid(vlapic->vm, dest); in vlapic_icrlo_write_handler()
1125 if (i >= vm_get_maxcpus(vlapic->vm) || in vlapic_icrlo_write_handler()
1126 i == vlapic->vcpuid) in vlapic_icrlo_write_handler()
1141 vmexit = vm_exitinfo(vlapic->vcpu); in vlapic_icrlo_write_handler()
1145 *vm_exitinfo_cpuset(vlapic->vcpu) = ipimask; in vlapic_icrlo_write_handler()
1156 struct vlapic *vlapic = vm_lapic(vcpu); in vlapic_handle_init() local
1158 vlapic_reset(vlapic); in vlapic_handle_init()
1164 struct vlapic *vlapic = vm_lapic(vcpu); in vm_handle_ipi() local
1181 if (!vlapic->ipi_exit) in vm_handle_ipi()
1201 if (!vlapic->ipi_exit) { in vm_handle_ipi()
1216 vlapic_self_ipi_handler(struct vlapic *vlapic, uint64_t val) in vlapic_self_ipi_handler() argument
1220 KASSERT(x2apic(vlapic), ("SELF_IPI does not exist in xAPIC mode")); in vlapic_self_ipi_handler()
1223 lapic_intr_edge(vlapic->vcpu, vec); in vlapic_self_ipi_handler()
1224 vmm_stat_incr(vlapic->vcpu, VLAPIC_IPI_SEND, 1); in vlapic_self_ipi_handler()
1225 vmm_stat_incr(vlapic->vcpu, VLAPIC_IPI_RECV, 1); in vlapic_self_ipi_handler()
1226 VLAPIC_CTR1(vlapic, "vlapic self-ipi %d", vec); in vlapic_self_ipi_handler()
1230 vlapic_pending_intr(struct vlapic *vlapic, int *vecptr) in vlapic_pending_intr() argument
1232 struct LAPIC *lapic = vlapic->apic_page; in vlapic_pending_intr()
1236 vlapic_update_ppr(vlapic); in vlapic_pending_intr()
1238 if (vlapic->ops.pending_intr) in vlapic_pending_intr()
1239 return ((*vlapic->ops.pending_intr)(vlapic, vecptr)); in vlapic_pending_intr()
1250 VLAPIC_CTR1(vlapic, "pending intr %d", vector); in vlapic_pending_intr()
1262 vlapic_intr_accepted(struct vlapic *vlapic, int vector) in vlapic_intr_accepted() argument
1264 struct LAPIC *lapic = vlapic->apic_page; in vlapic_intr_accepted()
1268 if (vlapic->ops.intr_accepted) in vlapic_intr_accepted()
1269 return ((*vlapic->ops.intr_accepted)(vlapic, vector)); in vlapic_intr_accepted()
1279 VLAPIC_CTR_IRR(vlapic, "vlapic_intr_accepted"); in vlapic_intr_accepted()
1283 VLAPIC_CTR_ISR(vlapic, "vlapic_intr_accepted"); in vlapic_intr_accepted()
1288 vlapic->isrvec_stk_top++; in vlapic_intr_accepted()
1290 stk_top = vlapic->isrvec_stk_top; in vlapic_intr_accepted()
1294 vlapic->isrvec_stk[stk_top] = vector; in vlapic_intr_accepted()
1298 vlapic_svr_write_handler(struct vlapic *vlapic) in vlapic_svr_write_handler() argument
1303 lapic = vlapic->apic_page; in vlapic_svr_write_handler()
1306 old = vlapic->svr_last; in vlapic_svr_write_handler()
1307 vlapic->svr_last = new; in vlapic_svr_write_handler()
1316 VLAPIC_CTR0(vlapic, "vlapic is software-disabled"); in vlapic_svr_write_handler()
1317 VLAPIC_TIMER_LOCK(vlapic); in vlapic_svr_write_handler()
1318 callout_stop(&vlapic->callout); in vlapic_svr_write_handler()
1319 VLAPIC_TIMER_UNLOCK(vlapic); in vlapic_svr_write_handler()
1320 vlapic_mask_lvts(vlapic); in vlapic_svr_write_handler()
1326 VLAPIC_CTR0(vlapic, "vlapic is software-enabled"); in vlapic_svr_write_handler()
1327 if (vlapic_periodic_timer(vlapic)) in vlapic_svr_write_handler()
1328 vlapic_icrtmr_write_handler(vlapic); in vlapic_svr_write_handler()
1334 vlapic_read(struct vlapic *vlapic, int mmio_access, uint64_t offset, in vlapic_read() argument
1337 struct LAPIC *lapic = vlapic->apic_page; in vlapic_read()
1342 if (x2apic(vlapic) && mmio_access) { in vlapic_read()
1343 VLAPIC_CTR1(vlapic, "MMIO read from offset %#lx in x2APIC mode", in vlapic_read()
1349 if (!x2apic(vlapic) && !mmio_access) { in vlapic_read()
1353 VLAPIC_CTR1(vlapic, "x2APIC MSR read from offset %#lx in " in vlapic_read()
1374 *data = vlapic_get_tpr(vlapic); in vlapic_read()
1414 if (x2apic(vlapic)) in vlapic_read()
1422 *data = vlapic_get_lvt(vlapic, offset); in vlapic_read()
1424 reg = vlapic_get_lvtptr(vlapic, offset); in vlapic_read()
1433 *data = vlapic_get_ccr(vlapic); in vlapic_read()
1450 VLAPIC_CTR2(vlapic, "vlapic read offset %#x, data %#lx", offset, *data); in vlapic_read()
1455 vlapic_write(struct vlapic *vlapic, int mmio_access, uint64_t offset, in vlapic_write() argument
1458 struct LAPIC *lapic = vlapic->apic_page; in vlapic_write()
1465 VLAPIC_CTR2(vlapic, "vlapic write offset %#lx, data %#lx", in vlapic_write()
1472 if (x2apic(vlapic) && mmio_access) { in vlapic_write()
1473 VLAPIC_CTR2(vlapic, "MMIO write of %#lx to offset %#lx " in vlapic_write()
1481 if (!x2apic(vlapic) && !mmio_access) { in vlapic_write()
1482 VLAPIC_CTR2(vlapic, "x2APIC MSR write of %#lx to offset %#lx " in vlapic_write()
1492 vlapic_id_write_handler(vlapic); in vlapic_write()
1495 vlapic_set_tpr(vlapic, data & 0xff); in vlapic_write()
1498 vlapic_process_eoi(vlapic); in vlapic_write()
1502 vlapic_ldr_write_handler(vlapic); in vlapic_write()
1506 vlapic_dfr_write_handler(vlapic); in vlapic_write()
1510 vlapic_svr_write_handler(vlapic); in vlapic_write()
1514 if (x2apic(vlapic)) in vlapic_write()
1516 retval = vlapic_icrlo_write_handler(vlapic, retu); in vlapic_write()
1523 regptr = vlapic_get_lvtptr(vlapic, offset); in vlapic_write()
1525 vlapic_lvt_write_handler(vlapic, offset); in vlapic_write()
1529 vlapic_icrtmr_write_handler(vlapic); in vlapic_write()
1534 vlapic_dcr_write_handler(vlapic); in vlapic_write()
1538 vlapic_esr_write_handler(vlapic); in vlapic_write()
1542 if (x2apic(vlapic)) in vlapic_write()
1543 vlapic_self_ipi_handler(vlapic, data); in vlapic_write()
1563 vlapic_reset(struct vlapic *vlapic) in vlapic_reset() argument
1567 lapic = vlapic->apic_page; in vlapic_reset()
1570 lapic->id = vlapic_get_id(vlapic); in vlapic_reset()
1575 vlapic_mask_lvts(vlapic); in vlapic_reset()
1576 vlapic_reset_tmr(vlapic); in vlapic_reset()
1579 vlapic_dcr_write_handler(vlapic); in vlapic_reset()
1581 vlapic->svr_last = lapic->svr; in vlapic_reset()
1585 vlapic_init(struct vlapic *vlapic) in vlapic_init() argument
1587 KASSERT(vlapic->vm != NULL, ("vlapic_init: vm is not initialized")); in vlapic_init()
1588 KASSERT(vlapic->vcpuid >= 0 && in vlapic_init()
1589 vlapic->vcpuid < vm_get_maxcpus(vlapic->vm), in vlapic_init()
1591 KASSERT(vlapic->apic_page != NULL, ("vlapic_init: apic_page is not " in vlapic_init()
1601 mtx_init(&vlapic->timer_mtx, "vlapic timer mtx", NULL, MTX_SPIN); in vlapic_init()
1602 callout_init(&vlapic->callout, 1); in vlapic_init()
1604 vlapic->msr_apicbase = DEFAULT_APIC_BASE | APICBASE_ENABLED; in vlapic_init()
1606 if (vlapic->vcpuid == 0) in vlapic_init()
1607 vlapic->msr_apicbase |= APICBASE_BSP; in vlapic_init()
1609 vlapic->ipi_exit = false; in vlapic_init()
1611 vlapic_reset(vlapic); in vlapic_init()
1615 vlapic_cleanup(struct vlapic *vlapic) in vlapic_cleanup() argument
1618 callout_drain(&vlapic->callout); in vlapic_cleanup()
1619 mtx_destroy(&vlapic->timer_mtx); in vlapic_cleanup()
1623 vlapic_get_apicbase(struct vlapic *vlapic) in vlapic_get_apicbase() argument
1626 return (vlapic->msr_apicbase); in vlapic_get_apicbase()
1630 vlapic_set_apicbase(struct vlapic *vlapic, uint64_t new) in vlapic_set_apicbase() argument
1633 if (vlapic->msr_apicbase != new) { in vlapic_set_apicbase()
1634 VLAPIC_CTR2(vlapic, "Changing APIC_BASE MSR from %#lx to %#lx " in vlapic_set_apicbase()
1635 "not supported", vlapic->msr_apicbase, new); in vlapic_set_apicbase()
1645 struct vlapic *vlapic; in vlapic_set_x2apic_state() local
1648 vlapic = vm_lapic(vcpu); in vlapic_set_x2apic_state()
1651 vlapic->msr_apicbase &= ~APICBASE_X2APIC; in vlapic_set_x2apic_state()
1653 vlapic->msr_apicbase |= APICBASE_X2APIC; in vlapic_set_x2apic_state()
1661 lapic = vlapic->apic_page; in vlapic_set_x2apic_state()
1662 lapic->id = vlapic_get_id(vlapic); in vlapic_set_x2apic_state()
1663 if (x2apic(vlapic)) { in vlapic_set_x2apic_state()
1664 lapic->ldr = x2apic_ldr(vlapic); in vlapic_set_x2apic_state()
1672 if (vlapic->ops.enable_x2apic_mode) in vlapic_set_x2apic_state()
1673 (*vlapic->ops.enable_x2apic_mode)(vlapic); in vlapic_set_x2apic_state()
1712 vlapic_post_intr(struct vlapic *vlapic, int hostcpu, int ipinum) in vlapic_post_intr() argument
1723 if (vlapic->ops.post_intr) in vlapic_post_intr()
1724 (*vlapic->ops.post_intr)(vlapic, hostcpu); in vlapic_post_intr()
1730 vlapic_enabled(struct vlapic *vlapic) in vlapic_enabled() argument
1732 struct LAPIC *lapic = vlapic->apic_page; in vlapic_enabled()
1734 if ((vlapic->msr_apicbase & APICBASE_ENABLED) != 0 && in vlapic_enabled()
1742 vlapic_set_tmr(struct vlapic *vlapic, int vector, bool level) in vlapic_set_tmr() argument
1748 lapic = vlapic->apic_page; in vlapic_set_tmr()
1757 if (vlapic->ops.set_tmr != NULL) in vlapic_set_tmr()
1758 (*vlapic->ops.set_tmr)(vlapic, vector, level); in vlapic_set_tmr()
1762 vlapic_reset_tmr(struct vlapic *vlapic) in vlapic_reset_tmr() argument
1766 VLAPIC_CTR0(vlapic, "vlapic resetting all vectors to edge-triggered"); in vlapic_reset_tmr()
1769 vlapic_set_tmr(vlapic, vector, false); in vlapic_reset_tmr()
1773 vlapic_set_tmr_level(struct vlapic *vlapic, uint32_t dest, bool phys, in vlapic_set_tmr_level() argument
1785 VLAPIC_CTR1(vlapic, "Ignoring level trigger-mode for " in vlapic_set_tmr_level()
1791 vlapic_calcdest(vlapic->vm, &dmask, dest, phys, lowprio, false); in vlapic_set_tmr_level()
1793 if (!CPU_ISSET(vlapic->vcpuid, &dmask)) in vlapic_set_tmr_level()
1796 VLAPIC_CTR1(vlapic, "vector %d set to level-triggered", vector); in vlapic_set_tmr_level()
1797 vlapic_set_tmr(vlapic, vector, true); in vlapic_set_tmr_level()
1802 vlapic_reset_callout(struct vlapic *vlapic, uint32_t ccr) in vlapic_reset_callout() argument
1810 VLAPIC_TIMER_LOCK(vlapic); in vlapic_reset_callout()
1812 bt = vlapic->timer_freq_bt; in vlapic_reset_callout()
1816 binuptime(&vlapic->timer_fire_bt); in vlapic_reset_callout()
1817 bintime_add(&vlapic->timer_fire_bt, &bt); in vlapic_reset_callout()
1820 vlapic_callout_reset(vlapic, sbt); in vlapic_reset_callout()
1823 if (vlapic_periodic_timer(vlapic)) { in vlapic_reset_callout()
1824 binuptime(&vlapic->timer_fire_bt); in vlapic_reset_callout()
1825 bintime_add(&vlapic->timer_fire_bt, in vlapic_reset_callout()
1826 &vlapic->timer_period_bt); in vlapic_reset_callout()
1827 sbt = bttosbt(vlapic->timer_period_bt); in vlapic_reset_callout()
1829 callout_stop(&vlapic->callout); in vlapic_reset_callout()
1830 vlapic_callout_reset(vlapic, sbt); in vlapic_reset_callout()
1834 VLAPIC_TIMER_UNLOCK(vlapic); in vlapic_reset_callout()
1842 struct vlapic *vlapic; in vlapic_snapshot() local
1856 vlapic = vm_lapic(vcpu); in vlapic_snapshot()
1859 lapic = vlapic->apic_page; in vlapic_snapshot()
1862 SNAPSHOT_VAR_OR_LEAVE(vlapic->esr_pending, meta, ret, done); in vlapic_snapshot()
1864 SNAPSHOT_VAR_OR_LEAVE(vlapic->timer_freq_bt.sec, in vlapic_snapshot()
1866 SNAPSHOT_VAR_OR_LEAVE(vlapic->timer_freq_bt.frac, in vlapic_snapshot()
1874 vlapic->timer_period_bt = vlapic->timer_freq_bt; in vlapic_snapshot()
1875 bintime_mul(&vlapic->timer_period_bt, lapic->icr_timer); in vlapic_snapshot()
1878 SNAPSHOT_BUF_OR_LEAVE(vlapic->isrvec_stk, in vlapic_snapshot()
1879 sizeof(vlapic->isrvec_stk), in vlapic_snapshot()
1881 SNAPSHOT_VAR_OR_LEAVE(vlapic->isrvec_stk_top, meta, ret, done); in vlapic_snapshot()
1883 SNAPSHOT_BUF_OR_LEAVE(vlapic->lvt_last, in vlapic_snapshot()
1884 sizeof(vlapic->lvt_last), in vlapic_snapshot()
1888 ccr = vlapic_get_ccr(vlapic); in vlapic_snapshot()
1893 vlapic_enabled(vlapic) && lapic->icr_timer != 0) { in vlapic_snapshot()
1900 vlapic_reset_callout(vlapic, ccr); in vlapic_snapshot()