M gnot/clock.c => gnot/clock.c +1 -0
@@ 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)
M gnot/fns.h => gnot/fns.h +0 -1
@@ 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*);
M gnot/lib.h => gnot/lib.h +3 -1
@@ 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
*/
M pc/fns.h => pc/fns.h +0 -1
@@ 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*);
M port/devkprof.c => port/devkprof.c +3 -3
@@ 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<kprof.maxpc){
pc -= kprof.minpc;
pc >>= LRES;
- kprof.buf[pc]++;
+ kprof.buf[pc] += TK2MS(1);
} else
- kprof.buf[1]++;
+ kprof.buf[1] += TK2MS(1);
}
M port/proc.c => port/proc.c +0 -1
@@ 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) {
M power/fns.h => power/fns.h +0 -1
@@ 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);
M ss/fns.h => ss/fns.h +0 -1
@@ 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*);
M ss/mmu.c => ss/mmu.c +25 -19
@@ 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; j<NTLBPID; j++)
+ for(j=1; t && j<NTLBPID; j++)
if(pidtime[j] < t){
i = j;
t = pidtime[j];
@@ 105,7 107,7 @@ newpid(Proc *p)
putsegm(UZERO+j*BY2SEGM, INVALIDPMEG);
putsegm(TSTKTOP-BY2SEGM, kmapalloc.lowpmeg+NKLUDGE*i+(NKLUDGE-1));
for(j=0; j<PG2SEGM; j++)
- putpmeg((TSTKTOP-BY2SEGM)+j*BY2PG, INVALIDPTE);
+ putpmegnf((TSTKTOP-BY2SEGM)+j*BY2PG, INVALIDPTE);
return i+1;
}
@@ 242,7 244,7 @@ print("putmmu %lux %d %s\n", tlbvirt, seg, p->text);
for(j=p->nmmuseg; j<=seg; j++){
putsegm(l, kmapalloc.lowpmeg+tp+j);
for(k=0; k<PG2SEGM; k++,l+=BY2PG)
- putpmeg(l, INVALIDPTE);
+ putpmegnf(l, INVALIDPTE);
}
p->nmmuseg = seg+1;
put:
@@ 267,18 269,22 @@ putpmeg(ulong virt, ulong 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();
}