Annotation of lucent/sys/src/boot/pc/clock.c, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: #include       "io.h"
                      7: #include       "ureg.h"
                      8: 
                      9: /*
                     10:  *  8253 timer
                     11:  */
                     12: enum
                     13: {
                     14:        T0cntr= 0x40,           /* counter ports */
                     15:        T1cntr= 0x41,           /* ... */
                     16:        T2cntr= 0x42,           /* ... */
                     17:        Tmode=  0x43,           /* mode port */
                     18: 
                     19:        /* commands */
                     20:        Latch0= 0x00,           /* latch counter 0's value */
                     21:        Load0=  0x30,           /* load counter 0 with 2 bytes */
                     22: 
                     23:        /* modes */
                     24:        Square= 0x36,           /* perioic square wave */
                     25: 
                     26:        Freq=   1193182,        /* Real clock frequency */
                     27: };
                     28: 
                     29: static int cpufreq = 66000000;
                     30: static int cpumhz = 66;
                     31: static int cputype = 486;
                     32: static int loopconst = 100;
                     33: 
                     34: /*
                     35:  *  delay for l milliseconds more or less.  delayloop is set by
                     36:  *  clockinit() to match the actual CPU speed.
                     37:  */
                     38: void
                     39: delay(int l)
                     40: {
                     41:        aamloop(l*loopconst);
                     42: }
                     43: 
                     44: static void
                     45: clock(Ureg*, void*)
                     46: {
                     47:        m->ticks++;
                     48:        checkalarms();
                     49: }
                     50: 
                     51: void
                     52: clockinit(void)
                     53: {
                     54:        ulong x, y;     /* change in counter */
                     55:        ulong cycles, loops;
                     56: 
                     57:        switch(cputype = x86()){
                     58:        case 386:
                     59:                loops = 10000;
                     60:                cycles = 32;
                     61:                break;
                     62:        case 486:
                     63:                loops = 10000;
                     64:                cycles = 22;
                     65:                break;
                     66:        default:
                     67:                loops = 30000;
                     68:                cycles = 23;
                     69:                break;
                     70:        }
                     71: 
                     72:        /*
                     73:         *  set vector for clock interrupts
                     74:         */
                     75:        setvec(Clockvec, clock, 0);
                     76: 
                     77:        /*
                     78:         *  set clock for 1/HZ seconds
                     79:         */
                     80:        outb(Tmode, Load0|Square);
                     81:        outb(T0cntr, (Freq/HZ));        /* low byte */
                     82:        outb(T0cntr, (Freq/HZ)>>8);     /* high byte */
                     83: 
                     84: 
                     85:        /*
                     86:         *  measure time for the loop
                     87:         *
                     88:         *                      MOVL    loops,CX
                     89:         *      aaml1:          AAM
                     90:         *                      LOOP    aaml1
                     91:         *
                     92:         *  the time for the loop should be independent from external
                     93:         *  cache's and memory system since it fits in the execution
                     94:         *  prefetch buffer.
                     95:         *
                     96:         */
                     97:        outb(Tmode, Latch0);
                     98:        x = inb(T0cntr);
                     99:        x |= inb(T0cntr)<<8;
                    100:        aamloop(loops);
                    101:        outb(Tmode, Latch0);
                    102:        y = inb(T0cntr);
                    103:        y |= inb(T0cntr)<<8;
                    104:        x -= y;
                    105: 
                    106:        /*
                    107:         *  counter  goes at twice the frequency, once per transition,
                    108:         *  i.e., twice per square wave
                    109:         */
                    110:        x >>= 1;
                    111: 
                    112:        /*
                    113:         *  figure out clock frequency and a loop multiplier for delay().
                    114:         */
                    115:        cpufreq = loops*((cycles*Freq)/x);
                    116:        loopconst = (cpufreq/1000)/cycles;      /* AAM+LOOP's for 1 ms */
                    117: 
                    118:        /*
                    119:         *  add in possible .1% error and convert to MHz
                    120:         */
                    121:        cpumhz = (cpufreq + cpufreq/1000)/1000000;
                    122: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.