From 6b4b62d8458322cf02775059cf746a08a0581dd1 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 7 Oct 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-10-07 --- gnot/clock.c | 1 + gnot/fns.h | 1 - gnot/lib.h | 4 +++- pc/fns.h | 1 - port/devkprof.c | 6 +++--- port/proc.c | 1 - power/fns.h | 1 - ss/fns.h | 1 - ss/mmu.c | 44 +++++++++++++++++++++++++------------------- 9 files changed, 32 insertions(+), 28 deletions(-) diff --git a/gnot/clock.c b/gnot/clock.c index 95d1b2260f5d99b7fe92de510e5f28b061f6b9e0..bdd5e0b857c418f6e63530debc8947a814f0a055 100644 --- a/gnot/clock.c +++ b/gnot/clock.c @@ -35,6 +35,7 @@ clock(Ureg *ur) kbdclock(); mouseclock(); duartclock(); + kproftimer(ur->pc); if((ur->sr&SPL(7)) == 0 && p && p->state==Running){ if(anyready()){ if(p->hasspin) diff --git a/gnot/fns.h b/gnot/fns.h index 20e46a3451a0d6a3f3318e04bfff291c89aef1d6..4668969b6dd93296e702b83a35f28a74963e75c0 100644 --- a/gnot/fns.h +++ b/gnot/fns.h @@ -17,7 +17,6 @@ void fault68020(Ureg*, FFrame*); #define flushapage(x) void flushcpucache(void); #define flushpage(x) if(x) -#define flushvirt() int fpcr(int); void fpregrestore(char*); void fpregsave(char*); diff --git a/gnot/lib.h b/gnot/lib.h index a0a615a37d63ff35c2cd70adf1ffcc9bf47a3f01..a283f1889479305b34d69c2969b6324bf625a624 100644 --- a/gnot/lib.h +++ b/gnot/lib.h @@ -22,6 +22,7 @@ extern char *strncat(char*, char*, long); extern char *strncpy(char*, char*, long); extern int strncmp(char*, char*, long); extern long strlen(char*); +extern int atoi(char*); /* * print routines @@ -53,8 +54,9 @@ extern int print(char*, ...); */ extern long strtol(char*, char**, int); extern ulong strtoul(char*, char**, int); +extern long etext; +extern long edata; extern long end; - /* * Syscall data structures */ diff --git a/pc/fns.h b/pc/fns.h index fccbd9a03394394a7de94caefd4a477da8b8f2ec..0bb3cb767d5b3c49b625f5257409efb6bd004006 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -13,7 +13,6 @@ void fault386(Ureg*); void faultinit(void); void fclock(Ureg*); void fclockinit(void); -#define flushvirt(); void fpinit(void); void fpoff(void); void fprestore(FPsave*); diff --git a/port/devkprof.c b/port/devkprof.c index bf9cf4257abf49fcc226e532a8cbe91b17b8ca27..42691113705a8808bb40782654b737882c368ee1 100644 --- a/port/devkprof.c +++ b/port/devkprof.c @@ -160,11 +160,11 @@ kproftimer(ulong pc) if(pc>=(ulong)spllo && pc<=(ulong)spldone) pc = m->splpc; - kprof.buf[0]++; + kprof.buf[0] += TK2MS(1); if(kprof.minpc<=pc && pc>= LRES; - kprof.buf[pc]++; + kprof.buf[pc] += TK2MS(1); } else - kprof.buf[1]++; + kprof.buf[1] += TK2MS(1); } diff --git a/port/proc.c b/port/proc.c index 7474e30190cb5781a9798eb6092495b9f10a7e4e..2948abd63b9e996c69a779eef5e49311a69612d4 100644 --- a/port/proc.c +++ b/port/proc.c @@ -560,7 +560,6 @@ pexit(char *exitstr, int freemem) if(!freemem) addbroken(c); - flushvirt(); es = &c->seg[NSEG]; for(s = c->seg; s < es; s++) if(os = *s) { diff --git a/power/fns.h b/power/fns.h index babdeba88325b22475a0fd7f8e24de138355680a..254bf37e47eeb8731e280fc2173e7212ba0d4617 100644 --- a/power/fns.h +++ b/power/fns.h @@ -22,7 +22,6 @@ void faultmips(Ureg*, int, int); ulong fcr31(void); void flushmmu(void); #define flushpage(s) icflush((void*)(s), BY2PG) -#define flushvirt() void gettlb(int, ulong*); ulong gettlbvirt(int); void gotopc(ulong); diff --git a/ss/fns.h b/ss/fns.h index d19e6b395a987726ff9a7b9379f1b2612ed47673..0254943940da3c032cceb56cffc91f18426dcd2c 100644 --- a/ss/fns.h +++ b/ss/fns.h @@ -10,7 +10,6 @@ void faultasync(Ureg*); void faultsparc(Ureg*); void flushcpucache(void); #define flushpage(x) -#define flushvirt() flushmmu() int fpcr(int); void fpregrestore(char*); void fpregsave(char*); diff --git a/ss/mmu.c b/ss/mmu.c index 2ad76fa837f031127a35550e80cb294372faf01e..dd325eece6ca01a2bd8d0029cd1035cd11bd1d30 100644 --- a/ss/mmu.c +++ b/ss/mmu.c @@ -23,6 +23,7 @@ struct int newpid(Proc*); void purgepid(int); void flushcontext(void); +void putpmegnf(ulong, ulong); int pidtime[NTLBPID]; /* should be per m */ @@ -36,12 +37,7 @@ mapstack(Proc *p) ulong tlbphys; if(p->newtlb) { - flushcontext(); - tp = u->p->pidonmach[m->machno]; - if(tp) - pidtime[tp] = 0; - /* easiest is to forget what pid we had.... */ - memset(u->p->pidonmach, 0, sizeof u->p->pidonmach); + mmurelease(p); p->newtlb = 0; } @@ -55,16 +51,22 @@ mapstack(Proc *p) tlbphys = PPN(p->upage->pa)|PTEVALID|PTEWRITE|PTEKERNEL|PTEMAINMEM; putcontext(tp-1); /* - * shouldn't need putpmeg because nothing has been mapped at - * USERADDR in this context except this page. however, it crashes. + * Don't need to flush cache because no other page has been + * mapped at USERADDR in this context; can call putpmegnf. */ - putpmeg(USERADDR, tlbphys); + putpmegnf(USERADDR, tlbphys); u = (User*)USERADDR; } void mmurelease(Proc *p) { + int tp; + + tp = p->pidonmach[m->machno]; + if(tp) + pidtime[tp] = 0; + /* easiest is to forget what pid we had.... */ memset(p->pidonmach, 0, sizeof p->pidonmach); } @@ -80,7 +82,7 @@ newpid(Proc *p) t = ~0; i = 1+((m->ticks)&(NCONTEXT-1)); /* random guess */ - for(j=1; jtext); for(j=p->nmmuseg; j<=seg; j++){ putsegm(l, kmapalloc.lowpmeg+tp+j); for(k=0; knmmuseg = seg+1; put: @@ -266,19 +268,23 @@ putpmeg(ulong virt, ulong phys) putw4(virt, phys); } +void +putpmegnf(ulong virt, ulong phys) /* no need to flush */ +{ + virt &= VAMASK; + virt &= ~(BY2PG-1); + putw4(virt, phys); +} + +int nflushmmu; void flushmmu(void) { int tp; +nflushmmu++; splhi(); - flushcontext(); - tp = u->p->pidonmach[m->machno]; - if(tp) - pidtime[tp] = 0; - /* easiest is to forget what pid we had.... */ - memset(u->p->pidonmach, 0, sizeof u->p->pidonmach); - /* ....then get a new one by trying to map our stack */ + u->p->newtlb = 1; mapstack(u->p); spllo(); }