Rev 2071 | Rev 2131 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2071 | Rev 2107 | ||
---|---|---|---|
Line 66... | Line 66... | ||
66 | return IRQ_ACCEPT; |
66 | return IRQ_ACCEPT; |
67 | } |
67 | } |
68 | 68 | ||
69 | static void i8254_irq_handler(irq_t *irq, void *arg, ...) |
69 | static void i8254_irq_handler(irq_t *irq, void *arg, ...) |
70 | { |
70 | { |
- | 71 | /* |
|
- | 72 | * This IRQ is responsible for kernel preemption. |
|
- | 73 | * Nevertheless, we are now holding a spinlock which prevents |
|
- | 74 | * preemption. For this particular IRQ, we don't need the |
|
- | 75 | * lock. We just release it, call clock() and then reacquire it again. |
|
- | 76 | */ |
|
- | 77 | spinlock_unlock(&irq->lock); |
|
71 | clock(); |
78 | clock(); |
- | 79 | spinlock_lock(&irq->lock); |
|
72 | } |
80 | } |
73 | 81 | ||
74 | void i8254_init(void) |
82 | void i8254_init(void) |
75 | { |
83 | { |
76 | irq_initialize(&i8254_irq); |
84 | irq_initialize(&i8254_irq); |
Line 134... | Line 142... | ||
134 | 142 | ||
135 | outb(CLK_PORT4, 0xd2); |
143 | outb(CLK_PORT4, 0xd2); |
136 | o2 = inb(CLK_PORT1); |
144 | o2 = inb(CLK_PORT1); |
137 | o2 |= inb(CLK_PORT1) << 8; |
145 | o2 |= inb(CLK_PORT1) << 8; |
138 | 146 | ||
- | 147 | CPU->delay_loop_const = |
|
- | 148 | ((MAGIC_NUMBER * LOOPS) / 1000) / ((t1 - t2) - (o1 - o2)) + |
|
139 | CPU->delay_loop_const = ((MAGIC_NUMBER*LOOPS)/1000) / ((t1-t2)-(o1-o2)) + (((MAGIC_NUMBER*LOOPS)/1000) % ((t1-t2)-(o1-o2)) ? 1 : 0); |
149 | (((MAGIC_NUMBER * LOOPS) / 1000) % ((t1 - t2) - (o1 - o2)) ? 1 : 0); |
140 | 150 | ||
141 | clk1 = get_cycle(); |
151 | clk1 = get_cycle(); |
142 | delay(1 << SHIFT); |
152 | delay(1 << SHIFT); |
143 | clk2 = get_cycle(); |
153 | clk2 = get_cycle(); |
144 | 154 |