From ec592c20aa24e7df535f0fcb7e2c2daa83a01a68 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 25 Aug 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-08-25 --- carrera/ns16552.h | 28 +--------------------- ip/icmp.c | 4 +++- ip/tcp.c | 9 +++++--- port/alloc.c | 59 ++++++++++++++++++++++++++++++++--------------- port/devcons.c | 6 +++++ 5 files changed, 56 insertions(+), 50 deletions(-) diff --git a/carrera/ns16552.h b/carrera/ns16552.h index 95fa90f343c457cebc07d4f7332969a781b76117..bd05fba544b1cfcda8c4cd0cd9522e4c2f2b24e1 100644 --- a/carrera/ns16552.h +++ b/carrera/ns16552.h @@ -1,4 +1,5 @@ #define outb(p, ch) *(uchar*)((p)^7) = ch +#define inb(p) *(uchar*)((p)^7) #define uartwrreg(u,r,v) outb((u)->port + (r), (u)->sticky[r] | (v)) #define uartrdreg(u,r) *(uchar*)(((u)->port + (r))^7) @@ -16,30 +17,3 @@ ns16552install(void) ns16552setup(Uart1, UartFREQ, "eia0", Ns550); } -#define RD(r) (*(uchar*)((Uart1+r)^7)) -static void -ns16552iputc(char c) -{ - while((RD(5) & (1<<5)) == 0) - ; - *(uchar*)(Uart1^7) = c; - while((RD(5) & (1<<5)) == 0) - ; -} - -int -iprint(char *fmt, ...) -{ - int n, i; - char buf[512]; - va_list arg; - - va_start(arg, fmt); - n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf; - va_end(arg); - - for(i = 0; i < n; i++) - ns16552iputc(buf[i]); - - return n; -} diff --git a/ip/icmp.c b/ip/icmp.c index 2b86688547fdc4e0344be83dabae13c5086e6564..6a515f0cc6a4f4e81360a2933d5d7d6b628468f7 100644 --- a/ip/icmp.c +++ b/ip/icmp.c @@ -255,7 +255,9 @@ goticmpkt(Proto *icmp, Block *bp) s = *c; if(s->lport == recid) if(ipcmp(s->raddr, dst) == 0){ - qpass(s->rq, bp); + bp = concatblock(bp); + if(bp != nil) + qpass(s->rq, bp); return; } } diff --git a/ip/tcp.c b/ip/tcp.c index 815887ad58c168133949a8b3c3902e9c75085fd8..5f2c6a0d6e8c2e621aa140735b4c0849ac03f71e 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -801,16 +801,19 @@ ntohtcp(Tcp *tcph, Block **bpp) optr = h->tcpopt; for(i = TCP_HDRSIZE; i < hdrlen;) { - switch(*optr++) { + switch(optr[i]) { + default: + i += optr[i+1]; + break; case EOLOPT: return hdrlen; case NOOPOPT: i++; break; case MSSOPT: - optlen = *optr++; + optlen = optr[i+1]; if(optlen == MSS_LENGTH) - tcph->mss = nhgets(optr); + tcph->mss = nhgets(optr+2); i += optlen; break; } diff --git a/port/alloc.c b/port/alloc.c index 7adef9120f4231cd97f5d9f2ae1f30e4da63b1bf..def0ed5ccc69b38b7e847df1c0cee72dfe73cfd2 100644 --- a/port/alloc.c +++ b/port/alloc.c @@ -4,13 +4,20 @@ #include "dat.h" #include "fns.h" #include "error.h" -#include "pool.h" +#include static void poolprint(Pool*, char*, ...); static void ppanic(Pool*, char*, ...); static void plock(Pool*); static void punlock(Pool*); +typedef struct Private Private; +struct Private { + Lock lk; + char msg[128]; /* a rock for messages to be printed at unlock */ +}; + +static Private pmainpriv; static Pool pmainmem = { .name= "Main", .maxsize= 4*1024*1024, @@ -24,8 +31,11 @@ static Pool pmainmem = { .unlock= punlock, .print= poolprint, .panic= ppanic, + + .private= &pmainpriv, }; +static Private pimagpriv; static Pool pimagmem = { .name= "Image", .maxsize= 16*1024*1024, @@ -39,6 +49,8 @@ static Pool pimagmem = { .unlock= punlock, .print= poolprint, .panic= ppanic, + + .private= &pimagpriv, }; Pool* mainmem = &pmainmem; @@ -53,15 +65,17 @@ poolprint(Pool *p, char *fmt, ...) { va_list v; int n; + Private *pv; + pv = p->private; va_start(v, fmt); - n = doprint(p->msg, p->msg+sizeof p->msg, fmt, v)-p->msg; + n = doprint(pv->msg, pv->msg+sizeof pv->msg, fmt, v)-pv->msg; va_end(v); - if(n >= sizeof p->msg); - n = sizeof(p->msg)-1; + if(n >= sizeof pv->msg); + n = sizeof(pv->msg)-1; if(n < 0) n = 0; - p->msg[n] = 0; + pv->msg[n] = 0; } static void @@ -69,39 +83,46 @@ ppanic(Pool *p, char *fmt, ...) { va_list v; int n; + Private *pv; + pv = p->private; va_start(v, fmt); - n = doprint(p->msg, p->msg+sizeof p->msg, fmt, v)-p->msg; + n = doprint(pv->msg, pv->msg+sizeof pv->msg, fmt, v)-pv->msg; va_end(v); - if(n >= sizeof p->msg); - n = sizeof(p->msg)-1; + if(n >= sizeof pv->msg); + n = sizeof(pv->msg)-1; if(n < 0) n = 0; - p->msg[n] = 0; - iunlock(&p->lk); - panic("%s", p->msg); + pv->msg[n] = 0; + iunlock(&pv->lk); + panic("%s", pv->msg); } static void plock(Pool *p) { - ilock(&p->lk); - p->msg[0] = 0; + Private *pv; + + pv = p->private; + ilock(&pv->lk); + pv->msg[0] = 0; } static void punlock(Pool *p) { - char msg[sizeof p->msg]; + Private *pv; + char msg[sizeof pv->msg]; - if(p->msg[0] == 0){ - iunlock(&p->lk); + pv = p->private; + if(pv->msg[0] == 0){ + iunlock(&pv->lk); return; } - memmove(msg, p->msg, sizeof msg); - iunlock(&p->lk); - print("%.*s", sizeof p->msg, msg); + memmove(msg, pv->msg, sizeof msg); + iunlock(&pv->lk); + print("%.*s", sizeof pv->msg, msg); } void diff --git a/port/devcons.c b/port/devcons.c index 32e8372cc0bda85dd10887925995a6be183bde0f..0491307eca94be5132707e09c54ed22c47ddc87a 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -193,6 +193,12 @@ panic(char *fmt, ...) exit(1); } +void +_assert(char *fmt) +{ + panic("assert failed: %s", fmt); +} + int pprint(char *fmt, ...) {