diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2007-10-20 16:54:53 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2007-10-20 16:54:53 +0000 |
commit | db5ced60a56bb8d09d7b16c18b6d92f591d323c6 (patch) | |
tree | 59208925d4b1f316fbc3fdf3bf729a7912bd9b50 /sys/arch/sparc64 | |
parent | 3e9b193c879d559ed7edac7a3ad268cda0156d1a (diff) |
Make sure to send an ipi to the processor a given proc runs on in signotify(),
in the MULTIPROCESOR case.
ok kettenis@
Diffstat (limited to 'sys/arch/sparc64')
-rw-r--r-- | sys/arch/sparc64/include/cpu.h | 4 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/ipifuncs.c | 14 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/locore.s | 6 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/machdep.c | 6 |
4 files changed, 24 insertions, 6 deletions
diff --git a/sys/arch/sparc64/include/cpu.h b/sys/arch/sparc64/include/cpu.h index dc2f6f8c736..c66081c983b 100644 --- a/sys/arch/sparc64/include/cpu.h +++ b/sys/arch/sparc64/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.49 2007/10/18 20:44:47 kettenis Exp $ */ +/* $OpenBSD: cpu.h,v 1.50 2007/10/20 16:54:49 miod Exp $ */ /* $NetBSD: cpu.h,v 1.28 2001/06/14 22:56:58 thorpej Exp $ */ /* @@ -155,6 +155,8 @@ void cpu_boot_secondary_processors(void); void sparc64_send_ipi(int, void (*)(void), u_int64_t, u_int64_t); void sparc64_broadcast_ipi(void (*)(void), u_int64_t, u_int64_t); +void smp_signotify(struct proc *); + #else #define cpu_number() 0 diff --git a/sys/arch/sparc64/sparc64/ipifuncs.c b/sys/arch/sparc64/sparc64/ipifuncs.c index 501569b2e33..2dec458c16d 100644 --- a/sys/arch/sparc64/sparc64/ipifuncs.c +++ b/sys/arch/sparc64/sparc64/ipifuncs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ipifuncs.c,v 1.3 2007/10/18 20:44:47 kettenis Exp $ */ +/* $OpenBSD: ipifuncs.c,v 1.4 2007/10/20 16:54:52 miod Exp $ */ /* $NetBSD: ipifuncs.c,v 1.8 2006/10/07 18:11:36 rjs Exp $ */ /*- @@ -36,7 +36,7 @@ #include <sys/param.h> #include <sys/systm.h> -#include <sys/malloc.h> +#include <sys/proc.h> #include <machine/cpu.h> #include <machine/ctlreg.h> @@ -54,6 +54,7 @@ extern int db_active; */ void ipi_tlb_page_demap(void); void ipi_tlb_context_demap(void); +void ipi_softint(void); /* * Send an interprocessor interrupt. @@ -142,3 +143,12 @@ smp_tlb_flush_ctx(int ctx) sparc64_broadcast_ipi(ipi_tlb_context_demap, ctx, 0); } + +void +smp_signotify(struct proc *p) +{ + if (db_active) + return; + + sparc64_send_ipi(p->p_cpu->ci_upaid, ipi_softint, 1 << IPL_NONE, 0UL); +} diff --git a/sys/arch/sparc64/sparc64/locore.s b/sys/arch/sparc64/sparc64/locore.s index 5d335ec8a12..ac677c22686 100644 --- a/sys/arch/sparc64/sparc64/locore.s +++ b/sys/arch/sparc64/sparc64/locore.s @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.s,v 1.92 2007/10/20 16:41:46 miod Exp $ */ +/* $OpenBSD: locore.s,v 1.93 2007/10/20 16:54:52 miod Exp $ */ /* $NetBSD: locore.s,v 1.137 2001/08/13 06:10:10 jdolecek Exp $ */ /* @@ -3381,6 +3381,10 @@ ENTRY(ipi_drop_fpstate) sethi %hi(FPPROC), %g1 ba ret_from_intr_vector stx %g0, [%g1 + %lo(FPPROC)] ! fpproc = NULL + +ENTRY(ipi_softint) + ba ret_from_intr_vector + wr %g3, 0, SET_SOFTINT #endif /* diff --git a/sys/arch/sparc64/sparc64/machdep.c b/sys/arch/sparc64/sparc64/machdep.c index 4e4474e0e81..0e168761167 100644 --- a/sys/arch/sparc64/sparc64/machdep.c +++ b/sys/arch/sparc64/sparc64/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.99 2007/10/16 20:33:27 kettenis Exp $ */ +/* $OpenBSD: machdep.c,v 1.100 2007/10/20 16:54:52 miod Exp $ */ /* $NetBSD: machdep.c,v 1.108 2001/07/24 19:30:14 eeh Exp $ */ /*- @@ -677,7 +677,9 @@ signotify(struct proc *p) { aston(p); #ifdef MULTIPROCESSOR - /* XXX Send IPI if necessary. */ + /* Send IPI if necessary. */ + if (p->p_cpu != curcpu() && p->p_cpu != NULL) + smp_signotify(p); #endif } |