M gnot/devport.c => gnot/devport.c +13 -0
@@ 8,13 8,18 @@
#include "devtab.h"
+#define ROMADDR 0x40000000
+#define ROMSIZE ((256*1024)/8)
+
enum {
Qdir,
Qdata,
+ Qrom
};
Dirtab portdir[]={
"data", {Qdata}, 0, 0666,
+ "rom", {Qrom}, ROMSIZE, 0444,
};
#define NPORT (sizeof portdir/sizeof(Dirtab))
@@ 132,6 137,14 @@ portread(Chan *c, char *a, long n, ulong offset)
}
P_qunlock(s);
break;
+ case Qrom:
+ if(offset >= ROMSIZE)
+ return 0;
+ if(offset+n > ROMSIZE)
+ n = ROMSIZE - offset;
+ memmove(a, ((char*)ROMADDR)+offset, n);
+ return n;
+ break;
default:
panic("portread");
}
M port/devroot.c => port/devroot.c +6 -2
@@ 45,12 45,14 @@ int nroot;
int
rootgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp)
{
- if(tab==0 || i>=ntab)
+ if(i >= nroot)
return -1;
+
if(i < NROOT)
- tab += i;
+ tab = &rootdir[i];
else
tab = rootmap[i - NROOT];
+
devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp);
return 1;
}
@@ 92,6 94,8 @@ rootwalk(Chan *c, char *name)
c->qid.path = Qdir|CHDIR;
return 1;
}
+ if((c->qid.path & ~CHDIR) != Qdir)
+ error(Enonexist);
return devwalk(c, name, rootdir, nroot, rootgen);
}
M port/segment.c => port/segment.c +4 -2
@@ 274,7 274,9 @@ imagereclaim(void)
for(;;) {
lock(&palloc);
for(p = palloc.head; p; p = p->next)
- if(p->image && p->ref == 0 && p->image != &swapimage)
+ if(p->image)
+ if(p->ref == 0)
+ if(p->image != &swapimage)
break;
unlock(&palloc);
@@ 282,7 284,7 @@ imagereclaim(void)
break;
lockpage(p);
- if(p->ref == 0 && p->image != &swapimage)
+ if(p->ref == 0)
uncachepage(p);
unlockpage(p);
}