diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-02-18 08:36:16 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-03-04 13:36:10 +0100 |
commit | 90d8567d34a6d80da04b1cb37b667a3173f584c4 (patch) | |
tree | 221e66b9da1dd9dd79d01e507f0026bfb477b810 /c/src/lib/libbsp/i386 | |
parent | score: Add _SMP_Before_multitasking_action() (diff) | |
download | rtems-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.c | 15 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/shared/smp/smp-imps.c | 11 |
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) |