M mtx/fns.h => mtx/fns.h +0 -1
@@ 18,7 18,6 @@ void evenaddr(ulong);
void faultpower(Ureg*, ulong addr, int read);
void firmware(void);
void fpinit(void);
-void fpoff(Proc*);
void fprestore(FPsave*);
void fpsave(FPsave*);
void fptrap(Ureg*);
M mtx/l.s => mtx/l.s +1 -1
@@ 416,7 416,7 @@ TEXT trapvec(SB), $-4
ktrap:
MOVW R1, CR
MOVW SPR(SAVER1), R1
- RLWNM $0, R1, $~KZERO, R1 /* PADDR(m->proc->kstack) */
+ RLWNM $0, R1, $~KZERO, R1 /* PADDR(R1) */
SUB $UREGSPACE, R1
BL saveureg(SB)
BL trap(SB)
M mtx/main.c => mtx/main.c +2 -4
@@ 55,9 55,8 @@ machinit(void)
*/
m->loopconst = 100000;
- /* turn on caches (instruction only for now) */
-// puthid0(gethid0() | BIT(16));
-puthid0(gethid0() | BIT(16) | BIT(17)); /* and data */
+ /* turn on caches */
+ puthid0(gethid0() | BIT(16) | BIT(17));
active.machs = 1;
active.exiting = 0;
@@ 262,7 261,6 @@ procsave(Proc *p)
if(p->fpstate == FPactive){
if(p->state != Moribund)
fpsave(&up->fpsave);
-// fpoff(p);
p->fpstate = FPinactive;
}
}
M mtx/mmu.c => mtx/mmu.c +17 -6
@@ 20,6 20,8 @@ static struct {
ulong size; /* number of bytes in page table */
ulong mask; /* hash mask */
int slotgen; /* next pte (byte offset) when pteg is full */
+
+ int pidlock;
int pidgen; /* next mmu pid to use */
} ptab;
@@ 75,6 77,12 @@ mmuswitch(Proc *p)
{
int i, mp;
+ if(p->kp) {
+ for(i = 0; i < 8; i++)
+ putsr(i<<28, 0);
+ return;
+ }
+
if(p->newtlb) {
p->mmupid = 0;
p->newtlb = 0;
@@ 113,13 121,13 @@ putmmu(ulong va, ulong pa, Page *pg)
p = (ulong*)pteg;
ep = (ulong*)(pteg+BY2PTEG);
q = nil;
- lock(&ptab);
+ ilock(&ptab);
tlbflush(va);
while(p < ep) {
x = p[0];
if(x == ptehi) {
q = p;
-if(q[1] == pa) panic("putmmu already set pte");
+if(q[1] == pa) print("putmmu already set pte\n");
break;
}
if(q == nil && (x & BIT(0)) == 0)
@@ 133,7 141,7 @@ if(q[1] == pa) panic("putmmu already set pte");
q[0] = ptehi;
q[1] = pa;
sync();
- unlock(&ptab);
+ iunlock(&ptab);
ctl = &pg->cachectl[m->machno];
switch(*ctl) {
@@ 156,11 164,14 @@ newmmupid(void)
{
int pid;
- lock(&ptab);
+ /* can't use lock() here as we're called from within sched() */
+ while(!tas(&ptab.pidlock))
+ ;
pid = ptab.pidgen++;
- unlock(&ptab);
if(pid > PIDMAX)
- panic("newmmupid");
+ pid = PIDBASE;
+ ptab.pidlock = 0;
+ coherence();
up->mmupid = pid;
return pid;
}
M mtx/trap.c => mtx/trap.c +17 -20
@@ 313,12 313,10 @@ faultpower(Ureg *ureg, ulong addr, int read)
user = (ureg->srr1 & MSR_PR) != 0;
insyscall = up->insyscall;
up->insyscall = 1;
- spllo();
n = fault(addr, read);
if(n < 0){
if(!user){
dumpregs(ureg);
-// _dumpstack(ureg);
panic("fault: 0x%lux", addr);
}
sprint(buf, "sys: trap: fault %s addr=0x%lux", read? "read" : "write", addr);
@@ 427,16 425,6 @@ fpexcname(Ureg *ur, ulong fpscr, char *buf)
return buf;
}
-void
-fpoff(Proc *p)
-{
- Ureg *ur;
-
- ur = p->dbgreg;
- if(ur != nil)
- ur->srr1 &= ~MSR_FP;
-}
-
/*
* Fill in enough of Ureg to get a stack trace, and call a function.
* Used by debugging interface rdb.
@@ 462,19 450,30 @@ callwithureg(void (*fn)(Ureg*))
static void
_dumpstack(Ureg *ureg)
{
- ulong l, v;
+ ulong l, sl, el, v;
int i;
- if(up == 0)
+ l = (ulong)&l;
+ if(up == 0){
+ el = (ulong)m+BY2PG;
+ sl = el-KSTACK;
+ }
+ else{
+ sl = (ulong)up->kstack;
+ el = sl + KSTACK;
+ }
+ if(l > el || l < sl){
+ el = (ulong)m+BY2PG;
+ sl = el-KSTACK;
+ }
+ if(l > el || l < sl)
return;
-
print("ktrace /kernel/path %.8lux %.8lux %.8lux\n", ureg->pc, ureg->sp, ureg->lr);
i = 0;
- for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK); l+=4){
+ for(; l < el; l += 4){
v = *(ulong*)l;
if(KTZERO < v && v < (ulong)etext){
print("%.8lux=%.8lux ", l, v);
-//delay(1);
if(i++ == 4){
print("\n");
i = 0;
@@ 494,9 493,9 @@ dumpregs(Ureg *ur)
{
int i;
ulong *l;
+
if(up) {
print("registers for %s %ld\n", up->text, up->pid);
-print("ur %lux\n", ur);
if(ur->srr1 & MSR_PR == 0)
if(ur->usp < (ulong)up->kstack || ur->usp > (ulong)up->kstack+KSTACK)
print("invalid stack ptr\n");
@@ 741,7 740,6 @@ notify(Ureg* ur)
qunlock(&up->debug);
pexit(n->msg, n->flag!=NDebug);
}
-print("notify: old usp %lux\n", ur->usp);
sp = ur->usp & ~(BY2V-1);
sp -= sizeof(Ureg);
@@ 768,7 766,6 @@ print("notify: old usp %lux\n", ur->usp);
up->nnote--;
memmove(&up->lastnote, &up->note[0], sizeof(Note));
memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note));
-print("notify: usp %lux\n", ur->usp);
qunlock(&up->debug);
splx(s);
M pc/ether8139.c => pc/ether8139.c +1 -1
@@ 169,7 169,7 @@ enum { /* Tsd0 */
};
enum {
- Rblen = Rblen64K, /* Receive BUffer Length */
+ Rblen = Rblen64K, /* Receive Buffer Length */
Ntd = 4, /* Number of Transmit Descriptors */
Tdbsz = ROUNDUP(sizeof(Etherpkt), 4),
};
M port/sysproc.c => port/sysproc.c +2 -0
@@ 640,6 640,8 @@ generrstr(char *buf, uint nbuf)
{
char tmp[ERRMAX];
+ if(nbuf == 0)
+ error(Ebadarg);
validaddr((ulong)buf, nbuf, 1);
if(nbuf > sizeof tmp)
nbuf = sizeof tmp;