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,

Attachment: pgpVivGQDuO5P.pgp
Description: PGP signature

Reply via email to