Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/drivers/it.c

    rda1bafb r84afc7b  
    3434
    3535/** Interval Timer driver. */
    36 
     36 
    3737#include <arch/drivers/it.h>
    3838#include <arch/interrupt.h>
     
    4545#include <arch.h>
    4646
    47 #define IT_SERVICE_CLOCKS  64
     47#define IT_SERVICE_CLOCKS       64
    4848
    49 #define FREQ_NUMERATOR_SHIFT  32
    50 #define FREQ_NUMERATOR_MASK   0xffffffff00000000ULL
     49#define FREQ_NUMERATOR_SHIFT    32
     50#define FREQ_NUMERATOR_MASK     0xffffffff00000000ULL
    5151
    52 #define FREQ_DENOMINATOR_SHIFT  0
    53 #define FREQ_DENOMINATOR_MASK   0xffffffffULL
     52#define FREQ_DENOMINATOR_SHIFT  0
     53#define FREQ_DENOMINATOR_MASK   0xffffffffULL
    5454
    5555uint64_t it_delta;
     
    6363void it_init(void)
    6464{
     65        cr_itv_t itv;
     66       
    6567        if (config.cpu_active == 1) {
    6668                irq_initialize(&it_irq);
     
    8183        }
    8284       
    83         /* Initialize Interval Timer external interrupt vector */
    84         cr_itv_t itv;
    85        
     85        /* initialize Interval Timer external interrupt vector */
    8686        itv.value = itv_read();
    8787        itv.vector = INTERRUPT_TIMER;
    8888        itv.m = 0;
    8989        itv_write(itv.value);
    90        
    91         /* Set Interval Timer Counter to zero */
     90
     91        /* set Interval Timer Counter to zero */
    9292        itc_write(0);
    9393       
    94         /* Generate first Interval Timer interrupt in IT_DELTA ticks */
     94        /* generate first Interval Timer interrupt in IT_DELTA ticks */
    9595        itm_write(IT_DELTA);
    96        
    97         /* Propagate changes */
     96
     97        /* propagate changes */
    9898        srlz_d();
    9999}
     
    104104 *
    105105 * @return Always IRQ_ACCEPT.
    106  *
    107106 */
    108107irq_ownership_t it_claim(irq_t *irq)
     
    114113void it_interrupt(irq_t *irq)
    115114{
     115        int64_t c;
     116        int64_t m;
     117       
    116118        eoi_write(EOI);
    117119       
    118         int64_t itm = itm_read();
     120        m = itm_read();
    119121       
    120         while (true) {
    121                 int64_t itc = itc_read();
    122                 itc += IT_SERVICE_CLOCKS;
    123                
    124                 itm += IT_DELTA;
    125                 if (itm - itc < 0)
     122        while (1) {
     123                c = itc_read();
     124                c += IT_SERVICE_CLOCKS;
     125
     126                m += IT_DELTA;
     127                if (m - c < 0)
    126128                        CPU->missed_clock_ticks++;
    127129                else
     
    129131        }
    130132       
    131         itm_write(itm);
    132         srlz_d();  /* Propagate changes */
    133        
     133        itm_write(m);
     134        srlz_d();                               /* propagate changes */
     135
    134136        /*
    135137         * We are holding a lock which prevents preemption.
    136138         * Release the lock, call clock() and reacquire the lock again.
    137139         */
    138         irq_spinlock_unlock(&irq->lock, false);
     140        spinlock_unlock(&irq->lock);   
    139141        clock();
    140         irq_spinlock_lock(&irq->lock, false);
     142        spinlock_lock(&irq->lock);
    141143}
    142144
Note: See TracChangeset for help on using the changeset viewer.