From 4fa489af282d5dc52a5122f1aea726e4ce4a0eaf Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 2 Apr 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-04-02 --- power/dat.h | 5 +++-- power/devhotrod.c | 24 +++++++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/power/dat.h b/power/dat.h index ef6198edff7dc59ddcf614884db5d43344d64c8e..dad7594aa5572d25cd6a07940e53ba245014f44d 100644 --- a/power/dat.h +++ b/power/dat.h @@ -98,8 +98,9 @@ struct Hotmsg ulong cmd; ulong param[5]; Rendez r; - short intr; /* flag: interrupt has occurred */ - short abort; /* flag: don't interrupt */ + uchar intr; /* flag: interrupt has occurred */ + uchar abort; /* flag: don't interrupt */ + uchar wtype; /* type of last message written */ }; #define CHDIR 0x80000000L diff --git a/power/devhotrod.c b/power/devhotrod.c index 8db1aaa27b045629c0526b095124c5fc6f46990a..908b66ea0e204fa69e4fa758acb1d32119eb3712 100644 --- a/power/devhotrod.c +++ b/power/devhotrod.c @@ -25,7 +25,7 @@ ulong testbuf[NTESTBUF]; /* * If 1, ENABCKSUM causes data transfers to have checksums */ -#define ENABCKSUM 0 +#define ENABCKSUM 1 typedef struct Hotrod Hotrod; @@ -278,6 +278,7 @@ hotrodread(Chan *c, void *buf, long n) * use supplied buffer, no need to lock for reply */ isflush = 0; +memset(buf, 0, n); mp = &((User*)(u->p->upage->pa|KZERO))->khot; if(mp->abort){ /* use reserved flush msg */ mp = &((User*)(u->p->upage->pa|KZERO))->fhot; @@ -313,11 +314,21 @@ hotrodread(Chan *c, void *buf, long n) if(mp->param[2] != hotsum(buf, m, mp->param[2])){ hp->addr->error++; print("hotrod cksum err is %lux sb %lux\n", - hotsum(buf, n, 1), mp->param[2]); -{int i; for(i=0; i<8; i++) print("%lux\n", ((ulong*)buf)[i]); } + hotsum(buf, m, 1), mp->param[2]); + print("addr %lux\n", ((char*)buf)+m); + { + int i; + ulong *p = buf; + for(i=2; iabort = 0; + if(isflush) + u->khot.abort = 0; /* flushed message's done too */ + else poperror(); }else{ /* @@ -347,12 +358,13 @@ hotrodread(Chan *c, void *buf, long n) if(mp->param[2] != hotsum((ulong*)hp->buf, m, mp->param[2])){ hp->addr->error++; print("hotrod cksum err is %lux sb %lux\n", - hotsum((ulong*)hp->buf, n, 1), mp->param[2]); + hotsum((ulong*)hp->buf, m, 1), mp->param[2]); qunlock(&hp->buflock); {int i; for(i=0; i<8; i++) print("%lux\n", ((ulong*)buf)[i]); } error(Eio); } memmove(buf, hp->buf, m); + mp->abort = 0; qunlock(&hp->buflock); } return m; @@ -383,6 +395,7 @@ hotrodwrite(Chan *c, void *buf, long n) * use supplied buffer, no need to lock for reply */ mp = &((User*)(u->p->upage->pa|KZERO))->khot; + mp->wtype = ((char*)buf)[0]; if(mp->abort) /* use reserved flush msg */ mp = &((User*)(u->p->upage->pa|KZERO))->fhot; qlock(hp); @@ -397,6 +410,7 @@ hotrodwrite(Chan *c, void *buf, long n) * use hotrod buffer. lock the buffer until the reply */ mp = &((User*)(u->p->upage->pa|KZERO))->uhot; + mp->wtype = ((char*)buf)[0]; qlock(&hp->buflock); qlock(hp); memmove(hp->buf, buf, n);