do_timer.h 2.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/* defines for inline arch setup functions */

#include <asm/apic.h>
4
#include <asm/i8259.h>
L
Linus Torvalds 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18

/**
 * do_timer_interrupt_hook - hook into timer tick
 * @regs:	standard registers from interrupt
 *
 * Description:
 *	This hook is called immediately after the timer interrupt is ack'd.
 *	It's primary purpose is to allow architectures that don't possess
 *	individual per CPU clocks (like the CPU APICs supply) to broadcast the
 *	timer interrupt as a means of triggering reschedules etc.
 **/

static inline void do_timer_interrupt_hook(struct pt_regs *regs)
{
19
	do_timer(1);
L
Linus Torvalds 已提交
20
#ifndef CONFIG_SMP
21
	update_process_times(user_mode_vm(regs));
L
Linus Torvalds 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
#endif
/*
 * In the SMP case we use the local APIC timer interrupt to do the
 * profiling, except when we simulate SMP mode on a uniprocessor
 * system, in that case we have to call the local interrupt handler.
 */
#ifndef CONFIG_X86_LOCAL_APIC
	profile_tick(CPU_PROFILING, regs);
#else
	if (!using_apic_timer)
		smp_local_timer_interrupt(regs);
#endif
}


/* you can safely undefine this if you don't have the Neptune chipset */

#define BUGGY_NEPTUN_TIMER

/**
 * do_timer_overflow - process a detected timer overflow condition
 * @count:	hardware timer interrupt count on overflow
 *
 * Description:
 *	This call is invoked when the jiffies count has not incremented but
 *	the hardware timer interrupt has.  It means that a timer tick interrupt
 *	came along while the previous one was pending, thus a tick was missed
 **/
static inline int do_timer_overflow(int count)
{
	int i;

	spin_lock(&i8259A_lock);
	/*
	 * This is tricky when I/O APICs are used;
	 * see do_timer_interrupt().
	 */
	i = inb(0x20);
	spin_unlock(&i8259A_lock);
	
	/* assumption about timer being IRQ0 */
	if (i & 0x01) {
		/*
		 * We cannot detect lost timer interrupts ... 
		 * well, that's why we call them lost, don't we? :)
		 * [hmm, on the Pentium and Alpha we can ... sort of]
		 */
		count -= LATCH;
	} else {
#ifdef BUGGY_NEPTUN_TIMER
		/*
		 * for the Neptun bug we know that the 'latch'
		 * command doesn't latch the high and low value
		 * of the counter atomically. Thus we have to 
		 * substract 256 from the counter 
		 * ... funny, isnt it? :)
		 */
		
		count -= 256;
#else
		printk("do_slow_gettimeoffset(): hardware timer problem?\n");
#endif
	}
	return count;
}