Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/interrupt/interrupt.c

    r11909ce3 r8df5f20  
    5858#include <trace.h>
    5959
    60 /*
    61  * If IVT_ITEMS is zero (e.g. for special/abs32le) we hide completely any
    62  * access to the exception table array and panic if the function is called
    63  * at all. It also silences (correct) compiler warnings about possible
    64  * out-of-bound array access.
    65  */
    66 
    6760exc_table_t exc_table[IVT_ITEMS];
    6861IRQ_SPINLOCK_INITIALIZE(exctbl_lock);
     
    8477#if (IVT_ITEMS > 0)
    8578        assert(n < IVT_ITEMS);
     79#endif
    8680
    8781        irq_spinlock_lock(&exctbl_lock, true);
     
    9791
    9892        return old;
    99 #else
    100         panic("No space for any exception handler, cannot register.");
    101 #endif
    10293}
    10394
     
    112103#if (IVT_ITEMS > 0)
    113104        assert(n < IVT_ITEMS);
     105#endif
    114106
    115107        /* Account user cycles */
    116         if (THREAD)
     108        if (THREAD) {
     109                irq_spinlock_lock(&THREAD->lock, false);
    117110                thread_update_accounting(true);
     111                irq_spinlock_unlock(&THREAD->lock, false);
     112        }
    118113
    119114        /* Account CPU usage if it woke up from sleep */
    120         if (CPU && CPU_LOCAL->idle) {
     115        if (CPU && CPU->idle) {
     116                irq_spinlock_lock(&CPU->lock, false);
    121117                uint64_t now = get_cycle();
    122                 atomic_time_increment(&CPU->idle_cycles, now - CPU_LOCAL->last_cycle);
    123                 CPU_LOCAL->last_cycle = now;
    124                 CPU_LOCAL->idle = false;
     118                CPU->idle_cycles += now - CPU->last_cycle;
     119                CPU->last_cycle = now;
     120                CPU->idle = false;
     121                irq_spinlock_unlock(&CPU->lock, false);
    125122        }
    126123
     
    152149
    153150        /* Do not charge THREAD for exception cycles */
    154         if (THREAD)
     151        if (THREAD) {
     152                irq_spinlock_lock(&THREAD->lock, false);
    155153                THREAD->last_cycle = end_cycle;
    156 #else
    157         panic("No space for any exception handler, yet we want to handle some exception.");
    158 #endif
     154                irq_spinlock_unlock(&THREAD->lock, false);
     155        }
    159156}
    160157
Note: See TracChangeset for help on using the changeset viewer.