From 8a79dacef4226df206796ad83f2e64cae872e82c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 31 Jul 1998 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1998-07-31 --- ip/rudp.c | 6 ++---- ip/udp.c | 2 +- pc/trap.c | 14 +++++++------- port/devcons.c | 23 ++++++++++++++--------- port/portfns.h | 1 + 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/ip/rudp.c b/ip/rudp.c index ca5a28a120f3c4acdc75c572edc80e190d70ba88..6f2981e82df0fe659c6be69d5130c834e2854c0a 100644 --- a/ip/rudp.c +++ b/ip/rudp.c @@ -492,7 +492,7 @@ rudpiput(Proto *rudp, uchar *ia, Block *bp) break; default: /* connection oriented rudp */ - if(c->raddr == 0){ + if(ipcmp(c->raddr, IPnoaddr) == 0){ /* save the src address in the conversation */ ipmove(c->raddr, raddr); c->rport = rport; @@ -691,7 +691,7 @@ relstate(Rudpcb *ucb, uchar *addr, ushort port, char *from) /* no state for this addr/port, create some */ if(r == nil){ if(generation == 0) - generation = TK2SEC(MACHP(0)->ticks); + generation = rand(); DPRINT("from %s new state %d for %I!%d\n", from, generation, addr, port); r = smalloc(sizeof(Reliable)); @@ -728,8 +728,6 @@ reliput(Conv *c, Block *bp, uchar *addr, ushort port) Rudphdr *rh; ulong seq, ack, sgen, agen, ackreal; - - /* get fields */ uh = (Udphdr*)(bp->rp); rh = (Rudphdr*)uh; diff --git a/ip/udp.c b/ip/udp.c index f7b06d67b25e8b343a23905947890ce0b81d74f0..660d178af4fa6c086de58b6011ffbe726e788d6e 100644 --- a/ip/udp.c +++ b/ip/udp.c @@ -345,7 +345,7 @@ udpiput(Proto *udp, uchar *ia, Block *bp) break; default: /* connection oriented udp */ - if(c->raddr == 0){ + if(ipcmp(c->raddr, IPnoaddr) == 0){ /* save the src address in the conversation */ ipmove(c->raddr, raddr); c->rport = rport; diff --git a/pc/trap.c b/pc/trap.c index 274071db6012fa7e38150a600cf8351d712dacc2..317aa8987ec48725b65a61c4cd3de28a046ea286 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -322,11 +322,13 @@ fault386(Ureg* ureg, void*) int read, user, n, insyscall; char buf[ERRLEN]; - insyscall = up->insyscall; - up->insyscall = 1; addr = getcr2(); + user = (ureg->cs & 0xFFFF) == UESEL; + if(!user && mmukmapsync(addr)) + return; read = !(ureg->ecode & 2); - user = (ureg->cs&0xffff) == UESEL; + insyscall = up->insyscall; + up->insyscall = 1; spllo(); n = fault(addr, read); if(n < 0){ @@ -336,10 +338,8 @@ fault386(Ureg* ureg, void*) postnote(up, 1, buf, NDebug); return; } - if(mmukmapsync(addr) == 0){ - dumpregs(ureg); - panic("fault: 0x%lux\n", addr); - } + dumpregs(ureg); + panic("fault: 0x%lux\n", addr); } up->insyscall = insyscall; } diff --git a/port/devcons.c b/port/devcons.c index 5fa0c598fe6914e9aedcbf80692ebf9fe0e43e60..22d7170a110cfd5224ef8863eab61cf14bffcc6b 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -31,7 +31,7 @@ char sysname[NAMELEN]; static ulong randomread(void*, ulong); static void randominit(void); -static void seednrand(void); +static void seedrand(void); static long qtimer(long, vlong); int qtimerentry = -1; @@ -462,12 +462,6 @@ consinit(void) static Chan* consattach(char *spec) { - static int seeded; - - if(!seeded){ - seednrand(); - seeded = 1; - } return devattach('c', spec); } @@ -945,7 +939,7 @@ static struct } rb; static void -seednrand(void) +seedrand(void) { randomread((void*)&rb.randn, sizeof(rb.randn)); } @@ -953,10 +947,20 @@ seednrand(void) int nrand(int n) { + if(rb.randn == 0) + seedrand(); rb.randn = rb.randn*1103515245 + 12345 + MACHP(0)->ticks; return (rb.randn>>16) % n; } +int +rand(void) +{ + nrand(1); + return rb.randn; +} + + static int rbnotfull(void*) { @@ -1073,7 +1077,8 @@ randomread(void *xp, ulong n) } static long -qtimer(long n, vlong offset) { +qtimer(long n, vlong offset) +{ /* block until time ≥ offset; * add n to offset * return increment to offset (i.e., n) diff --git a/port/portfns.h b/port/portfns.h index d17798402c632451ca23e98915c1ea66676af18a..78203053745cc818c1d12306b70b88b1848a64da 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -236,6 +236,7 @@ int qwindow(Queue*); int qwrite(Queue*, void*, int); void qsetlimit(Queue*, int); void qnoblock(Queue*, int); +int rand(void); int readnum(ulong, char*, ulong, ulong, int); int readstr(ulong, char*, ulong, char*); void ready(Proc*);