Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
424 | giacomo | 1 | /* defines for inline arch setup functions */ |
2 | |||
3 | #include <asm/fixmap.h> |
||
4 | #include "cobalt.h" |
||
5 | |||
6 | static inline void do_timer_interrupt_hook(struct pt_regs *regs) |
||
7 | { |
||
8 | /* Clear the interrupt */ |
||
9 | co_cpu_write(CO_CPU_STAT,co_cpu_read(CO_CPU_STAT) & ~CO_STAT_TIMEINTR); |
||
10 | |||
11 | do_timer(regs); |
||
12 | /* |
||
13 | * In the SMP case we use the local APIC timer interrupt to do the |
||
14 | * profiling, except when we simulate SMP mode on a uniprocessor |
||
15 | * system, in that case we have to call the local interrupt handler. |
||
16 | */ |
||
17 | #ifndef CONFIG_X86_LOCAL_APIC |
||
18 | x86_do_profile(regs); |
||
19 | #else |
||
20 | if (!using_apic_timer) |
||
21 | smp_local_timer_interrupt(regs); |
||
22 | #endif |
||
23 | } |
||
24 | |||
25 | static inline int do_timer_overflow(int count) |
||
26 | { |
||
27 | int i; |
||
28 | |||
29 | spin_lock(&i8259A_lock); |
||
30 | /* |
||
31 | * This is tricky when I/O APICs are used; |
||
32 | * see do_timer_interrupt(). |
||
33 | */ |
||
34 | i = inb(0x20); |
||
35 | spin_unlock(&i8259A_lock); |
||
36 | |||
37 | /* assumption about timer being IRQ0 */ |
||
38 | if (i & 0x01) { |
||
39 | /* |
||
40 | * We cannot detect lost timer interrupts ... |
||
41 | * well, that's why we call them lost, don't we? :) |
||
42 | * [hmm, on the Pentium and Alpha we can ... sort of] |
||
43 | */ |
||
44 | count -= LATCH; |
||
45 | } else { |
||
46 | printk("do_slow_gettimeoffset(): hardware timer problem?\n"); |
||
47 | } |
||
48 | return count; |
||
49 | } |