Index: sys/arch/sparc64/sparc64/ipifuncs.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/ipifuncs.c,v retrieving revision 1.50 diff -u -r1.50 ipifuncs.c --- sys/arch/sparc64/sparc64/ipifuncs.c 8 Jun 2014 17:33:24 -0000 1.50 +++ sys/arch/sparc64/sparc64/ipifuncs.c 1 Nov 2014 18:22:33 -0000 @@ -85,6 +85,9 @@ #endif void sparc64_ipi_dcache_flush_page_us(void *, void *); void sparc64_ipi_dcache_flush_page_usiii(void *, void *); +#ifdef SUN4V +void sparc64_ipi_dcache_flush_page_sun4v(void *, void *); +#endif void sparc64_ipi_blast_dcache(void *, void *); void sparc64_ipi_ccall(void *, void *); @@ -491,7 +494,13 @@ { ipifunc_t func; +#ifdef SUN4V + if (CPU_ISSUN4V) + func = sparc64_ipi_dcache_flush_page_sun4v; + else if (CPU_IS_USIII_UP()) +#else if (CPU_IS_USIII_UP()) +#endif func = sparc64_ipi_dcache_flush_page_usiii; else func = sparc64_ipi_dcache_flush_page_us; Index: sys/arch/sparc64/sparc64/mp_subr.S =================================================================== RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/mp_subr.S,v retrieving revision 1.7 diff -u -r1.7 mp_subr.S --- sys/arch/sparc64/sparc64/mp_subr.S 24 Sep 2014 18:32:10 -0000 1.7 +++ sys/arch/sparc64/sparc64/mp_subr.S 1 Nov 2014 18:22:38 -0000 @@ -389,9 +389,10 @@ nop /* - * IPI handler to drop the current FPU state. + * Flush data cache page. * void sparc64_ipi_dcache_flush_page_usiii(paddr_t pa, int line_size) * void sparc64_ipi_dcache_flush_page_us(paddr_t pa, int line_size) + * void sparc64_ipi_dcache_flush_page_sun4v(paddr_t pa, int line_size) * * On entry: * %g2 = pa @@ -447,4 +448,21 @@ ba,a ret_from_intr_vector nop +#ifdef SUN4V +ENTRY(sparc64_ipi_dcache_flush_page_sun4v) + set NBPG, %o1 + call hv_mem_sync + mov %g2, %o0 + cmp %o0, 0 + be,pt %icc, 1f + nop + sir ! crash if hv-call fails +1: + sethi %hi(KERNBASE), %g5 + flush %g5 + membar #Sync + ba,a ret_from_intr_vector + nop +#endif + #endif