M carrera/ns16552.h => carrera/ns16552.h +1 -27
@@ 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;
-}
M ip/icmp.c => ip/icmp.c +3 -1
@@ 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;
}
}
M ip/tcp.c => ip/tcp.c +6 -3
@@ 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;
}
M port/alloc.c => port/alloc.c +40 -19
@@ 4,13 4,20 @@
#include "dat.h"
#include "fns.h"
#include "error.h"
-#include "pool.h"
+#include <pool.h>
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
M port/devcons.c => port/devcons.c +6 -0
@@ 193,6 193,12 @@ panic(char *fmt, ...)
exit(1);
}
+void
+_assert(char *fmt)
+{
+ panic("assert failed: %s", fmt);
+}
+
int
pprint(char *fmt, ...)
{