M gnot/boot.c => gnot/boot.c +4 -4
@@ 120,9 120,9 @@ dkconfig(void)
* make it 9600 baud,
* push the async protocol onto it,
*/
- cfd = open("#c/rs232ctl", 2);
+ cfd = open("#t/tty0ctl", 2);
if(cfd < 0)
- error("opening #c/rs232ctl");
+ error("opening #t/tty0ctl");
sendmsg(cfd, "B9600");
sendmsg(cfd, "push async");
break;
@@ 133,9 133,9 @@ dkconfig(void)
* make it 19200 baud,
* push the async protocol onto it,
*/
- cfd = open("#c/rs232ctl", 2);
+ cfd = open("#t/tty0ctl", 2);
if(cfd < 0)
- error("opening #c/rs232ctl");
+ error("opening #t/tty0ctl");
sendmsg(cfd, "B19200");
sendmsg(cfd, "push async");
break;
M gnot/boot.h => gnot/boot.h +66 -66
@@ 227,17 227,17 @@ ulong bootcode[]={
0x07273b200,
0x0676a4878,
0x00002486e,
- 0x083ce6100,
+ 0x083ca6100,
0x007e22f40,
0x000084aaf,
0x00008508f,
0x06c0a486e,
- 0x083d56100,
+ 0x083d16100,
0x00568588f,
- 0x0486e83e4,
+ 0x0486e83e0,
0x02f2f0004,
0x06100052a,
- 0x0486e83ef,
+ 0x0486e83eb,
0x02f2f000c,
0x06100051e,
0x0610007a4,
@@ 253,17 253,17 @@ ulong bootcode[]={
0x00796588f,
0x060f260ec,
0x048780002,
- 0x0486e839c,
+ 0x0486e839a,
0x061000778,
0x02f400008,
0x04aaf0008,
0x06c0a486e,
- 0x083a86100,
+ 0x083a56100,
0x00500588f,
- 0x0486e83bc,
+ 0x0486e83b8,
0x02f2f000c,
0x0610004c2,
- 0x0486e83c3,
+ 0x0486e83bf,
0x02f2f0014,
0x0610004b6,
0x04fef0018,
@@ 274,13 274,13 @@ ulong bootcode[]={
0x007362f40,
0x000084aaf,
0x000086c0a,
- 0x0486e8377,
+ 0x0486e8376,
0x0610004be,
0x0588f486e,
- 0x0838b2f2f,
+ 0x083892f2f,
0x0000c6100,
0x00480486e,
- 0x083912f2f,
+ 0x0838f2f2f,
0x000146100,
0x004744fef,
0x000186000,
@@ 288,24 288,24 @@ ulong bootcode[]={
0x0fff042af,
0x000044878,
0x00002486e,
- 0x084056100,
+ 0x084016100,
0x006ee4a80,
0x042e72f40,
0x0001644df,
0x06c0a486e,
- 0x0840f6100,
+ 0x0840b6100,
0x00474588f,
0x048780002,
- 0x0486e8421,
+ 0x0486e841d,
0x0610006cc,
0x04a8042e7,
0x02f40001a,
0x044df6c0a,
- 0x0486e842a,
+ 0x0486e8426,
0x061000452,
0x0588f486e,
0x0867e486e,
- 0x0843b486e,
+ 0x08437486e,
0x0859e6100,
0x005de486e,
0x0859e6100,
@@ 317,7 317,7 @@ ulong bootcode[]={
0x0b0af002c,
0x0661e486e,
0x0867e486e,
- 0x0846e6100,
+ 0x0846a6100,
0x004e22f2f,
0x0003c6100,
0x0064e202f,
@@ 325,11 325,11 @@ ulong bootcode[]={
0x000484e75,
0x07005b0af,
0x00030660a,
- 0x0486e8446,
+ 0x0486e8442,
0x0610003f2,
0x0588f486e,
0x0867e486e,
- 0x0844e6100,
+ 0x0844a6100,
0x004b22f2f,
0x000406100,
0x0061e2f2f,
@@ 341,7 341,7 @@ ulong bootcode[]={
0x042ae801a,
0x042ae801e,
0x042a7486e,
- 0x0847f6100,
+ 0x0847b6100,
0x0061a4a80,
0x06d744878,
0x0003f486e,
@@ 373,7 373,7 @@ ulong bootcode[]={
0x060f27001,
0x02d40801a,
0x060ea42a7,
- 0x0486e848b,
+ 0x0486e8487,
0x061000598,
0x04a806d1e,
0x048780001,
@@ 384,7 384,7 @@ ulong bootcode[]={
0x000206100,
0x005564fef,
0x0001042a7,
- 0x0486e8499,
+ 0x0486e8495,
0x06100056c,
0x04a806d20,
0x048780040,
@@ 395,12 395,12 @@ ulong bootcode[]={
0x000286100,
0x0052a4fef,
0x000304e75,
- 0x0486e84a7,
+ 0x0486e84a3,
0x0486e867e,
0x0610004dc,
0x0518f60ea,
0x0598f486e,
- 0x084ab6100,
+ 0x084a76100,
0x003961d7c,
0x000328602,
0x03d7cffff,
@@ 414,7 414,7 @@ ulong bootcode[]={
0x06100051c,
0x0b0af0018,
0x0670a486e,
- 0x084b26100,
+ 0x084ae6100,
0x00290588f,
0x048780064,
0x0486e859e,
@@ 427,7 427,7 @@ ulong bootcode[]={
0x04a8142e7,
0x02f410026,
0x044df6e0e,
- 0x0486e84bc,
+ 0x0486e84b8,
0x06100025a,
0x0222f0028,
0x0588f2f01,
@@ 444,14 444,14 @@ ulong bootcode[]={
0x0102e859e,
0x049c02f00,
0x02f2f0040,
- 0x0486e84c5,
+ 0x0486e84c1,
0x0610002e4,
- 0x0486e84e8,
+ 0x0486e84e4,
0x06100020e,
0x04fef001c,
0x00c2e0033,
0x08602670a,
- 0x0486e84f3,
+ 0x0486e84ef,
0x0610001fa,
0x0588f4fef,
0x000344e75,
@@ 465,7 465,7 @@ ulong bootcode[]={
0x04fef000c,
0x06000ff62,
0x0598f486e,
- 0x084fc6100,
+ 0x084f86100,
0x002921d7c,
0x000348602,
0x03d7cffff,
@@ 479,7 479,7 @@ ulong bootcode[]={
0x061000418,
0x0b0af0018,
0x0670a486e,
- 0x085076100,
+ 0x085036100,
0x0018c588f,
0x048780064,
0x0486e859e,
@@ 488,43 488,43 @@ ulong bootcode[]={
0x02f400024,
0x04aaf0024,
0x06e0a486e,
- 0x085156100,
+ 0x085116100,
0x00168588f,
0x02f2f0024,
0x0486e8602,
0x0486e859e,
0x061000c8c,
0x04a80660a,
- 0x0486e8522,
+ 0x0486e851e,
0x06100014a,
0x0588f0c2e,
0x000378602,
0x06618486e,
0x08608486e,
- 0x085316100,
+ 0x0852d6100,
0x00202486e,
0x086086100,
0x0012c4fef,
0x0000c0c2e,
0x000358602,
0x0670a486e,
- 0x0853b6100,
+ 0x085376100,
0x00118588f,
0x04fef0034,
0x04e754fef,
0x0fff042a7,
- 0x0486e8548,
+ 0x0486e8544,
0x061000368,
0x04a806c0a,
0x0202f001c,
0x04fef0018,
0x04e75486e,
- 0x0854d6100,
+ 0x085496100,
0x001ba486f,
0x0000c6100,
0x0031a4a80,
0x06c0a486e,
- 0x085546100,
+ 0x085506100,
0x000d8588f,
0x06100032c,
0x04fef0010,
@@ 553,19 553,19 @@ ulong bootcode[]={
0x0610002b4,
0x04aae801a,
0x0671842a7,
- 0x0486e856b,
- 0x0486e8563,
- 0x0486e855e,
+ 0x0486e8567,
+ 0x0486e855f,
+ 0x0486e855a,
0x061000228,
0x04fef002c,
0x060aa42a7,
- 0x0486e857c,
- 0x0486e8574,
- 0x0486e856f,
+ 0x0486e8578,
+ 0x0486e8570,
+ 0x0486e856b,
0x061000210,
0x04fef002c,
0x06092486e,
- 0x085596134,
+ 0x085556134,
0x0588f6092,
0x0598f2f2f,
0x0000c6100,
@@ 584,7 584,7 @@ ulong bootcode[]={
0x0027c486f,
0x000042f2f,
0x0004c486e,
- 0x0857f4878,
+ 0x0857b4878,
0x000026100,
0x0011a42a7,
0x061744fef,
@@ 2980,26 2980,25 @@ ulong bootcode[]={
0x0002f3638,
0x03032302f,
0x0696e6974,
- 0x00023632f,
- 0x072733233,
- 0x03263746c,
- 0x0006f7065,
- 0x06e696e67,
- 0x02023632f,
- 0x072733233,
- 0x03263746c,
- 0x000423936,
- 0x030300070,
- 0x075736820,
- 0x06173796e,
- 0x063002363,
- 0x02f727332,
- 0x033326374,
- 0x06c006f70,
- 0x0656e696e,
- 0x067202363,
- 0x02f727332,
- 0x033326374,
+ 0x00023742f,
+ 0x074747930,
+ 0x063746c00,
+ 0x06f70656e,
+ 0x0696e6720,
+ 0x023742f74,
+ 0x074793063,
+ 0x0746c0042,
+ 0x039363030,
+ 0x000707573,
+ 0x068206173,
+ 0x0796e6300,
+ 0x023742f74,
+ 0x074793063,
+ 0x0746c006f,
+ 0x070656e69,
+ 0x06e672023,
+ 0x0742f7474,
+ 0x079306374,
0x06c004231,
0x039323030,
0x000707573,
@@ 3117,6 3116,7 @@ ulong bootcode[]={
0x0743a2025,
0x0733a2025,
0x0730a0000,
+ 0x000000000,
0x04e614e00,
0x02b496e66,
0x0002d496e,
M gnot/devduart.c => gnot/devduart.c +2 -2
@@ 100,7 100,7 @@ struct Duartport
Alarm *a; /* alarm for waking the kernel process */
int delay; /* between character input and waking kproc */
int kstarted; /* kproc started */
- uchar delim[256]; /* characters that act as delimiters */
+ uchar delim[256/8]; /* characters that act as delimiters */
};
Duartport duartport[1];
@@ 424,7 424,7 @@ duartrintr(char ch)
(*cq->putc)(cq, ch);
else {
putc(cq, ch);
- if(dp->delim[ch])
+ if(dp->delim[ch/8] & (1<<(ch&7)) )
wakeup(&cq->r);
}
}
M gnot/fns.h => gnot/fns.h +24 -25
@@ 7,16 7,8 @@
#define P_write(sel, addr, val, type) P_oper(sel, *(type *)(PORT+addr) = val)
void addportintr(int (*)(void));
-int cangetc(void*);
-int canputc(void*);
void clearmmucache(void);
-void duartbaud(int);
-void duartbreak(int);
-void duartdtr(int);
-int duartinputport(void);
-void duartrs232start(char);
-void duartrs232stop(void);
-void duartrs232xmit(char);
+void duartinit(void);
void duartstarttimer(void);
void duartstoptimer(void);
#define evenaddr(x) /* 68020 doesn't care */
@@ 30,36 22,20 @@ void fpregrestore(char*);
void fpregsave(char*);
void fprestore(FPsave*);
void fpsave(FPsave*);
-int getc(IOQ*);
-int gets(IOQ*, void*, int);
void incontoggle(void);
-void initq(IOQ*);
-int kbdputc(IOQ*, int);
-void kbdclock(void);
-void kbdrepeat(int);
KMap* kmap(Page*);
void kmapinit(void);
-int kprint(char*, ...);
void kunmap(KMap*);
void mmuinit(void);
void mousebuttons(int);
void mouseclock(void);
-int mouseputc(IOQ*, int);
int portprobe(char*, int, int, int, long);
-void printinit(void);
void procrestore(Proc*, uchar*);
void procsave(uchar*, int);
void procsetup(Proc*);
-int putc(IOQ*, int);
-void puts(IOQ*, void*, int);
void putkmmu(ulong, ulong);
-void putstr(char*);
-void putstrn(char*, long);
void restartprint(Alarm*);
void restfpregs(FPsave*);
-void rs232puts(IOQ*, char*, int);
-void rs232rintr(char);
-void rs232xintr(void);
void screeninit(void);
void screenputc(int);
void screenputs(char*, int);
@@ 81,3 57,26 @@ int splduart(void);
int tas(char*);
void touser(void);
#define waserror() (u->nerrlab++, setlabel(&u->errlab[u->nerrlab-1]))
+
+/*
+ * for queues (to go into portfns.h)
+ */
+int cangetc(void*);
+int canputc(void*);
+int getc(IOQ*);
+int gets(IOQ*, void*, int);
+void initq(IOQ*);
+int putc(IOQ*, int);
+void puts(IOQ*, void*, int);
+
+/*
+ * for devcons (to go into portfns.h)
+ */
+void kbdclock(void);
+void kbdrepeat(int);
+int kbdputc(IOQ*, int);
+int kprint(char*, ...);
+int mouseputc(IOQ*, int);
+void printinit(void);
+void putstr(char*);
+void putstrn(char*, long);
M gnot/lock.c => gnot/lock.c +7 -0
@@ 3,6 3,7 @@
#include "mem.h"
#include "dat.h"
#include "fns.h"
+#include "errno.h"
#define PCOFF -1
@@ 57,3 58,9 @@ unlock(Lock *l)
l->pc = 0;
l->key = 0;
}
+
+void
+mklockseg(Seg *s)
+{
+ error(Esegaddr);
+}
M gnot/mem.h => gnot/mem.h +1 -0
@@ 12,6 12,7 @@
#define BY2PG 8192 /* bytes per page */
#define WD2PG (BY2PG/BY2WD) /* words per page */
#define PGSHIFT 13 /* log(BY2PG) */
+#define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1))
#define MAXMACH 1 /* max # cpus system can run */
M port/devnonet.c => port/devnonet.c +2 -2
@@ 1204,7 1204,7 @@ nonetrcvmsg(Noconv *cp, Block *bp)
/*
* ignore old messages and process the acknowledgement
*/
- if(h->mid != mp->mid){
+ if(h->mid!=mp->mid || (f&NO_NULL)){
DPRINT("old msg %d instead of %d r==%d\n", h->mid, mp->mid, r);
if(r == 0){
norack(cp, h->ack);
@@ 1469,7 1469,7 @@ loop:
*/
while(cp->afirst!=cp->anext && cp->rq->next->len<16*1024){
DPRINT("sending ack %d\n", cp->ack[cp->afirst]);
- nosendctl(cp, 0, 0);
+ nosendctl(cp, NO_NULL, 0);
}
qunlock(cp);
}
M port/devscc.c => port/devscc.c +5 -5
@@ 101,7 101,7 @@ struct SCC
Alarm *a; /* alarm for waking the kernel process */
int delay; /* between character input and waking kproc */
int kstarted; /* kproc started */
- uchar delim[256]; /* characters that act as delimiters */
+ uchar delim[256/8]; /* characters that act as delimiters */
};
SCC scc[2];
@@ 296,7 296,7 @@ sccintr0(SCC *sp, uchar x)
(*cq->putc)(cq, ch);
else {
putc(cq, ch);
- if(sp->delim[ch])
+ if(sp->delim[ch/8] & (1<<(ch&7)) )
wakeup(&cq->r);
}
}
@@ 331,7 331,7 @@ sccintr(void)
* turn on a port's interrupts. set DTR and RTS
*/
void
-sccdevice(SCC *sp)
+sccenable(SCC *sp)
{
/*
* set up i/o routines
@@ 371,7 371,7 @@ sccspecial(int port, IOQ *oq, IOQ *iq, int baud)
sp->nostream = 1;
sp->oq = oq;
sp->iq = iq;
- sccdevice(sp);
+ sccenable(sp);
sccsetbaud(sp, baud);
}
@@ 580,7 580,7 @@ sccreset(void)
initq(sp->iq);
sp->oq = ialloc(sizeof(IOQ), 0);
initq(sp->oq);
- sccdevice(sp);
+ sccenable(sp);
}
}
M port/fault.c => port/fault.c +24 -18
@@ 9,7 9,7 @@
int
fault(ulong addr, int read)
{
- ulong mmuvirt, mmuphys, n;
+ ulong mmuvirt, mmuphys = 0, n;
Seg *s;
PTE *opte, *pte, *npte;
Orig *o;
@@ 64,13 64,15 @@ fault(ulong addr, int read)
if(pte->page == 0){
touched = 1;
if(o->chan==0 || addr>(o->va+(o->maxca-o->minca))){
- /*
- * Zero fill page. If we are really doing a copy-on-write
- * (e.g. into shared bss) we'll move the page later.
- */
- pte->page = newpage(0, o, addr);
- o->npage++;
+ /* Make a new bss or lock segment page */
+ if(s - u->p->seg == LSEG) {
+ pte->page = lkpage(o, addr);
+ mmuphys = PTEUNCACHE;
+ }
+ else
+ pte->page = newpage(0, o, addr);
zeroed = 1;
+ o->npage++;
}else{
/*
* Demand load. Release o because it could take a while.
@@ 157,8 159,10 @@ fault(ulong addr, int read)
head = 0;
}
pg = pte->page;
- if(zeroed){ /* move page */
- pg->ref--;
+ /* when creating pages in the bss which are zfod we create a double
+ * increment on the mod list which must be removed
+ */
+ if(zeroed){
o->npage--;
opte->page = 0;
}else{ /* copy page */
@@ 170,20 174,21 @@ fault(ulong addr, int read)
kunmap(k1);
if(pg->ref <= 1)
panic("pg->ref <= 1");
- pg->ref--;
}
+ pg->ref--;
+
easy:
- mmuphys = PTEWRITE;
+ mmuphys |= PTEWRITE;
}else{
- mmuphys = PTERONLY;
+ mmuphys |= PTERONLY;
if(o->flag & OWRPERM)
if(o->flag & OPURE){
if(!head && pte->page->ref==1)
- mmuphys = PTEWRITE;
+ mmuphys |= PTEWRITE;
}else
if((head && o->nproc==1)
|| (!head && pte->page->ref==1))
- mmuphys = PTEWRITE;
+ mmuphys |= PTEWRITE;
}
mmuvirt = addr;
mmuphys |= PPN(pte->page->pa) | PTEVALID;
@@ 212,7 217,8 @@ validaddr(ulong addr, ulong len, int write)
if((long)len < 0){
Err:
- pprint("invalid address %lux in sys call pc %lux sp %lux\n", addr, ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp);
+ pprint("invalid address %lux in sys call pc %lux sp %lux\n",
+ addr, ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp);
postnote(u->p, 1, "sys: bad address", NDebug);
error(Ebadarg);
}
@@ 261,10 267,10 @@ vmemchr(void *s, int c, int n)
Seg*
seg(Proc *p, ulong addr)
{
- int i;
- Seg *s;
+ Seg *s, *et;
- for(i=0,s=p->seg; i<NSEG; i++,s++)
+ et = &p->seg[NSEG];
+ for(s=p->seg; s < et; s++)
if(s->o && s->minva<=addr && addr<s->maxva)
return s;
return 0;
M port/page.c => port/page.c +37 -9
@@ 61,17 61,15 @@ ialloc(ulong n, int align)
print("ialloc bad\n");
if(palloc.addr == 0)
palloc.addr = ((ulong)&end)&~KZERO;
- if(align){
- palloc.addr += BY2PG-1;
- palloc.addr &= ~(BY2PG-1);
- }
+ if(align)
+ palloc.addr = PGROUND(palloc.addr);
+
memset((void*)(palloc.addr|KZERO), 0, n);
p = palloc.addr;
palloc.addr += n;
- if(align){
- palloc.addr += BY2PG-1;
- palloc.addr &= ~(BY2PG-1);
- }
+ if(align)
+ palloc.addr = PGROUND(palloc.addr);
+
if(palloc.addr >= conf.maxialloc)
panic("keep bill joy away");
return (void*)(p|KZERO);
@@ 549,7 547,7 @@ segaddr(Seg *s, ulong min, ulong max)
return 0;
if(min != s->minva) /* can't grow down yet (stacks: fault.c) */
return 0;
- max = (max+(BY2PG-1)) & ~(BY2PG-1);
+ max = PGROUND(max);
o = s->o;
if(max == s->maxva)
return 1;
@@ 709,3 707,33 @@ compactpte(Orig *o, ulong n)
print("compactpte fails addr %lux %lux %d\n", o->va+n*BY2PG, o->va, n);
return 0;
}
+
+long
+ibrk(ulong addr, int seg)
+{
+ Seg *s;
+
+ s = &u->p->seg[seg];
+ if(seg == LSEG && s->o == 0)
+ mklockseg(s);
+
+ /* Allows us to determine the base of the segment */
+ if(addr == 0)
+ return s->minva;
+
+ if(addr < s->endseg){
+ pprint("addr below segment\n");
+ pexit("Suicide", 0);
+ error(Esegaddr);
+ }
+
+ if(addr > PGROUND(s->endseg))
+ if(segaddr(s, s->minva, addr) == 0){
+ pprint("bad segaddr in brk\n");
+ pexit("Suicide", 0);
+ error(Esegaddr);
+ }
+
+ s->endseg = addr;
+ return 0;
+}
M port/portdat.h => port/portdat.h +2 -2
@@ 297,7 297,8 @@ struct Seg
ulong minva; /* va of 0th pte (not necessarily Seg->o->va) */
ulong maxva; /* va of last pte */
PTE *mod; /* list of modified pte's */
- ulong pad[3]; /**/
+ ulong endseg; /* segments end */
+ ulong pad[2]; /**/
};
/*
@@ 343,7 344,6 @@ struct Proc
int state;
Page *upage; /* BUG: should be unlinked from page list */
Seg seg[NSEG];
- ulong bssend; /* initial top of bss seg */
ulong pid;
int nchild;
QLock wait; /* exiting children to be waited for */
M port/portfns.h => port/portfns.h +3 -0
@@ 70,17 70,20 @@ Block* getq(Queue*);
void gotolabel(Label*);
void growpte(Orig*, ulong);
void* ialloc(ulong, int);
+long ibrk(ulong, int);
int incref(Ref*);
void insert(List**, List*, List*);
void invalidateu(void);
void isdir(Chan*);
void kproc(char*, void(*)(void*), void*);
void lights(int);
+Page* lkpage(Orig*, ulong);
void lock(Lock*);
void lockinit(void);
Orig* lookorig(ulong, ulong, int, Chan*);
void machinit(void);
void mapstack(Proc*);
+void mklockseg(Seg*);
void mmurelease(Proc*);
int mount(Chan*, Chan*, int);
Chan* namec(char*, int, int, ulong);
M port/queue.c => port/queue.c +1 -1
@@ 10,10 10,10 @@ void
initq(IOQ *q)
{
lock(q);
+ unlock(q);
q->in = q->out = q->buf;
q->puts = puts;
q->putc = putc;
- unlock(q);
}
int
M port/sysproc.c => port/sysproc.c +5 -53
@@ 125,7 125,6 @@ sysfork(ulong *arg)
p->parent = u->p;
p->parentpid = u->p->pid;
p->pgrp = u->p->pgrp;
- p->bssend = u->p->bssend;
p->fpstate = u->p->fpstate;
incref(p->pgrp);
u->p->nchild++;
@@ 338,7 337,7 @@ sysexec(ulong *arg)
close(tc);
- p->bssend = bssend;
+ p->seg[BSEG].endseg = bssend;
/*
* Move the stack
@@ 525,58 524,11 @@ sysnoted(ulong *arg)
long
sysbrk_(ulong *arg)
{
- ulong addr;
- Seg *s;
-
- addr = arg[0];
- if(addr < u->p->bssend){
- pprint("addr below bss\n");
- pexit("Suicide", 0);
- error(Esegaddr);
- }
- if(addr <= ((u->p->bssend+(BY2PG-1))&~(BY2PG-1))) /* still in DSEG */
- goto Return;
- if(segaddr(&u->p->seg[BSEG], u->p->seg[BSEG].minva, arg[0]) == 0){
- pprint("bad segaddr in brk\n");
- pexit("Suicide", 0);
- error(Esegaddr);
- }
- Return:
- u->p->bssend = addr;
- return 0;
+ return ibrk(arg[0], BSEG);
}
-/*
+
long
-syslkbrk(ulong *arg)
+syslkbrk_(ulong *arg)
{
- ulong addr;
- Orig *o;
- Seg *s;
-
- addr = arg[0];
- s = &u->p->seg[LSEG];
- if(addr < LKSEGBASE)
- error(Esegaddr);
-
- /* If we have never seen a lock segment create one */
- if(s->o == 0) {
- s->proc = u->p;
- s->minva = LKSEGBASE;
- s->maxva = addr;
- o = neworig(s->minva, (addr-LKSEGBASE)>>PGSHIFT, OWRPERM, 0);
- o->minca = 0;
- o->maxca = 0;
- s->o = o;
- s->mod = 0;
- }
- if(addr < s->maxva)
- return 0;
- if(segaddr(&u->p->seg[LSEG], s->minva, addr) == 0) {
- pprint("bad segaddr in brk\n");
- pexit("Suicide", 0);
- error(Esegaddr);
-
- }
- return 0;
+ return ibrk(arg[0], LSEG);
}
-*/
M power/lock.c => power/lock.c +45 -0
@@ 4,6 4,7 @@
#include "dat.h"
#include "fns.h"
#include "io.h"
+#include "errno.h"
/*
* The hardware semaphores are strange. 64 per page, replicated 16 times
@@ 23,11 24,14 @@ struct
uchar bmap[NSEMPG]; /* allocation map */
}semalloc;
+Page lkpgheader[NSEMPG];
+
void
lockinit(void)
{
memset(semalloc.bmap, 0, sizeof(semalloc.bmap));
semalloc.bmap[0] = 1;
+
semalloc.lock.sbsem = SBSEM;
semalloc.nextsem = SBSEM+1;
semalloc.nsem = 1;
@@ 50,6 54,32 @@ lkpgalloc(void)
return (p-semalloc.bmap)*WD2PG + SBSEM;
}
+/* Moral equivalent of newpage for pages of hardware lock */
+Page*
+lkpage(Orig *o, ulong va)
+{
+ uchar *p, *top;
+ Page *pg;
+ int i;
+
+ lock(&semalloc.lock);
+ top = &semalloc.bmap[NSEMPG];
+ for(p = semalloc.bmap; *p && p < top; p++)
+ ;
+ if(p == top)
+ panic("lkpage");
+
+ *p = 1;
+ i = p-semalloc.bmap;
+ pg = &lkpgheader[i];
+ pg->pa = (ulong)((i*WD2PG) + SBSEM);
+ pg->va = va;
+ pg->o = o;
+
+ unlock(&semalloc.lock);
+ return pg;
+}
+
void
lkpgfree(ulong *lpa)
{
@@ 134,3 164,18 @@ unlock(Lock *l)
l->pc = 0;
*l->sbsem = 0;
}
+
+void
+mklockseg(Seg *s)
+{
+ Orig *o;
+
+ s->proc = u->p;
+ o = neworig(LKSEGBASE, 0, OWRPERM|OPURE, 0);
+ o->minca = 0;
+ o->maxca = 0;
+ s->o = o;
+ s->minva = LKSEGBASE;
+ s->maxva = LKSEGBASE;
+ s->mod = 0;
+}
M power/mem.h => power/mem.h +3 -0
@@ 12,12 12,14 @@
#define BY2PG 4096 /* bytes per page */
#define WD2PG (BY2PG/BY2WD) /* words per page */
#define PGSHIFT 12 /* log(BY2PG) */
+#define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1))
#define MAXMACH 4 /* max # cpus system can run */
/*
* Time
*/
+#define HZ 20
#define MS2HZ 50 /* millisec per clock tick */
#define TK2SEC(t) ((t)/20) /* ticks to seconds */
#define TK2MS(t) ((t)*MS2HZ) /* ticks to milliseconds */
@@ 94,6 96,7 @@
#define PTEGLOBL (1<<8)
#define PTEVALID (1<<9)
#define PTEWRITE (1<<10)
+#define PTEUNCACHE (1<<11)
#define PTERONLY 0
#define PTEPID(n) ((n)<<6)
#define TLBPID(n) (((n)>>6)&0x3F)
M power/trap.c => power/trap.c +2 -2
@@ 442,7 442,7 @@ Syscall sysbind, sysbrk_, syschdir, sysclose, syscreate, sysdeath;
Syscall sysdup, syserrstr, sysexec, sysexits, sysfork, sysforkpgrp;
Syscall sysfstat, sysfwstat, sysgetpid, sysmount, sysnoted;
Syscall sysnotify, sysopen, syspipe, sysr1, sysread, sysremove, sysseek;
-Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm;
+Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm, syslkbrk_;
Syscall *systab[]={
[SYSR1] sysr1,
@@ 457,7 457,7 @@ Syscall *systab[]={
[FORK] sysfork,
[FORKPGRP] sysforkpgrp,
[FSTAT] sysfstat,
- [___LASTERR___] sysdeath,
+ [LKBRK_] syslkbrk_,
[MOUNT] sysmount,
[OPEN] sysopen,
[READ] sysread,
M ss/dat.h => ss/dat.h +35 -34
@@ 1,8 1,6 @@
typedef struct Conf Conf;
typedef struct FFrame FFrame;
typedef struct FPsave FPsave;
-typedef struct IOQ IOQ;
-typedef struct KIOQ KIOQ;
typedef struct KMap KMap;
typedef struct Lance Lance;
typedef struct Lancemem Lancemem;
@@ 109,38 107,6 @@ struct PMMU
#include "../port/portdat.h"
/*
- * character based IO (mouse, keyboard, console screen)
- */
-#define NQ 4096
-struct IOQ
-{
- Lock;
- uchar buf[NQ];
- uchar *in;
- uchar *out;
- int state;
- Rendez r;
- union{
- void (*puts)(IOQ*, void*, int); /* output */
- int (*putc)(IOQ*, int); /* input */
- };
- void *ptr;
-};
-struct KIOQ
-{
- QLock;
- IOQ;
- int repeat;
- int c;
- int count;
-};
-
-extern IOQ lineq;
-extern IOQ printq;
-extern IOQ mouseq;
-extern KIOQ kbdq;
-
-/*
* machine dependent definitions not used by ../port/dat.h
*/
struct KMap
@@ 246,3 212,38 @@ struct
short machs;
short exiting;
}active;
+
+/*
+ * character based IO (mouse, keyboard, console screen)
+ */
+typedef struct IOQ IOQ;
+typedef struct KIOQ KIOQ;
+#define NQ 4096
+struct IOQ
+{
+ Lock;
+ uchar buf[NQ];
+ uchar *in;
+ uchar *out;
+ int state;
+ Rendez r;
+ union{
+ void (*puts)(IOQ*, void*, int); /* output */
+ int (*putc)(IOQ*, int); /* input */
+ };
+ void *ptr;
+};
+struct KIOQ
+{
+ QLock;
+ IOQ;
+ int repeat;
+ int c;
+ int count;
+};
+
+extern IOQ lineq;
+extern IOQ printq;
+extern IOQ mouseq;
+extern KIOQ kbdq;
+
M ss/fns.h => ss/fns.h +31 -24
@@ 1,20 1,9 @@
#include "../port/portfns.h"
void cacheinit(void);
-int cangetc(void*);
-int canputc(void*);
void clearfpintr(void);
#define clearmmucache()
void clockinit(void);
-void duartbaud(int);
-void duartbreak(int);
-void duartdtr(int);
-void duartinit(void);
-int duartinputport(void);
-void duartintr(void);
-void duartstartrs232o(void);
-void duartstarttimer(void);
-void duartstoptimer(void);
void evenaddr(ulong);
char* excname(ulong);
void faultasync(Ureg*);
@@ 27,15 16,10 @@ void fpregrestore(char*);
void fpregsave(char*);
void fprestore(FPsave*);
void fpsave(FPsave*);
-int getc(IOQ*);
-int gets(IOQ*, void*, int);
int getb2(ulong);
-int getrs232o(void);
int getw2(ulong);
-void initq(IOQ*);
void intrinit(void);
void ioinit(void);
-int kbdputc(IOQ*, int);
int kbdstate(IOQ*, int);
void kbdclock(void);
void kbdrepeat(int);
@@ 49,14 33,11 @@ void lancesetup(Lance*);
void lancetoggle(void);
void mmuinit(void);
void mousebuttons(int);
-int mouseputc(IOQ*, int);
void mouseclock(void);
void printinit(void);
#define procrestore(x,y)
#define procsave(x,y)
#define procsetup(x) ((p)->fpstate = FPinit)
-int putc(IOQ*, int);
-void puts(IOQ*, void*, int);
void putb2(ulong, int);
void putcontext(int);
void putcxreg(int);
@@ 76,11 57,6 @@ void putwE(ulong, ulong);
void reset(void);
void restartprint(Alarm*);
void restfpregs(FPsave*);
-void rs232ichar(int);
-void sccintr(void);
-void sccputs(IOQ*, char*, int);
-void sccsetup(void*);
-void sccspecial(int, IOQ*, IOQ*, int);
void screeninit(void);
void screenputc(int);
void spldone(void);
@@ 90,3 66,34 @@ void trap(Ureg*);
void trapinit(void);
#define wbflush() /* mips compatibility */
#define waserror() (u->nerrlab++, setlabel(&u->errlab[u->nerrlab-1]))
+
+/*
+ * for queues (to go into portfns.h)
+ */
+int cangetc(void*);
+int canputc(void*);
+int getc(IOQ*);
+int gets(IOQ*, void*, int);
+void initq(IOQ*);
+int putc(IOQ*, int);
+void puts(IOQ*, void*, int);
+
+/*
+ * for the scc (to go into portfns.h)
+ */
+void sccintr(void);
+void sccputs(IOQ*, char*, int);
+void sccsetup(void*);
+void sccspecial(int, IOQ*, IOQ*, int);
+
+/*
+ * for devcons (to go into portfns.h)
+ */
+void kbdclock(void);
+void kbdrepeat(int);
+int kbdputc(IOQ*, int);
+int kprint(char*, ...);
+int mouseputc(IOQ*, int);
+void printinit(void);
+void putstr(char*);
+void putstrn(char*, long);
M ss/mem.h => ss/mem.h +1 -0
@@ 12,6 12,7 @@
#define BY2PG 4096 /* bytes per page */
#define WD2PG (BY2PG/BY2WD) /* words per page */
#define PGSHIFT 12 /* log(BY2PG) */
+#define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1))
#define MAXMACH 1 /* max # cpus system can run */