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