On Mon, Jun 16, 2014 at 08:43:03AM +0000, Roger Pau Monnц╘ wrote: > Author: royger > Date: Mon Jun 16 08:43:03 2014 > New Revision: 267526 > URL: http://svnweb.freebsd.org/changeset/base/267526 > > Log: > amd64/i386: introduce APIC hooks for different APIC implementations. > > This is needed for Xen PV(H) guests, since there's no hardware lapic > available on this kind of domains. This commit should not change > functionality. > > Sponsored by: Citrix Systems R&D > Reviewed by: jhb > Approved by: gibbs > > amd64/include/cpu.h: > amd64/amd64/mp_machdep.c: > i386/include/cpu.h: > i386/i386/mp_machdep.c: > - Remove lapic_ipi_vectored hook from cpu_ops, since it's now > implemented in the lapic hooks. > > amd64/amd64/mp_machdep.c: > i386/i386/mp_machdep.c: > - Use lapic_ipi_vectored directly, since it's now an inline function > that will call the appropiate hook. > > x86/x86/local_apic.c: > - Prefix bare metal public lapic functions with native_ and mark them > as static. > - Define default implementation of apic_ops. > > x86/include/apicvar.h: > - Declare the apic_ops structure and create inline functions to > access the hooks, so the change is transparent to existing users of > the lapic_ functions. > > x86/xen/hvm.c: > - Switch to use the new apic_ops. > > Modified: > head/sys/amd64/amd64/mp_machdep.c > head/sys/amd64/include/cpu.h > head/sys/i386/i386/mp_machdep.c > head/sys/i386/include/cpu.h > head/sys/x86/include/apicvar.h > head/sys/x86/x86/local_apic.c > head/sys/x86/xen/hvm.c > > Modified: head/sys/x86/x86/local_apic.c > ============================================================================== > --- head/sys/x86/x86/local_apic.c Mon Jun 16 08:41:57 2014 > (r267525) > +++ head/sys/x86/x86/local_apic.c Mon Jun 16 08:43:03 2014 > (r267526) > @@ -169,11 +169,76 @@ static void lapic_timer_stop(struct lapi
> +struct apic_ops apic_ops = {
> + .create = native_lapic_create,
> + .init = native_lapic_init,
> + .setup = native_lapic_setup,
> + .dump = native_lapic_dump,
> + .disable = native_lapic_disable,
> + .eoi = native_lapic_eoi,
> + .id = native_lapic_id,
> + .intr_pending = native_lapic_intr_pending,
> + .set_logical_id = native_lapic_set_logical_id,
> + .cpuid = native_apic_cpuid,
> + .alloc_vector = native_apic_alloc_vector,
> + .alloc_vectors = native_apic_alloc_vectors,
> + .enable_vector = native_apic_enable_vector,
> + .disable_vector = native_apic_disable_vector,
> + .free_vector = native_apic_free_vector,
> + .enable_pmc = native_lapic_enable_pmc,
> + .disable_pmc = native_lapic_disable_pmc,
> + .reenable_pmc = native_lapic_reenable_pmc,
> + .enable_cmc = native_lapic_enable_cmc,
> + .ipi_raw = native_lapic_ipi_raw,
> + .ipi_vectored = native_lapic_ipi_vectored,
> + .ipi_wait = native_lapic_ipi_wait,
> + .set_lvt_mask = native_lapic_set_lvt_mask,
> + .set_lvt_mode = native_lapic_set_lvt_mode,
> + .set_lvt_polarity = native_lapic_set_lvt_polarity,
> + .set_lvt_triggermode = native_lapic_set_lvt_triggermode,
> +};
> +
> static uint32_t
> lvt_mode(struct lapic *la, u_int pin, uint32_t value)
> {
This breaks UP compilation, since native_lapic_ipi_* methods are
conditionalized on SMP. The patch below worked for me. I think that this
way is better than removing #ifdef SMP braces around native_lapic_ipi_*
functions definitons, because it catches attempts to call IPIs on the UP
machine, if such error ever made.
Do you agree with the fix ?
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index 802168e..b15a02c 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -230,9 +230,11 @@ struct apic_ops apic_ops = {
.disable_pmc = native_lapic_disable_pmc,
.reenable_pmc = native_lapic_reenable_pmc,
.enable_cmc = native_lapic_enable_cmc,
+#ifdef SMP
.ipi_raw = native_lapic_ipi_raw,
.ipi_vectored = native_lapic_ipi_vectored,
.ipi_wait = native_lapic_ipi_wait,
+#endif
.set_lvt_mask = native_lapic_set_lvt_mask,
.set_lvt_mode = native_lapic_set_lvt_mode,
.set_lvt_polarity = native_lapic_set_lvt_polarity,
pgpVivGQDuO5P.pgp
Description: PGP signature
