| plan 9 kernel history: overview | file list | diff list |
1991/0730/pc/clock.c (diff list | history)
| 1991/0704/sys/src/9/pc/clock.c:4,11 – 1991/0705/sys/src/9/pc/clock.c:4,22 (short | long) | ||
| 1991/0704 | #include "dat.h" #include "fns.h" #include "io.h" | |
| 1991/0705 | /* * 8253 timer */ enum { Timerctl= 0x43, /* control port */ Timercnt= 0x40, /* timer count port (outb count-1) */ Timericnt= 0x41, /* timer count input port */ Timerlatch= 0x40, /* latch count into Timericnt */ }; | |
| 1991/0704 | void clockinit(void) { | |
| 1991/0704/sys/src/9/pc/clock.c:12,14 – 1991/0705/sys/src/9/pc/clock.c:23,33 | ||
| 1991/0704 | setvec(Clockvec, clock, SEGIG); } | |
| 1991/0705 | void clock(void *arg) { m->ticks++; if((m->ticks%185)==0) print("%d secs\n", TK2SEC(m->ticks)); INT0ENABLE; } | |
| 1991/0705/sys/src/9/pc/clock.c:4,9 – 1991/0706/sys/src/9/pc/clock.c:4,10 (short | long) | ||
| 1991/0704 | #include "dat.h" #include "fns.h" #include "io.h" | |
| 1991/0706 | #include "ureg.h" | |
| 1991/0704 | ||
| 1991/0705 | /* * 8253 timer | |
| 1991/0705/sys/src/9/pc/clock.c:24,33 – 1991/0706/sys/src/9/pc/clock.c:25,44 | ||
| 1991/0704 | } | |
| 1991/0705 | void | |
| 1991/0706 | clock(Ureg *ur) | |
| 1991/0705 | { | |
| 1991/0706 | Proc *p; | |
| 1991/0705 | m->ticks++; | |
| 1991/0706 | p = m->proc; if(p){ p->pc = ur->eip; if (p->state==Running) p->time[p->insyscall]++; } if((m->ticks%185) == 92) floppystart(); else if((m->ticks%185) == 0) floppystop(); | |
| 1991/0705 | } | |
| 1991/0706/sys/src/9/pc/clock.c:11,27 – 1991/0709/sys/src/9/pc/clock.c:11,42 (short | long) | ||
| 1991/0705 | */ enum { | |
| 1991/0709 | T0cntr= 0x40, /* counter ports */ T1cntr= 0x41, /* ... */ T2cntr= 0x42, /* ... */ Tmode= 0x43, /* mode port */ | |
| 1991/0705 |
| |
| 1991/0709 | Load0square= 0x36, /* load counter 0 with 2 bytes, * output a square wave whose * period is the counter period */ Freq= 1193182, /* Real clock frequency */ | |
| 1991/0705 | }; | |
| 1991/0704 | void clockinit(void) { | |
| 1991/0709 | /* * set vector for clock interrupts */ | |
| 1991/0704 | setvec(Clockvec, clock, SEGIG); | |
| 1991/0709 | /* * make clock output a square wave with a 1/HZ period */ outb(Tmode, Load0square); outb(T0cntr, (Freq/HZ)); /* low byte */ outb(T0cntr, (Freq/HZ)>>8); /* high byte */ | |
| 1991/0704 | } | |
| 1991/0705 | void | |
| 1991/0706/sys/src/9/pc/clock.c:28,33 – 1991/0709/sys/src/9/pc/clock.c:43,49 | ||
| 1991/0706 | clock(Ureg *ur) | |
| 1991/0705 | { | |
| 1991/0706 | Proc *p; | |
| 1991/0709 | static int last; | |
| 1991/0706 | ||
| 1991/0705 | m->ticks++; | |
| 1991/0706 | p = m->proc; | |
| 1991/0706/sys/src/9/pc/clock.c:36,44 – 1991/0709/sys/src/9/pc/clock.c:52,55 | ||
| 1991/0706 | if (p->state==Running) p->time[p->insyscall]++; } | |
| 1991/0705 | } | |
| 1991/0709/sys/src/9/pc/clock.c:43,54 – 1991/0711/sys/src/9/pc/clock.c:43,56 (short | long) | ||
| 1991/0706 | clock(Ureg *ur) | |
| 1991/0705 | { | |
| 1991/0706 | Proc *p; | |
| 1991/0709 |
| |
| 1991/0706 | ||
| 1991/0705 | m->ticks++; | |
| 1991/0711 | checkalarms(); | |
| 1991/0706 | p = m->proc; if(p){ | |
| 1991/0711 | p->pc = ur->pc; | |
| 1991/0706 | if (p->state==Running) p->time[p->insyscall]++; } | |
| 1991/0711/sys/src/9/pc/clock.c:29,35 – 1991/0716/sys/src/9/pc/clock.c:29,35 (short | long) | ||
| 1991/0709 | /* * set vector for clock interrupts */ | |
| 1991/0704 |
| |
| 1991/0716 | setvec(Clockvec, clock); | |
| 1991/0709 | /* * make clock output a square wave with a 1/HZ period | |
| 1991/0716/sys/src/9/pc/clock.c:23,28 – 1991/0719/sys/src/9/pc/clock.c:23,42 (short | long) | ||
| 1991/0709 | Freq= 1193182, /* Real clock frequency */ | |
| 1991/0705 | }; | |
| 1991/0719 | /* * delay for l milliseconds */ void delay(int l) { int i; while(--l){ for(i=0; i < 404; i++) ; } } | |
| 1991/0704 | void clockinit(void) { | |
| 1991/0719/sys/src/9/pc/clock.c:61,66 – 1991/0730/sys/src/9/pc/clock.c:61,67 (short | long) | ||
| 1991/0705 | m->ticks++; | |
| 1991/0711 | checkalarms(); | |
| 1991/0730 | mouseclock(); | |
| 1991/0711 | ||
| 1991/0706 | p = m->proc; if(p){ | |
| 1991/0719/sys/src/9/pc/clock.c:68,71 – 1991/0730/sys/src/9/pc/clock.c:69,82 | ||
| 1991/0706 | if (p->state==Running) p->time[p->insyscall]++; } | |
| 1991/0730 | /* if(u && (ur->flags&IFLAG) && p && p->state==Running){ if(anyready()){ if(p->hasspin) p->hasspin = 0; else sched(); } } /**/ | |
| 1991/0705 | } | |
| 1991/0730/sys/src/9/pc/clock.c:69,76 – 1991/0801/sys/src/9/pc/clock.c:69,76 (short | long) | ||
| 1991/0706 | if (p->state==Running) p->time[p->insyscall]++; } | |
| 1991/0730 |
| |
| 1991/0801 | /* if(u && p && p->state==Running){ | |
| 1991/0730 | if(anyready()){ if(p->hasspin) p->hasspin = 0; | |
| 1991/0730/sys/src/9/pc/clock.c:77,82 – 1991/0801/sys/src/9/pc/clock.c:77,81 | ||
| 1991/0730 | else sched(); } | |
| 1991/0801 | }/**/ | |
| 1991/0705 | } | |
| 1991/0801/sys/src/9/pc/clock.c:70,76 – 1991/0802/sys/src/9/pc/clock.c:70,76 (short | long) | ||
| 1991/0706 | p->time[p->insyscall]++; } | |
| 1991/0801 |
| |
| 1991/0802 | if(u && p && p->state==Running){ | |
| 1991/0730 | if(anyready()){ if(p->hasspin) p->hasspin = 0; | |
| 1991/0801/sys/src/9/pc/clock.c:77,81 – 1991/0802/sys/src/9/pc/clock.c:77,85 | ||
| 1991/0730 | else sched(); } | |
| 1991/0801 |
| |
| 1991/0802 | if((ur->cs&0xffff) == UESEL){ /* if was in user mode */ if(u->nnote) notify(ur); } } | |
| 1991/0705 | } | |
| 1991/0802/sys/src/9/pc/clock.c:62,67 – 1991/0806/sys/src/9/pc/clock.c:62,68 (short | long) | ||
| 1991/0711 | checkalarms(); | |
| 1991/0730 | mouseclock(); | |
| 1991/0806 | uartintr0(ur); | |
| 1991/0711 | ||
| 1991/0706 | p = m->proc; if(p){ | |
| 1991/0806/sys/src/9/pc/clock.c:60,68 – 1991/0807/sys/src/9/pc/clock.c:60,72 (short | long) | ||
| 1991/0706 | ||
| 1991/0705 | m->ticks++; | |
| 1991/0711 | ||
| 1991/0807 | uartintr0(ur); if(m->ticks % 50) return; | |
| 1991/0711 | checkalarms(); | |
| 1991/0730 | mouseclock(); | |
| 1991/0806 |
| |
| 1991/0711 | ||
| 1991/0706 | p = m->proc; if(p){ | |
| 1991/0807/sys/src/9/pc/clock.c:21,26 – 1991/0808/sys/src/9/pc/clock.c:21,27 (short | long) | ||
| 1991/0709 | * period is the counter period */ Freq= 1193182, /* Real clock frequency */ | |
| 1991/0808 | FHZ= 1000, /* hertz for fast clock */ | |
| 1991/0705 | }; | |
| 1991/0719 | /* | |
| 1991/0807/sys/src/9/pc/clock.c:60,73 – 1991/0808/sys/src/9/pc/clock.c:61,72 | ||
| 1991/0706 | ||
| 1991/0705 | m->ticks++; | |
| 1991/0711 | ||
| 1991/0807 |
| |
| 1991/0711 | checkalarms(); | |
| 1991/0730 | mouseclock(); | |
| 1991/0711 | ||
| 1991/0808 | /* * process time accounting */ | |
| 1991/0706 | p = m->proc; if(p){ | |
| 1991/0711 | p->pc = ur->pc; | |
| 1991/0807/sys/src/9/pc/clock.c:76,81 – 1991/0808/sys/src/9/pc/clock.c:75,83 | ||
| 1991/0706 | } | |
| 1991/0801 | ||
| 1991/0802 | if(u && p && p->state==Running){ | |
| 1991/0808 | /* * preemption */ | |
| 1991/0730 | if(anyready()){ if(p->hasspin) p->hasspin = 0; | |
| 1991/0807/sys/src/9/pc/clock.c:82,90 – 1991/0808/sys/src/9/pc/clock.c:84,130 | ||
| 1991/0730 | else sched(); } | |
| 1991/0802 |
| |
| 1991/0808 | /* * notes for processes that might be spinning * in user mode. */ if((ur->cs&0xffff) == UESEL){ | |
| 1991/0802 | if(u->nnote) notify(ur); } } | |
| 1991/0808 | } /* * a faster (1 MS) clock tick for a non-interrupting serial port or * kernel profiling. m->ticks still increments as usual. */ void fclock(Ureg *ur) { static ulong ticks; uartintr0(ur); /* poll the serial port */ if((ticks++ % (FHZ/HZ)) == 0) clock(ur); } void fclockinit(void) { int x; /* * set vector for clock interrupts */ setvec(Clockvec, fclock); /* * make clock output a square wave with a 1/FHZ period */ x = splhi(); outb(Tmode, Load0square); outb(T0cntr, (Freq/FHZ)); /* low byte */ outb(T0cntr, (Freq/FHZ)>>8); /* high byte */ splx(x); | |
| 1991/0705 | } | |
| 1991/0808/sys/src/9/pc/clock.c:94,130 – 1991/0822/sys/src/9/pc/clock.c:94,96 (short | long) | ||
| 1991/0802 | } } | |
| 1991/0808 | } | |
| 1991/0705 |
| |
| 1991/0822/sys/src/9/pc/clock.c:62,68 – 1991/0823/sys/src/9/pc/clock.c:62,67 (short | long) | ||
| 1991/0705 | m->ticks++; | |
| 1991/0711 | checkalarms(); | |
| 1991/0730 |
| |
| 1991/0711 | ||
| 1991/0808 | /* * process time accounting | |
| 1991/0823/sys/src/9/pc/clock.c:87,95 – 1991/1112/sys/src/9/pc/clock.c:87,93 (short | long) | ||
| 1991/0808 | * notes for processes that might be spinning * in user mode. */ | |
| 1991/0802 |
| |
| 1991/1112 | if((ur->cs&0xffff) == UESEL) notify(ur); | |
| 1991/0802 | } | |
| 1991/0808 | } | |
| 1991/1112/sys/src/9/pc/clock.c:21,27 – 1991/1113/sys/src/9/pc/clock.c:21,26 (short | long) | ||
| 1991/0709 | * period is the counter period */ Freq= 1193182, /* Real clock frequency */ | |
| 1991/0808 |
| |
| 1991/0705 | }; | |
| 1991/0719 | /* | |
| 1991/1112/sys/src/9/pc/clock.c:58,67 – 1991/1113/sys/src/9/pc/clock.c:57,68 | ||
| 1991/0706 | clock(Ureg *ur) | |
| 1991/0705 | { | |
| 1991/0706 | Proc *p; | |
| 1991/1113 | int nrun = 0; | |
| 1991/0706 | ||
| 1991/0705 | m->ticks++; | |
| 1991/0711 | checkalarms(); | |
| 1991/1113 | uartclock(); | |
| 1991/0711 | ||
| 1991/0808 | /* * process time accounting | |
| 1991/1112/sys/src/9/pc/clock.c:68,77 – 1991/1113/sys/src/9/pc/clock.c:69,81 | ||
| 1991/0808 | */ | |
| 1991/0706 | p = m->proc; if(p){ | |
| 1991/1113 | nrun = 1; | |
| 1991/0711 | p->pc = ur->pc; | |
| 1991/0706 | if (p->state==Running) p->time[p->insyscall]++; } | |
| 1991/1113 | nrun = (nrdy+nrun)*1000; MACHP(0)->load = (MACHP(0)->load*19+nrun)/20; | |
| 1991/0801 | ||
| 1991/0802 | if(u && p && p->state==Running){ | |
| 1991/0808 | /* | |
| 1991/1113/sys/src/9/pc/clock.c:87,97 – 1991/1115/sys/src/9/pc/clock.c:87,96 (short | long) | ||
| 1991/0730 | else sched(); } | |
| 1991/0808 |
| |
| 1991/1112 |
| |
| 1991/1115 | if((ur->cs&0xffff) == UESEL){ spllo(); /* in case we fault */ (*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1); /* profiling clock */ splhi(); } | |
| 1991/0802 | } | |
| 1991/0808 | } | |
| 1991/1115/sys/src/9/pc/clock.c:87,96 – 1991/1116/sys/src/9/pc/clock.c:87,98 (short | long) | ||
| 1991/0730 | else sched(); } | |
| 1991/1116 | #ifdef asdf | |
| 1991/1115 | if((ur->cs&0xffff) == UESEL){ spllo(); /* in case we fault */ (*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1); /* profiling clock */ splhi(); } | |
| 1991/1116 | #endif asdf | |
| 1991/0802 | } | |
| 1991/0808 | } | |
| 1991/1116/sys/src/9/pc/clock.c:1,5 – 1992/0321/sys/src/9/pc/clock.c:1,5 (short | long) | ||
| 1991/0704 | #include "u.h" | |
| 1992/0321 | #include "../port/lib.h" | |
| 1991/0704 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0321/sys/src/9/pc/clock.c:87,98 – 1992/0820/sys/src/9/pc/clock.c:87,96 (short | long) | ||
|
Uncomment profiling clock.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1991/0730 | else sched(); } | |
| 1991/1116 |
| |
| 1991/1115 | if((ur->cs&0xffff) == UESEL){ spllo(); /* in case we fault */ (*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1); /* profiling clock */ splhi(); } | |
| 1991/1116 |
| |
| 1991/0802 | } | |
| 1991/0808 | } | |
| 1992/0820/sys/src/9/pc/clock.c:20,25 – 1992/0922/sys/src/9/pc/clock.c:20,26 (short | long) | ||
|
Measure cpu speed to make delay system-independent.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1991/0709 | * output a square wave whose * period is the counter period */ | |
| 1992/0922 | Latch0= 0x06, | |
| 1991/0709 | Freq= 1193182, /* Real clock frequency */ | |
| 1991/0705 | }; | |
| 1992/0820/sys/src/9/pc/clock.c:40,45 – 1992/0922/sys/src/9/pc/clock.c:41,48 | ||
| 1991/0704 | void clockinit(void) { | |
| 1992/0922 | ulong dc; /* change in counter */ | |
| 1991/0709 | /* * set vector for clock interrupts */ | |
| 1992/0820/sys/src/9/pc/clock.c:51,56 – 1992/0922/sys/src/9/pc/clock.c:54,68 | ||
| 1991/0709 | outb(Tmode, Load0square); outb(T0cntr, (Freq/HZ)); /* low byte */ outb(T0cntr, (Freq/HZ)>>8); /* high byte */ | |
| 1992/0922 | /* * measure cpu speed to make delay() system * independent */ delay(100); outb(Tmode, Latch0); dc = inb(T0cntr); dc |= inb(T0cntr)<<8; | |
| 1991/0704 | } | |
| 1991/0705 | void | |
| 1992/0922/sys/src/9/pc/clock.c:16,47 – 1992/0923/sys/src/9/pc/clock.c:16,51 (short | long) | ||
|
rename constants; commenting; rewrite delay to use delayloop, set during clockinit.
BUG fix? handle negative delays properly.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1991/0709 | T2cntr= 0x42, /* ... */ Tmode= 0x43, /* mode port */ | |
| 1991/0705 | ||
| 1991/0709 |
| |
| 1992/0922 |
| |
| 1991/0709 |
| |
| 1992/0923 | /* commands */ Latch0= 0x00, /* latch counter 0's value */ Load0= 0x30, /* load counter 0 with 2 bytes */ /* modes */ Square= 0x36, /* perioic square wave */ Freq= 1193182, /* Real clock frequency */ | |
| 1991/0705 | }; | |
| 1992/0923 | static ulong delayloop = 1000; | |
| 1991/0719 | /* | |
| 1992/0923 | * delay for l milliseconds more or less. delayloop is set by * clockinit() to match the actual CPU speed. | |
| 1991/0719 | */ void delay(int l) { | |
| 1992/0923 | ulong i; | |
| 1991/0719 |
| |
| 1992/0923 | while(l-- > 0) for(i=0; i < delayloop; i++) | |
| 1991/0719 | ; | |
| 1991/0704 | void clockinit(void) { | |
| 1992/0922 |
| |
| 1992/0923 | ulong x, y; /* change in counter */ | |
| 1992/0922 | ||
| 1991/0709 | /* * set vector for clock interrupts | |
| 1992/0922/sys/src/9/pc/clock.c:51,68 – 1992/0923/sys/src/9/pc/clock.c:55,82 | ||
| 1991/0709 | /* * make clock output a square wave with a 1/HZ period */ | |
| 1992/0923 | outb(Tmode, Load0|Square); | |
| 1991/0709 | outb(T0cntr, (Freq/HZ)); /* low byte */ outb(T0cntr, (Freq/HZ)>>8); /* high byte */ | |
| 1992/0922 | /* | |
| 1992/0923 | * measure time for delay(10) with current delayloop count | |
| 1992/0922 | */ | |
| 1992/0923 | x = inb(T0cntr); x |= inb(T0cntr)<<8; delay(10); outb(Tmode, Latch0); y = inb(T0cntr); y |= inb(T0cntr)<<8; x -= y; /* * fix count, the factor of 2 is a hack */ delayloop = (delayloop*1193*10)/x; if(delayloop == 0) delayloop = 1; | |
| 1991/0704 | } | |
| 1991/0705 | void | |
| 1992/0923/sys/src/9/pc/clock.c:89,94 – 1993/0226/sys/src/9/pc/clock.c:89,95 (short | long) | ||
|
call mouseclock during clock interrupt
rsc Fri Mar 4 12:44:25 2005 | ||
| 1991/0711 | checkalarms(); | |
| 1991/1113 | uartclock(); | |
| 1993/0226 | mouseclock(); | |
| 1991/0711 | ||
| 1991/0808 | /* * process time accounting | |
| 1993/0226/sys/src/9/pc/clock.c:72,78 – 1993/0915/sys/src/9/pc/clock.c:72,78 (short | long) | ||
|
convert to Brazil.
formatting edit; recomment.
change preemption — no kernel preemption (XXX unintentional?)
rsc Fri Mar 4 12:44:25 2005 | ||
| 1992/0923 | x -= y; /* | |
| 1993/0915 | * fix count | |
| 1992/0923 | */ delayloop = (delayloop*1193*10)/x; if(delayloop == 0) | |
| 1993/0226/sys/src/9/pc/clock.c:104,123 – 1993/0915/sys/src/9/pc/clock.c:104,117 | ||
| 1991/1113 | nrun = (nrdy+nrun)*1000; MACHP(0)->load = (MACHP(0)->load*19+nrun)/20; | |
| 1991/0801 | ||
| 1991/0802 |
| |
| 1991/0808 |
| |
| 1991/0730 |
| |
| 1991/1115 |
| |
| 1991/0802 |
| |
| 1993/0915 | if(up == 0 || (ur->cs&0xffff) != UESEL || up->state != Running) return; if(anyready()) sched(); /* user profiling clock */ spllo(); /* in case we fault */ (*(ulong*)(USTKTOP-BY2WD)) += TK2MS(1); splhi(); | |
| 1991/0808 | } | |
| 1993/0915/sys/src/9/pc/clock.c:88,94 – 1993/1113/sys/src/9/pc/clock.c:88,93 (short | long) | ||
|
remove uartclock.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1991/0705 | m->ticks++; | |
| 1991/0711 | checkalarms(); | |
| 1991/1113 |
| |
| 1993/0226 | mouseclock(); | |
| 1991/0711 | ||
| 1991/0808 | /* | |
| Too many diffs (26 > 25). Stopping. | ||