summaryrefslogtreecommitdiffstats
path: root/sys/pc98/cbus
diff options
context:
space:
mode:
authornyan <nyan@FreeBSD.org>2009-05-03 02:37:13 +0000
committernyan <nyan@FreeBSD.org>2009-05-03 02:37:13 +0000
commit4c45d5b45c3f38ec82e2180fd7baaa39cce3fb8e (patch)
treecc184b27545f0057375ba4796d89d426dbbbb996 /sys/pc98/cbus
parentc2533a5a87888e415e5a218e11fec455c1d47b25 (diff)
downloadFreeBSD-src-4c45d5b45c3f38ec82e2180fd7baaa39cce3fb8e.zip
FreeBSD-src-4c45d5b45c3f38ec82e2180fd7baaa39cce3fb8e.tar.gz
MFi386: revision 191745
Add support for using i8254 and rtc timers as event sources for i386 SMP system. Redistribute hard-/stat-/profclock events to other CPUs using IPI.
Diffstat (limited to 'sys/pc98/cbus')
-rw-r--r--sys/pc98/cbus/clock.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/sys/pc98/cbus/clock.c b/sys/pc98/cbus/clock.c
index 6e1242f..ad613e4 100644
--- a/sys/pc98/cbus/clock.c
+++ b/sys/pc98/cbus/clock.c
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
#include <sys/timetc.h>
#include <sys/kernel.h>
#include <sys/module.h>
+#include <sys/smp.h>
#include <sys/sysctl.h>
#include <machine/clock.h>
@@ -71,6 +72,7 @@ __FBSDID("$FreeBSD$");
#endif
#include <machine/ppireg.h>
#include <machine/timerreg.h>
+#include <machine/smp.h>
#include <pc98/pc98/pc98_machdep.h>
#ifdef DEV_ISA
@@ -123,6 +125,31 @@ static struct timecounter i8254_timecounter = {
0 /* quality */
};
+int
+hardclockintr(struct trapframe *frame)
+{
+
+ if (PCPU_GET(cpuid) == 0)
+ hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame));
+ else
+ hardclock_cpu(TRAPF_USERMODE(frame));
+ return (FILTER_HANDLED);
+}
+
+int
+statclockintr(struct trapframe *frame)
+{
+
+ return (FILTER_HANDLED);
+}
+
+int
+profclockintr(struct trapframe *frame)
+{
+
+ return (FILTER_HANDLED);
+}
+
static int
clkintr(struct trapframe *frame)
{
@@ -151,7 +178,14 @@ clkintr(struct trapframe *frame)
(*lapic_cyclic_clock_func[cpu])(frame);
#endif
- hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame));
+#ifdef SMP
+ if (smp_started)
+ ipi_all_but_self(IPI_HARDCLOCK);
+#endif
+ if (PCPU_GET(cpuid) == 0)
+ hardclock(TRAPF_USERMODE(frame), TRAPF_PC(frame));
+ else
+ hardclock_cpu(TRAPF_USERMODE(frame));
return (FILTER_HANDLED);
}
OpenPOWER on IntegriCloud