summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-02-18 08:36:16 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-03-04 13:36:10 +0100
commit90d8567d34a6d80da04b1cb37b667a3173f584c4 (patch)
tree221e66b9da1dd9dd79d01e507f0026bfb477b810 /c/src/lib/libbsp/i386
parentscore: Add _SMP_Before_multitasking_action() (diff)
downloadrtems-90d8567d34a6d80da04b1cb37b667a3173f584c4.tar.bz2
score: Distribute clock tick to all online CPUs
Update #2554.
Diffstat (limited to 'c/src/lib/libbsp/i386')
-rw-r--r--c/src/lib/libbsp/i386/pc386/clock/ckinit.c15
-rw-r--r--c/src/lib/libbsp/i386/shared/smp/smp-imps.c11
2 files changed, 20 insertions, 6 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/clock/ckinit.c b/c/src/lib/libbsp/i386/pc386/clock/ckinit.c
index 04514d19fa..2291839dd5 100644
--- a/c/src/lib/libbsp/i386/pc386/clock/ckinit.c
+++ b/c/src/lib/libbsp/i386/pc386/clock/ckinit.c
@@ -65,11 +65,10 @@ extern volatile uint32_t Clock_driver_ticks;
} while (0)
-/*
- * Hooks which get swapped based upon which nanoseconds since last
- * tick method is preferred.
- */
-#define Clock_driver_support_at_tick()
+#ifdef RTEMS_SMP
+#define Clock_driver_support_at_tick() \
+ _SMP_Send_message_broadcast(SMP_MESSAGE_CLOCK_TICK)
+#endif
#define Clock_driver_support_install_isr( _new, _old ) \
do { \
@@ -203,6 +202,12 @@ void Clock_driver_install_handler(void)
clockOn();
}
+#define Clock_driver_support_set_interrupt_affinity(online_processors) \
+ do { \
+ /* FIXME: Is there a way to do this on x86? */ \
+ (void) online_processors; \
+ } while (0)
+
void Clock_driver_support_initialize_hardware(void)
{
bool use_tsc = false;
diff --git a/c/src/lib/libbsp/i386/shared/smp/smp-imps.c b/c/src/lib/libbsp/i386/shared/smp/smp-imps.c
index ca1a0f134a..1ed504ccf9 100644
--- a/c/src/lib/libbsp/i386/shared/smp/smp-imps.c
+++ b/c/src/lib/libbsp/i386/shared/smp/smp-imps.c
@@ -744,13 +744,22 @@ static void smp_apic_ack(void)
IMPS_LAPIC_WRITE(LAPIC_EOI, 0 ); /* ACK the interrupt */
}
+/* FIXME: There should be a header file for this */
+void Clock_isr(void *arg);
+
static void bsp_inter_processor_interrupt(void *arg)
{
+ unsigned long message;
+
(void) arg;
smp_apic_ack();
- _SMP_Inter_processor_interrupt_handler();
+ message = _SMP_Inter_processor_interrupt_handler();
+
+ if ((message & SMP_MESSAGE_CLOCK_TICK) != 0) {
+ Clock_isr(NULL);
+ }
}
static void ipi_install_irq(void)