Lines Matching +full:reserved +full:- +full:ipi +full:- +full:vectors
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * All rights reserved.
62 #define x2apic(vlapic) (((vlapic)->msr_apicbase & APICBASE_X2APIC) ? 1 : 0)
65 * The 'vlapic->timer_mtx' is used to provide mutual exclusion between the
67 * - timer_freq_bt, timer_period_bt, timer_fire_bt
68 * - timer LVT register
70 #define VLAPIC_TIMER_LOCK(vlapic) mtx_lock_spin(&((vlapic)->timer_mtx))
71 #define VLAPIC_TIMER_UNLOCK(vlapic) mtx_unlock_spin(&((vlapic)->timer_mtx))
72 #define VLAPIC_TIMER_LOCKED(vlapic) mtx_owned(&((vlapic)->timer_mtx))
76 * - arbitrary but chosen to be in the ballpark of contemporary hardware.
77 * - power-of-two to avoid loss of precision when converted to a bintime.
90 return (vlapic->vcpuid); in vlapic_get_id()
92 return (vlapic->vcpuid << 24); in vlapic_get_id()
112 lapic = vlapic->apic_page; in vlapic_dfr_write_handler()
114 VM_CTR1(vlapic->vm, "ignoring write to DFR in x2apic mode: %#x", in vlapic_dfr_write_handler()
115 lapic->dfr); in vlapic_dfr_write_handler()
116 lapic->dfr = 0; in vlapic_dfr_write_handler()
120 lapic->dfr &= APIC_DFR_MODEL_MASK; in vlapic_dfr_write_handler()
121 lapic->dfr |= APIC_DFR_RESERVED; in vlapic_dfr_write_handler()
123 if ((lapic->dfr & APIC_DFR_MODEL_MASK) == APIC_DFR_MODEL_FLAT) in vlapic_dfr_write_handler()
125 else if ((lapic->dfr & APIC_DFR_MODEL_MASK) == APIC_DFR_MODEL_CLUSTER) in vlapic_dfr_write_handler()
128 VLAPIC_CTR1(vlapic, "DFR in Unknown Model %#x", lapic->dfr); in vlapic_dfr_write_handler()
136 lapic = vlapic->apic_page; in vlapic_ldr_write_handler()
138 /* LDR is read-only in x2apic mode */ in vlapic_ldr_write_handler()
141 lapic->ldr); in vlapic_ldr_write_handler()
142 lapic->ldr = x2apic_ldr(vlapic); in vlapic_ldr_write_handler()
144 lapic->ldr &= ~APIC_LDR_RESERVED; in vlapic_ldr_write_handler()
145 VLAPIC_CTR1(vlapic, "vlapic LDR set to %#x", lapic->ldr); in vlapic_ldr_write_handler()
158 lapic = vlapic->apic_page; in vlapic_id_write_handler()
159 lapic->id = vlapic_get_id(vlapic); in vlapic_id_write_handler()
205 lapic = vlapic->apic_page; 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()
221 KASSERT(ccr <= lapic->icr_timer, ("vlapic_get_ccr: invalid ccr %#x, " in vlapic_get_ccr()
222 "icr_timer is %#x", ccr, lapic->icr_timer)); in vlapic_get_ccr()
224 ccr, lapic->icr_timer); in vlapic_get_ccr()
235 lapic = vlapic->apic_page; in vlapic_dcr_write_handler()
238 divisor = vlapic_timer_divisor(lapic->dcr_timer); in vlapic_dcr_write_handler()
240 lapic->dcr_timer, divisor); 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()
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()
274 lapic = vlapic->apic_page; in vlapic_set_intr_ready()
275 if (!(lapic->svr & APIC_SVR_ENABLE)) { 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()
295 irrptr = &lapic->irr0; in vlapic_set_intr_ready()
299 * Verify that the trigger-mode of the interrupt matches with in vlapic_set_intr_ready()
302 tmrptr = &lapic->tmr0; in vlapic_set_intr_ready()
305 "interrupt is %s-triggered", idx / 4, tmrptr[idx], in vlapic_set_intr_ready()
316 struct LAPIC *lapic = vlapic->apic_page; in vlapic_get_lvtptr()
321 return (&lapic->lvt_cmci); in vlapic_get_lvtptr()
323 i = (offset - APIC_OFFSET_TIMER_LVT) >> 2; in vlapic_get_lvtptr()
324 return ((&lapic->lvt_timer) + i); in vlapic_get_lvtptr()
358 index = -1; in lvt_off_to_idx()
374 val = atomic_load_acq_32(&vlapic->lvt_last[idx]); in vlapic_get_lvt()
385 lapic = vlapic->apic_page; in vlapic_lvt_write_handler()
390 if (!(lapic->svr & APIC_SVR_ENABLE)) in vlapic_lvt_write_handler()
409 atomic_store_rel_32(&vlapic->lvt_last[idx], val); in vlapic_lvt_write_handler()
415 struct LAPIC *lapic = vlapic->apic_page; in vlapic_mask_lvts()
417 lapic->lvt_cmci |= APIC_LVT_M; in vlapic_mask_lvts()
420 lapic->lvt_timer |= APIC_LVT_M; in vlapic_mask_lvts()
423 lapic->lvt_thermal |= APIC_LVT_M; in vlapic_mask_lvts()
426 lapic->lvt_pcint |= APIC_LVT_M; in vlapic_mask_lvts()
429 lapic->lvt_lint0 |= APIC_LVT_M; in vlapic_mask_lvts()
432 lapic->lvt_lint1 |= APIC_LVT_M; in vlapic_mask_lvts()
435 lapic->lvt_error |= APIC_LVT_M; in vlapic_mask_lvts()
444 reg = atomic_load_acq_32(&vlapic->lvt_last[lvt]); 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()
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()
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()
520 lastprio = -1; 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()
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()
555 vlapic->apic_page->ppr = ppr; in vlapic_update_ppr()
565 static VMM_STAT(VLAPIC_GRATUITOUS_EOI, "EOI without any in-service interrupt");
570 struct LAPIC *lapic = vlapic->apic_page; in vlapic_process_eoi()
574 isrptr = &lapic->isr0; in vlapic_process_eoi()
575 tmrptr = &lapic->tmr0; in vlapic_process_eoi()
577 for (i = 7; i >= 0; i--) { in vlapic_process_eoi()
580 if (bitpos-- != 0) { in vlapic_process_eoi()
581 if (vlapic->isrvec_stk_top <= 0) { in vlapic_process_eoi()
583 vlapic->isrvec_stk_top); in vlapic_process_eoi()
589 vlapic->isrvec_stk_top--; in vlapic_process_eoi()
592 vioapic_process_eoi(vlapic->vm, vector); in vlapic_process_eoi()
598 vmm_stat_incr(vlapic->vcpu, VLAPIC_GRATUITOUS_EOI, 1); in vlapic_process_eoi()
624 vlapic->esr_pending |= mask; in vlapic_set_error()
634 vmm_stat_incr(vlapic->vcpu, VLAPIC_INTR_ERROR, 1); in vlapic_set_error()
648 vmm_stat_incr(vlapic->vcpu, VLAPIC_INTR_TIMER, 1); in vlapic_fire_timer()
660 vmm_stat_incr(vlapic->vcpu, VLAPIC_INTR_CMC, 1); in vlapic_fire_cmci()
679 vm_inject_extint(vlapic->vcpu); in vlapic_trigger_lvt()
682 vm_inject_nmi(vlapic->vcpu); in vlapic_trigger_lvt()
699 vmm_stat_array_incr(vlapic->vcpu, LVTS_TRIGGERRED, in vlapic_trigger_lvt()
712 callout_reset_sbt_curcpu(&vlapic->callout, t, 0, in vlapic_callout_reset()
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()
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()
756 rem_sbt -= bttosbt(bt); in vlapic_callout_handler()
763 vlapic->timer_fire_bt = btnow; in vlapic_callout_handler()
765 "usecs, period is %lu usecs - resetting time base", 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()
786 lapic = vlapic->apic_page; in vlapic_icrtmr_write_handler()
787 icr_timer = lapic->icr_timer; 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()
799 callout_stop(&vlapic->callout); in vlapic_icrtmr_write_handler()
808 * 'x2apic_dest' specifies whether 'dest' is interpreted as x2APIC (32-bit)
809 * or xAPIC (8-bit) destination field.
841 * In the "Flat Model" the MDA is interpreted as an 8-bit wide in vlapic_calcdest()
866 dfr = vlapic->apic_page->dfr; in vlapic_calcdest()
867 ldr = vlapic->apic_page->ldr; in vlapic_calcdest()
888 * model for this vcpu - skip it. in vlapic_calcdest()
891 "model %x - cannot deliver interrupt", dfr); in vlapic_calcdest()
910 struct LAPIC *lapic = vlapic->apic_page; in vlapic_set_tpr()
912 if (lapic->tpr != val) { in vlapic_set_tpr()
914 lapic->tpr, val); in vlapic_set_tpr()
915 lapic->tpr = val; in vlapic_set_tpr()
923 struct LAPIC *lapic = vlapic->apic_page; in vlapic_get_tpr()
925 return (lapic->tpr); in vlapic_get_tpr()
934 vm_inject_gp(vlapic->vcpu); in vlapic_set_cr8()
964 * AMD allows a level assert IPI and Intel converts a level in vlapic_is_icr_valid()
965 * assert IPI into an edge IPI. in vlapic_is_icr_valid()
979 * AMD allows a level assert IPI and Intel converts a level in vlapic_is_icr_valid()
980 * assert IPI into an edge IPI. in vlapic_is_icr_valid()
1043 lapic = vlapic->apic_page; in vlapic_icrlo_write_handler()
1044 lapic->icr_lo &= ~APIC_DELSTAT_PEND; in vlapic_icrlo_write_handler()
1045 icrval = ((uint64_t)lapic->icr_hi << 32) | lapic->icr_lo; 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()
1086 * IPI. 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()
1105 "vlapic sending ipi %d to vcpuid %d", vec, i); in vlapic_icrlo_write_handler()
1111 vcpu = vm_vcpu(vlapic->vm, i); in vlapic_icrlo_write_handler()
1114 "vlapic sending ipi nmi to vcpuid %d", i); 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()
1142 vmexit->exitcode = VM_EXITCODE_IPI; in vlapic_icrlo_write_handler()
1143 vmexit->u.ipi.mode = mode; in vlapic_icrlo_write_handler()
1144 vmexit->u.ipi.vector = vec; in vlapic_icrlo_write_handler()
1145 *vm_exitinfo_cpuset(vlapic->vcpu) = ipimask; in vlapic_icrlo_write_handler()
1166 uint8_t vec = vme->u.ipi.vector; in vm_handle_ipi()
1169 switch (vme->u.ipi.mode) { in vm_handle_ipi()
1181 if (!vlapic->ipi_exit) in vm_handle_ipi()
1188 * Ignore SIPIs in any state other than wait-for-SIPI in vm_handle_ipi()
1198 * Old bhyve versions don't support the IPI in vm_handle_ipi()
1201 if (!vlapic->ipi_exit) { in vm_handle_ipi()
1202 vme->exitcode = VM_EXITCODE_SPINUP_AP; in vm_handle_ipi()
1203 vme->u.spinup_ap.vcpu = CPU_FFS(dmask) - 1; in vm_handle_ipi()
1204 vme->u.spinup_ap.rip = vec << PAGE_SHIFT; in vm_handle_ipi()
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()
1232 struct LAPIC *lapic = vlapic->apic_page; 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()
1241 irrptr = &lapic->irr0; in vlapic_pending_intr()
1243 for (i = 7; i >= 0; i--) { in vlapic_pending_intr()
1248 vector = i * 32 + (bitpos - 1); in vlapic_pending_intr()
1249 if (PRIO(vector) > PRIO(lapic->ppr)) { in vlapic_pending_intr()
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()
1277 irrptr = &lapic->irr0; in vlapic_intr_accepted()
1281 isrptr = &lapic->isr0; 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()
1303 lapic = vlapic->apic_page; in vlapic_svr_write_handler()
1305 new = lapic->svr; 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()
1318 callout_stop(&vlapic->callout); in vlapic_svr_write_handler()
1326 VLAPIC_CTR0(vlapic, "vlapic is software-enabled"); in vlapic_svr_write_handler()
1337 struct LAPIC *lapic = vlapic->apic_page; in vlapic_read()
1368 *data = lapic->id; in vlapic_read()
1371 *data = lapic->version; in vlapic_read()
1377 *data = lapic->apr; in vlapic_read()
1380 *data = lapic->ppr; in vlapic_read()
1383 *data = lapic->eoi; in vlapic_read()
1386 *data = lapic->ldr; in vlapic_read()
1389 *data = lapic->dfr; in vlapic_read()
1392 *data = lapic->svr; in vlapic_read()
1395 i = (offset - APIC_OFFSET_ISR0) >> 2; in vlapic_read()
1396 reg = &lapic->isr0; in vlapic_read()
1400 i = (offset - APIC_OFFSET_TMR0) >> 2; in vlapic_read()
1401 reg = &lapic->tmr0; in vlapic_read()
1405 i = (offset - APIC_OFFSET_IRR0) >> 2; in vlapic_read()
1406 reg = &lapic->irr0; in vlapic_read()
1410 *data = lapic->esr; in vlapic_read()
1413 *data = lapic->icr_lo; in vlapic_read()
1415 *data |= (uint64_t)lapic->icr_hi << 32; in vlapic_read()
1418 *data = lapic->icr_hi; in vlapic_read()
1430 *data = lapic->icr_timer; in vlapic_read()
1436 *data = lapic->dcr_timer; in vlapic_read()
1458 struct LAPIC *lapic = vlapic->apic_page; in vlapic_write()
1491 lapic->id = data; in vlapic_write()
1501 lapic->ldr = data; in vlapic_write()
1505 lapic->dfr = data; in vlapic_write()
1509 lapic->svr = data; in vlapic_write()
1513 lapic->icr_lo = data; in vlapic_write()
1515 lapic->icr_hi = data >> 32; in vlapic_write()
1519 lapic->icr_hi = data; in vlapic_write()
1528 lapic->icr_timer = data; in vlapic_write()
1533 lapic->dcr_timer = data; in vlapic_write()
1567 lapic = vlapic->apic_page; in vlapic_reset()
1570 lapic->id = vlapic_get_id(vlapic); in vlapic_reset()
1571 lapic->version = VLAPIC_VERSION; in vlapic_reset()
1572 lapic->version |= (VLAPIC_MAXLVT_INDEX << MAXLVTSHIFT); in vlapic_reset()
1573 lapic->dfr = 0xffffffff; in vlapic_reset()
1574 lapic->svr = APIC_SVR_VECTOR; in vlapic_reset()
1578 lapic->dcr_timer = 0; in vlapic_reset()
1581 vlapic->svr_last = lapic->svr; in vlapic_reset()
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()
1618 callout_drain(&vlapic->callout); in vlapic_cleanup()
1619 mtx_destroy(&vlapic->timer_mtx); in vlapic_cleanup()
1626 return (vlapic->msr_apicbase); in vlapic_get_apicbase()
1633 if (vlapic->msr_apicbase != new) { in vlapic_set_apicbase()
1635 "not supported", vlapic->msr_apicbase, new); in vlapic_set_apicbase()
1636 return (-1); in vlapic_set_apicbase()
1651 vlapic->msr_apicbase &= ~APICBASE_X2APIC; in vlapic_set_x2apic_state()
1653 vlapic->msr_apicbase |= APICBASE_X2APIC; in vlapic_set_x2apic_state()
1656 * Reset the local APIC registers whose values are mode-dependent. 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()
1664 lapic->ldr = x2apic_ldr(vlapic); in vlapic_set_x2apic_state()
1665 lapic->dfr = 0; in vlapic_set_x2apic_state()
1667 lapic->ldr = 0; in vlapic_set_x2apic_state()
1668 lapic->dfr = 0xffffffff; 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()
1721 * sending an IPI to 'hostcpu'. in vlapic_post_intr()
1723 if (vlapic->ops.post_intr) in vlapic_post_intr()
1724 (*vlapic->ops.post_intr)(vlapic, hostcpu); in vlapic_post_intr()
1732 struct LAPIC *lapic = vlapic->apic_page; in vlapic_enabled()
1734 if ((vlapic->msr_apicbase & APICBASE_ENABLED) != 0 && in vlapic_enabled()
1735 (lapic->svr & APIC_SVR_ENABLE) != 0) in vlapic_enabled()
1748 lapic = vlapic->apic_page; in vlapic_set_tmr()
1749 tmrptr = &lapic->tmr0; 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()
1766 VLAPIC_CTR0(vlapic, "vlapic resetting all vectors to edge-triggered"); in vlapic_reset_tmr()
1785 VLAPIC_CTR1(vlapic, "Ignoring level trigger-mode for " in vlapic_set_tmr_level()
1786 "delivery-mode %d", delmode); 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()
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()
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()
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()
1873 if (meta->op == VM_SNAPSHOT_RESTORE) { 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()
1887 if (meta->op == VM_SNAPSHOT_SAVE) in vlapic_snapshot()
1892 if (meta->op == VM_SNAPSHOT_RESTORE && in vlapic_snapshot()
1893 vlapic_enabled(vlapic) && lapic->icr_timer != 0) { in vlapic_snapshot()