summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/apic_vector.s
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>1999-07-20 06:52:35 +0000
committermsmith <msmith@FreeBSD.org>1999-07-20 06:52:35 +0000
commit84c939ef118a545b74e42d1ab9013ea9ba8b1b3f (patch)
treef285b114a76c38187b7d9910bdede9788d00ae9e /sys/i386/isa/apic_vector.s
parent905bcc118433dc6747bf9091a2bae04370334c34 (diff)
downloadFreeBSD-src-84c939ef118a545b74e42d1ab9013ea9ba8b1b3f.zip
FreeBSD-src-84c939ef118a545b74e42d1ab9013ea9ba8b1b3f.tar.gz
Implement an all-CPU shootdown-style rendezvous facility. This allows
the caller to specify a function to be guarded between an entry and exit barrier, as well as pre- and post-barrier functions. The primary use for this function is synchronised update of per-cpu private data. The implementation is almost (but not quite) MI; with a better mechanism for masking per-CPU interrupts it could probably be hoisted. Reviewed by: peter (partially)
Diffstat (limited to 'sys/i386/isa/apic_vector.s')
-rw-r--r--sys/i386/isa/apic_vector.s25
1 files changed, 24 insertions, 1 deletions
diff --git a/sys/i386/isa/apic_vector.s b/sys/i386/isa/apic_vector.s
index b99b93a..13b116b 100644
--- a/sys/i386/isa/apic_vector.s
+++ b/sys/i386/isa/apic_vector.s
@@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
- * $Id: apic_vector.s,v 1.41 1999/07/03 06:33:47 alc Exp $
+ * $Id: apic_vector.s,v 1.42 1999/07/10 15:27:59 bde Exp $
*/
@@ -952,6 +952,29 @@ MCOUNT_LABEL(bintr)
INTR(23,intr23,)
MCOUNT_LABEL(eintr)
+/*
+ * Executed by a CPU when it receives a RENDEZVOUS IPI from another CPU.
+ *
+ * - Calls the generic rendezvous action function.
+ */
+ .text
+ SUPERALIGN_TEXT
+ .globl _Xrendezvous
+_Xrendezvous:
+ PUSH_FRAME
+ movl $KDSEL, %eax
+ movl %ax, %ds /* use KERNEL data segment */
+ movl %ax, %es
+ movl $KPSEL, %eax
+ movl %ax, %fs
+
+ call smp_rendezvous_action
+
+ movl $0, lapic_eoi /* End Of Interrupt to APIC */
+ POP_FRAME
+ iret
+
+
.data
/*
* Addresses of interrupt handlers.
OpenPOWER on IntegriCloud