summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-07-23 08:42:59 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-07-23 08:56:06 +0200
commit33314eb60acc23e4a98c9f037631b6f35513d511 (patch)
treea8c2de7e0af2e160de11390785e416ae382d2b3e /bsps/powerpc
parentscore: Improve _Thread_Start() description (diff)
downloadrtems-33314eb60acc23e4a98c9f037631b6f35513d511.tar.bz2
bsps/clock: Fix fast idle clock tick support
If we interrupt a thread dispatch critical section (thread dispatch disable level != ISR nest level), then we should not do the fast idle mode since this may delay an ongoing system call forever.
Diffstat (limited to 'bsps/powerpc')
-rw-r--r--bsps/powerpc/shared/clock/clock-ppc-dec.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/bsps/powerpc/shared/clock/clock-ppc-dec.c b/bsps/powerpc/shared/clock/clock-ppc-dec.c
index 798cf2a75b..a1f9ebd599 100644
--- a/bsps/powerpc/shared/clock/clock-ppc-dec.c
+++ b/bsps/powerpc/shared/clock/clock-ppc-dec.c
@@ -98,15 +98,21 @@ void clockOn(void* unused)
static void clockHandler(void)
{
#if (CLOCK_DRIVER_USE_FAST_IDLE == 1)
- rtems_interrupt_level level;
- uint32_t tb;
+ rtems_interrupt_level level;
+ uint32_t tb;
+ Per_CPU_Control *cpu_self;
rtems_interrupt_disable(level);
tb = ppc_time_base();
rtems_timecounter_tick();
+ cpu_self = _Per_CPU_Get();
- while ( _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle ) {
+ while (
+ cpu_self->thread_dispatch_disable_level == cpu_self->isr_nest_level
+ && cpu_self->heir == cpu_self->executing
+ && cpu_self->executing->is_idle
+ ) {
tb += Clock_Decrementer_value;
ppc_set_time_base( tb );
rtems_timecounter_tick();