vmx(1): use cycles() instead of nsec() when possible
this provides better timing and reduced number of syscalls (~2.7M old vs ~35K new in a test)
This commit is contained in:
parent
de27182a8e
commit
853f0e33fe
6 changed files with 15 additions and 13 deletions
|
@ -52,3 +52,4 @@ uintptr vmemwrite(void *, uintptr, uintptr);
|
||||||
int x86access(int, uintptr, int, uvlong*, int, int, TLB *);
|
int x86access(int, uintptr, int, uvlong*, int, int, TLB *);
|
||||||
u32int io(int, u16int, u32int, int);
|
u32int io(int, u16int, u32int, int);
|
||||||
int x86step(void);
|
int x86step(void);
|
||||||
|
uvlong nanosec(void);
|
||||||
|
|
|
@ -31,7 +31,7 @@ rtcadvance(void)
|
||||||
vlong t;
|
vlong t;
|
||||||
|
|
||||||
if(rtcnext != -1){
|
if(rtcnext != -1){
|
||||||
t = nsec();
|
t = nanosec();
|
||||||
if(t >= rtcnext){
|
if(t >= rtcnext){
|
||||||
cmos[0xc] |= 0x40;
|
cmos[0xc] |= 0x40;
|
||||||
rtcnext = -1;
|
rtcnext = -1;
|
||||||
|
@ -58,7 +58,7 @@ rtcset(void)
|
||||||
default: d = 4 + (cmos[0xa] & 0xf);
|
default: d = 4 + (cmos[0xa] & 0xf);
|
||||||
}
|
}
|
||||||
b = (1000000000ULL << d) / 1048576;
|
b = (1000000000ULL << d) / 1048576;
|
||||||
t = nsec();
|
t = nanosec();
|
||||||
rtcnext = t + b - t % b;
|
rtcnext = t + b - t % b;
|
||||||
settimer(rtcnext);
|
settimer(rtcnext);
|
||||||
}
|
}
|
||||||
|
@ -464,7 +464,7 @@ pitadvance(void)
|
||||||
|
|
||||||
for(i = 0; i < 3; i++){
|
for(i = 0; i < 3; i++){
|
||||||
p = &pit[i];
|
p = &pit[i];
|
||||||
nt = nsec();
|
nt = nanosec();
|
||||||
t = nt - p->lastnsec;
|
t = nt - p->lastnsec;
|
||||||
p->lastnsec = nt;
|
p->lastnsec = nt;
|
||||||
switch(p->mode){
|
switch(p->mode){
|
||||||
|
@ -533,7 +533,7 @@ pitsetreload(int n, int hi, u8int v)
|
||||||
if(p->access != 3 || hi){
|
if(p->access != 3 || hi){
|
||||||
p->count = p->reload;
|
p->count = p->reload;
|
||||||
p->state = 1;
|
p->state = 1;
|
||||||
p->lastnsec = nsec();
|
p->lastnsec = nanosec();
|
||||||
settimer(p->lastnsec + p->count * PERIOD);
|
settimer(p->lastnsec + p->count * PERIOD);
|
||||||
}else
|
}else
|
||||||
p->state = 0;
|
p->state = 0;
|
||||||
|
@ -543,7 +543,7 @@ pitsetreload(int n, int hi, u8int v)
|
||||||
if(p->state == 0 && (p->access != 3 || hi)){
|
if(p->state == 0 && (p->access != 3 || hi)){
|
||||||
p->count = p->reload;
|
p->count = p->reload;
|
||||||
p->state = 1;
|
p->state = 1;
|
||||||
p->lastnsec = nsec();
|
p->lastnsec = nanosec();
|
||||||
pitadvance();
|
pitadvance();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -621,7 +621,7 @@ pitio(int isin, u16int port, u32int val, int sz, void *)
|
||||||
pit[n].reload = 0;
|
pit[n].reload = 0;
|
||||||
pit[n].readstate = pit[n].access == 1 ? READHI : READLO;
|
pit[n].readstate = pit[n].access == 1 ? READHI : READLO;
|
||||||
pit[n].writestate = pit[n].access == 1 ? READHI : READLO;
|
pit[n].writestate = pit[n].access == 1 ? READHI : READLO;
|
||||||
pit[n].lastnsec = nsec();
|
pit[n].lastnsec = nanosec();
|
||||||
switch(pit[n].mode){
|
switch(pit[n].mode){
|
||||||
case 0:
|
case 0:
|
||||||
pitout(n, 0);
|
pitout(n, 0);
|
||||||
|
|
|
@ -15,6 +15,7 @@ OFILES=\
|
||||||
vesa.$O \
|
vesa.$O \
|
||||||
9p.$O \
|
9p.$O \
|
||||||
x86.$O \
|
x86.$O \
|
||||||
|
nanosec.$O \
|
||||||
|
|
||||||
</sys/src/cmd/mkone
|
</sys/src/cmd/mkone
|
||||||
|
|
||||||
|
|
|
@ -358,7 +358,7 @@ keyproc(void *)
|
||||||
n = read(fd, buf, sizeof(buf)-1);
|
n = read(fd, buf, sizeof(buf)-1);
|
||||||
if(n <= 0)
|
if(n <= 0)
|
||||||
sysfatal("read /dev/kbd: %r");
|
sysfatal("read /dev/kbd: %r");
|
||||||
kbwatchdog = nsec();
|
kbwatchdog = nanosec();
|
||||||
buf[n-1] = 0;
|
buf[n-1] = 0;
|
||||||
buf[n] = 0;
|
buf[n] = 0;
|
||||||
}
|
}
|
||||||
|
@ -431,7 +431,7 @@ mousethread(void *)
|
||||||
clicked = m.buttons & 1;
|
clicked = m.buttons & 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(kbwatchdog != 0 && nsec() - kbwatchdog > 1000ULL*1000*1000)
|
if(kbwatchdog != 0 && nanosec() - kbwatchdog > 1000ULL*1000*1000)
|
||||||
mousegrab = 0;
|
mousegrab = 0;
|
||||||
gotm = 1;
|
gotm = 1;
|
||||||
if(!ptinrect(m.xy, grabout)){
|
if(!ptinrect(m.xy, grabout)){
|
||||||
|
@ -503,7 +503,7 @@ drawtext(void)
|
||||||
p += 160;
|
p += 160;
|
||||||
}
|
}
|
||||||
cp = (vga.crtc[14] << 8 | vga.crtc[15]);
|
cp = (vga.crtc[14] << 8 | vga.crtc[15]);
|
||||||
if(cp >= sa && cp < sa + 80*25 && (vga.crtc[10] & 0x20) == 0 && nsec() / 500000000 % 2 == 0){
|
if(cp >= sa && cp < sa + 80*25 && (vga.crtc[10] & 0x20) == 0 && nanosec() / 500000000 % 2 == 0){
|
||||||
buf[0] = cp437[tfb[cp*2]];
|
buf[0] = cp437[tfb[cp*2]];
|
||||||
attr = tfb[cp*2+1];
|
attr = tfb[cp*2+1];
|
||||||
r.min = Pt((cp - sa) % 80 * 8, (cp - sa) / 80 * 16);
|
r.min = Pt((cp - sa) % 80 * 8, (cp - sa) / 80 * 16);
|
||||||
|
|
|
@ -518,7 +518,7 @@ vionetwproc(void *vp)
|
||||||
if((v->net.flags & VNETHEADER) != 0){
|
if((v->net.flags & VNETHEADER) != 0){
|
||||||
txbuf[0] = len >> 8;
|
txbuf[0] = len >> 8;
|
||||||
txbuf[1] = len;
|
txbuf[1] = len;
|
||||||
ns = nsec();
|
ns = nanosec();
|
||||||
txbuf[2] = ns >> 56;
|
txbuf[2] = ns >> 56;
|
||||||
txbuf[3] = ns >> 48;
|
txbuf[3] = ns >> 48;
|
||||||
txbuf[4] = ns >> 40;
|
txbuf[4] = ns >> 40;
|
||||||
|
|
|
@ -430,20 +430,20 @@ sleeperproc(void *)
|
||||||
vlong then, now;
|
vlong then, now;
|
||||||
|
|
||||||
timerid = threadid();
|
timerid = threadid();
|
||||||
timerevent = nsec() + SleeperPoll;
|
timerevent = nanosec() + SleeperPoll;
|
||||||
unlock(&timerlock);
|
unlock(&timerlock);
|
||||||
threadsetname("sleeper");
|
threadsetname("sleeper");
|
||||||
for(;;){
|
for(;;){
|
||||||
lock(&timerlock);
|
lock(&timerlock);
|
||||||
then = timerevent;
|
then = timerevent;
|
||||||
now = nsec();
|
now = nanosec();
|
||||||
if(then <= now) timerevent = now + SleeperPoll;
|
if(then <= now) timerevent = now + SleeperPoll;
|
||||||
unlock(&timerlock);
|
unlock(&timerlock);
|
||||||
if(then - now >= MinSleep){
|
if(then - now >= MinSleep){
|
||||||
sleep((then - now) / MSEC);
|
sleep((then - now) / MSEC);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
while(nsec() < then)
|
while(nanosec() < then)
|
||||||
;
|
;
|
||||||
sendul(sleepch, 0);
|
sendul(sleepch, 0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue