clock.h revision 13000
1240116Smarcel/* 2240116Smarcel * Kernel interface to machine-dependent clock driver. 3240116Smarcel * Garrett Wollman, September 1994. 4240116Smarcel * This file is in the public domain. 5240116Smarcel * 6240116Smarcel * $Id: clock.h,v 1.7 1995/12/10 13:38:07 phk Exp $ 7240116Smarcel */ 8240116Smarcel 9240116Smarcel#ifndef _MACHINE_CLOCK_H_ 10240116Smarcel#define _MACHINE_CLOCK_H_ 11240116Smarcel 12240116Smarcel#if defined(I586_CPU) || defined(I686_CPU) 13240116Smarcel 14240116Smarcel#define I586_CYCLECTR(x) \ 15240116Smarcel __asm __volatile(".byte 0x0f, 0x31" : "=A" (x)) 16240116Smarcel 17240116Smarcel/* 18240116Smarcel * When we update the clock, we also update this bias value which is 19240116Smarcel * automatically subtracted in microtime(). We assume that CPU_THISTICKLEN() 20240116Smarcel * has been called at some point in the past, so that an appropriate value is 21240116Smarcel * set up in i586_last_tick. (This works even if we are not being called 22240116Smarcel * from hardclock because hardclock will have run before and will made the 23240116Smarcel * call.) 24240116Smarcel */ 25240116Smarcel#define CPU_CLOCKUPDATE(otime, ntime) \ 26240116Smarcel do { \ 27240116Smarcel if(i586_ctr_rate) { \ 28240116Smarcel disable_intr(); \ 29240116Smarcel i586_ctr_bias = i586_last_tick; \ 30240116Smarcel *(otime) = *(ntime); \ 31240116Smarcel enable_intr(); \ 32240116Smarcel } else { \ 33240116Smarcel *(otime) = *(ntime); \ 34240116Smarcel } \ 35240116Smarcel } while(0) 36240116Smarcel 37240116Smarcel#define CPU_THISTICKLEN(dflt) cpu_thisticklen(dflt) 38#else 39#define CPU_CLOCKUPDATE(otime, ntime) \ 40 (*(otime) = *(ntime)) 41#define CPU_THISTICKLEN(dflt) dflt 42#endif 43 44#define I586_CTR_RATE_SHIFT 8 45 46#if defined(KERNEL) && !defined(LOCORE) 47#include <sys/cdefs.h> 48#include <machine/frame.h> 49 50/* 51 * i386 to clock driver interface. 52 * XXX almost all of it is misplaced. i586 stuff is done in isa/clock.c 53 * and isa stuff is done in i386/microtime.s and i386/support.s. 54 */ 55extern int adjkerntz; 56extern int disable_rtc_set; 57#if defined(I586_CPU) || defined(I686_CPU) 58extern unsigned i586_ctr_rate; /* fixed point */ 59extern long long i586_last_tick; 60extern long long i586_ctr_bias; 61#endif 62extern int timer0_max_count; 63extern u_int timer0_overflow_threshold; 64extern u_int timer0_prescaler_count; 65 66#if defined(I586_CPU) || defined(I686_CPU) 67void calibrate_cyclecounter __P((void)); 68#endif 69 70#if defined(I586_CPU) || defined(I686_CPU) 71static __inline u_long 72cpu_thisticklen(u_long dflt) 73{ 74 long long old; 75 long rv; 76 77 if (i586_ctr_rate) { 78 old = i586_last_tick; 79 I586_CYCLECTR(i586_last_tick); 80 rv = ((i586_last_tick - old) << I586_CTR_RATE_SHIFT) 81 / i586_ctr_rate; 82 } else { 83 rv = dflt; 84 } 85 return rv; 86} 87#endif 88 89/* 90 * Driver to clock driver interface. 91 */ 92void DELAY __P((int usec)); 93int acquire_timer0 __P((int rate, 94 void (*function)(struct clockframe *frame))); 95int acquire_timer2 __P((int mode)); 96int release_timer0 __P((void)); 97int release_timer2 __P((void)); 98int sysbeep __P((int pitch, int period)); 99 100#endif /* KERNEL && !LOCORE */ 101 102#endif /* !_MACHINE_CLOCK_H_ */ 103