Index: sys/dev/xen/debug/debug.c =================================================================== --- sys/dev/xen/debug/debug.c +++ sys/dev/xen/debug/debug.c @@ -81,7 +81,8 @@ mtx_lock_spin(&lock); sbuf_clear(buf); - xc_printf("Printing stack trace vCPU%d\n", PCPU_GET(vcpu_id)); + xc_printf("Printing stack trace vCPU%d\n", + PCPU_ID_GET(PCPU_GET(cpuid))); stack_sbuf_print_ddb(buf, &st); sbuf_finish(buf); mtx_unlock_spin(&lock); Index: sys/x86/include/xen/xen-os.h =================================================================== --- sys/x86/include/xen/xen-os.h +++ sys/x86/include/xen/xen-os.h @@ -40,6 +40,8 @@ /* Everything below this point is not included by assembler (.S) files. */ #ifndef __ASSEMBLY__ +#include + /* If non-zero, the hypervisor has been configured to use a direct vector */ extern int xen_vector_callback_enabled; @@ -52,6 +54,13 @@ /* tunable for disabling PV nics */ extern int xen_disable_pv_nics; +static inline u_int +PCPU_ID_GET(u_int cpuid) +{ + + return (pcpu_find(cpuid)->pc_vcpu_id); +} + static inline bool xen_support_evtchn_rebind(void) { Index: sys/xen/xen_intr.c =================================================================== --- sys/xen/xen_intr.c +++ sys/xen/xen_intr.c @@ -140,7 +140,7 @@ static int xen_intr_source_pending(struct intsrc *isrc); static int xen_intr_config_intr(struct intsrc *isrc, enum intr_trigger trig, enum intr_polarity pol); -static int xen_intr_assign_cpu(struct intsrc *isrc, u_int apic_id); +static int xen_intr_assign_cpu(struct intsrc *isrc, u_int to_cpu); /** * PIC interface for all event channel port types except physical IRQs. @@ -676,7 +676,7 @@ { #ifdef SMP int cpu = isrc->xi_cpu; - int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; + int vcpu_id = PCPU_ID_GET(cpu); int error; struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id }; @@ -695,7 +695,7 @@ xen_rebind_virq(struct xenisrc *isrc) { int cpu = isrc->xi_cpu; - int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; + int vcpu_id = PCPU_ID_GET(cpu); int error; struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq, .vcpu = vcpu_id }; @@ -729,8 +729,7 @@ isrc->xi_cpu = 0; #ifdef SMP - error = xen_intr_assign_cpu(&isrc->xi_arch.xai_intsrc, - cpu_apic_ids[cpu]); + error = xen_intr_assign_cpu(&isrc->xi_arch.xai_intsrc, cpu); if (error) panic("unable to bind xen intr#%d to CPU#%d: %d", isrc->xi_virq, cpu, error); @@ -870,25 +869,22 @@ * Configure CPU affinity for interrupt source event delivery. * * \param isrc The interrupt source to configure. - * \param apic_id The apic id of the CPU for handling future events. + * \param to_cpu The id of the CPU for handling future events. * * \returns 0 if successful, otherwise an errno. */ static int -xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id) +xen_intr_assign_cpu(struct intsrc *base_isrc, u_int to_cpu) { #ifdef SMP struct evtchn_bind_vcpu bind_vcpu; struct xenisrc *isrc; - u_int to_cpu, vcpu_id; + u_int vcpu_id = PCPU_ID_GET(to_cpu); int error, masked; if (!xen_support_evtchn_rebind()) return (EOPNOTSUPP); - to_cpu = apic_cpuid(apic_id); - vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id; - mtx_lock(&xen_intr_isrc_lock); isrc = (struct xenisrc *)base_isrc; if (!is_valid_evtchn(isrc->xi_port)) { @@ -1105,7 +1101,7 @@ driver_filter_t filter, driver_intr_t handler, void *arg, enum intr_type flags, xen_intr_handle_t *port_handlep) { - int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; + int vcpu_id = PCPU_ID_GET(cpu); struct xenisrc *isrc; struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = vcpu_id }; int error; @@ -1146,7 +1142,7 @@ * masks manually so events can't fire on the wrong cpu * during AP startup. */ - xen_intr_assign_cpu(&isrc->xi_arch.xai_intsrc, cpu_apic_ids[cpu]); + xen_intr_assign_cpu(&isrc->xi_arch.xai_intsrc, cpu); } #endif @@ -1166,7 +1162,7 @@ enum intr_type flags, xen_intr_handle_t *port_handlep) { #ifdef SMP - int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; + int vcpu_id = PCPU_ID_GET(cpu); struct xenisrc *isrc; struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id }; /* Same size as the one used by intr_handler->ih_name. */ @@ -1203,7 +1199,7 @@ * masks manually so events can't fire on the wrong cpu * during AP startup. */ - xen_intr_assign_cpu(&isrc->xi_arch.xai_intsrc, cpu_apic_ids[cpu]); + xen_intr_assign_cpu(&isrc->xi_arch.xai_intsrc, cpu); } /*