Index: sys/arch/sparc64/include/cpu.h =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/include/cpu.h,v retrieving revision 1.113 diff -u -r1.113 cpu.h --- sys/arch/sparc64/include/cpu.h 24 Sep 2014 18:32:10 -0000 1.113 +++ sys/arch/sparc64/include/cpu.h 2 Jan 2015 19:44:50 -0000 @@ -287,7 +287,7 @@ void sparc64_multicast_ipi(sparc64_cpuset_t, ipifunc_t, uint64_t, uint64_t); void sparc64_broadcast_ipi(ipifunc_t, uint64_t, uint64_t); -void sparc64_send_ipi(int, ipifunc_t, uint64_t, uint64_t); +extern void (*sparc64_send_ipi)(int, ipifunc_t, uint64_t, uint64_t); /* * Call an arbitrary C function on another cpu (or all others but ourself) Index: sys/arch/sparc64/sparc64/ipifuncs.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/ipifuncs.c,v retrieving revision 1.53 diff -u -r1.53 ipifuncs.c --- sys/arch/sparc64/sparc64/ipifuncs.c 5 Nov 2014 13:30:11 -0000 1.53 +++ sys/arch/sparc64/sparc64/ipifuncs.c 2 Jan 2015 19:44:51 -0000 @@ -68,6 +68,7 @@ /* Send IPI functions for supported platforms */ static void sparc64_send_ipi_sun4u(int, ipifunc_t, uint64_t, uint64_t); static void sparc64_send_ipi_sun4v(int, ipifunc_t, uint64_t, uint64_t); +void (*sparc64_send_ipi)(int, ipifunc_t, uint64_t, uint64_t) = NULL; /* * These are the "function" entry points in locore.s/mp_subr.s to handle IPI's. @@ -83,6 +84,9 @@ void sparc64_ipi_blast_dcache(void *, void *); void sparc64_ipi_ccall(void *, void *); +/* Function pointer for use in smp_tlb_flush() - setup in sparc64_ipi_init() */ +static ipifunc_t smp_tlb_flush_pte_func = NULL; + /* * Process cpu stop-self event. */ @@ -171,6 +175,21 @@ CPUSET_CLEAR(cpus_spinning); CPUSET_CLEAR(cpus_paused); CPUSET_CLEAR(cpus_resumed); + + /* Prepare function pointer for use in smp_tlb_flush() */ + if (CPU_ISSUN4V) + smp_tlb_flush_pte_func = sparc64_ipi_flush_pte_sun4v; + else if (CPU_IS_USIII_UP()) + smp_tlb_flush_pte_func = sparc64_ipi_flush_pte_usiii; + else + smp_tlb_flush_pte_func = sparc64_ipi_flush_pte_us; + + /* Prepare function pointer for use by sparc64_send_ipi() */ + if (CPU_ISSUN4V) + sparc64_send_ipi = sparc64_send_ipi_sun4v; + else + sparc64_send_ipi = sparc64_send_ipi_sun4u; + } /* @@ -206,19 +225,6 @@ } /* - * Send an interprocessor interrupt. - */ -void -sparc64_send_ipi(int upaid, ipifunc_t func, uint64_t arg1, uint64_t arg2) -{ - if (CPU_ISSUN4V) - sparc64_send_ipi_sun4v(upaid, func, arg1, arg2); - else - sparc64_send_ipi_sun4u(upaid, func, arg1, arg2); - -} - -/* * Send an interprocessor interrupt - sun4v. */ void @@ -438,14 +444,6 @@ struct cpu_info *ci; int ctx; bool kpm = (pm == pmap_kernel()); - ipifunc_t func; - if (CPU_ISSUN4V) - func = sparc64_ipi_flush_pte_sun4v; - else if (CPU_IS_USIII_UP()) - func = sparc64_ipi_flush_pte_usiii; - else - func = sparc64_ipi_flush_pte_us; - /* Flush our own TLB */ ctx = pm->pm_ctx[cpu_number()]; KASSERT(ctx >= 0); @@ -465,7 +463,7 @@ KASSERT(ctx >= 0); if (!kpm && ctx == 0) continue; - sparc64_send_ipi(ci->ci_cpuid, func, va, ctx); + sparc64_send_ipi(ci->ci_cpuid, smp_tlb_flush_pte_func, va, ctx); } } }