From 56793053fd0a265cd1784eb8a70480934d98fdbc Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 6 Jun 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-06-06 --- gnot/boot.c | 8 +-- gnot/boot.h | 132 ++++++++++++++++++++++++------------------------ gnot/devduart.c | 4 +- gnot/fns.h | 49 +++++++++--------- gnot/lock.c | 7 +++ gnot/mem.h | 1 + port/devnonet.c | 4 +- port/devscc.c | 10 ++-- port/fault.c | 42 ++++++++------- port/page.c | 46 +++++++++++++---- port/portdat.h | 4 +- port/portfns.h | 3 ++ port/queue.c | 2 +- port/sysproc.c | 58 ++------------------- power/lock.c | 45 +++++++++++++++++ power/mem.h | 3 ++ power/trap.c | 4 +- ss/dat.h | 69 ++++++++++++------------- ss/fns.h | 55 +++++++++++--------- ss/mem.h | 1 + 20 files changed, 300 insertions(+), 247 deletions(-) diff --git a/gnot/boot.c b/gnot/boot.c index 31202ff4febfbbe7d3c079fda39b999d0e46b8a1..67b7a5fb92d96922f615790b4e8fb202b191043f 100644 --- a/gnot/boot.c +++ b/gnot/boot.c @@ -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; diff --git a/gnot/boot.h b/gnot/boot.h index 554b5902bf928f9a7cdef002bd2500d633f60c55..3bda3b24be0c9af6999c9419bc82001cf451ba12 100644 --- a/gnot/boot.h +++ b/gnot/boot.h @@ -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, diff --git a/gnot/devduart.c b/gnot/devduart.c index 4b40000d2f7d8127c81dd6cd01868f279a413598..bbdac1fefc43e398fb28eec39cddb4c0783d65d0 100644 --- a/gnot/devduart.c +++ b/gnot/devduart.c @@ -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); } } diff --git a/gnot/fns.h b/gnot/fns.h index 5fa12999dea6e48bae07bec98f5e7f5dd0b04bc2..16566c8a2312b0d4e7976dd88ee80b3a1108245f 100644 --- a/gnot/fns.h +++ b/gnot/fns.h @@ -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); diff --git a/gnot/lock.c b/gnot/lock.c index 3657240a7b309477123c91d09d46b0d57ce41f21..5b3d41cba6e5156c6f32e7abbedd1287e8f734b3 100644 --- a/gnot/lock.c +++ b/gnot/lock.c @@ -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); +} diff --git a/gnot/mem.h b/gnot/mem.h index dbd149f76a6a3b54313466493ff5eed43f5d0bae..ec984e98f9c8391242e13c39d9f0f3f962e519b3 100644 --- a/gnot/mem.h +++ b/gnot/mem.h @@ -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 */ diff --git a/port/devnonet.c b/port/devnonet.c index 7269dfa9dc1942db95d0277fa05ad1d842332c8e..cff60a7708e4a78dc837d11a7b00ad1001746ec7 100644 --- a/port/devnonet.c +++ b/port/devnonet.c @@ -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); } diff --git a/port/devscc.c b/port/devscc.c index fd21ba8893cd8a0f291c69d187409aae3a745564..e72c9abd2702e3a5115935366e937a37d4d43931 100644 --- a/port/devscc.c +++ b/port/devscc.c @@ -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); } } diff --git a/port/fault.c b/port/fault.c index 8dc8ff67a57d5ac807ff506f8819a4b2cdc37e8a..115b0b5db92332054afe36d9a4c913104ed9bb4b 100644 --- a/port/fault.c +++ b/port/fault.c @@ -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; iseg[NSEG]; + for(s=p->seg; s < et; s++) if(s->o && s->minva<=addr && addrmaxva) return s; return 0; diff --git a/port/page.c b/port/page.c index ca30a77962973146d92fc6272c57ed18f41d8f40..4f531e52e65e3d002dde22c2ad56391073e39f6c 100644 --- a/port/page.c +++ b/port/page.c @@ -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; +} diff --git a/port/portdat.h b/port/portdat.h index df67f63225b89855323eb9f6a5d5d0f25ff8a26f..0fdb221294db423c5ec004890d2938f6c75a821d 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -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 */ diff --git a/port/portfns.h b/port/portfns.h index 59ed6298cc3f8cf1086ad210a2bfe7181b92d02c..580d811fa8d3630bc989445275c88c95f5964882 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -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); diff --git a/port/queue.c b/port/queue.c index ae5c5c254aa73e0c6b95aee2ab3ef4cdfe4bc7bd..db545ac915c32d99d8cae668fbfc9e84aa13c005 100644 --- a/port/queue.c +++ b/port/queue.c @@ -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 diff --git a/port/sysproc.c b/port/sysproc.c index 6f048e0845a8004e8e3f2ce2e3002239134e4bfa..b82782ccb56b8d19371a6d8c30e9104706866e29 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -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); } -*/ diff --git a/power/lock.c b/power/lock.c index c4f2a25f02f3dc5b77ef83943bd80798e93de2d9..f9d49db6712e569240554a63c5e0b61b8ce12e36 100644 --- a/power/lock.c +++ b/power/lock.c @@ -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; +} diff --git a/power/mem.h b/power/mem.h index b18aa20a04fbff2512a06b8ac3ae7276b6d3c69f..8f8a6539c82099911bdf437c0542699014d35c39 100644 --- a/power/mem.h +++ b/power/mem.h @@ -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) diff --git a/power/trap.c b/power/trap.c index d9e7b699714715e8f39c9341d0f107d4ff6fccb0..aee9ce0b8799a843817ed1ec6d81abcc32cc63af 100644 --- a/power/trap.c +++ b/power/trap.c @@ -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, diff --git a/ss/dat.h b/ss/dat.h index 752ff971cd7dd916c533218db5c1482ceec71533..d1ea0affa1cb320f5c17b7284414b85d712b08fd 100644 --- a/ss/dat.h +++ b/ss/dat.h @@ -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; @@ -108,38 +106,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 */ @@ -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; + diff --git a/ss/fns.h b/ss/fns.h index a7239be162f67a15efbf21359ca09e7d70feccd8..f6c924e76d376b84d5d3b8fcbe4bd6df0c918181 100644 --- a/ss/fns.h +++ b/ss/fns.h @@ -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); diff --git a/ss/mem.h b/ss/mem.h index 041f815a3506c2776d07aea0daf6f714d627a227..ff2f9ea5a3e2ea78d7778c41630bf4c10aaee0a3 100644 --- a/ss/mem.h +++ b/ss/mem.h @@ -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 */