ref: 50b5ed42a484cc88f24aa68c1ee35cf3e3d0ea46
parent: 1be6cab37d30ccde1dcedec776b8381115b65610
	author: cinap_lenrek <cinap_lenrek@felloff.net>
	date: Sat Sep  8 18:24:36 EDT 2018
	
devarch: fix /dev/msr (thanks joe9, aiju) the end condition port < offset+n could never become false when offset truncated to 32 bit signed port is negative. change the condition variables to unsigned int. msr's are not byte addressible, so advance reads by one instead of 8.
--- a/sys/src/9/pc/devarch.c
+++ b/sys/src/9/pc/devarch.c
@@ -355,7 +355,8 @@
archread(Chan *c, void *a, long n, vlong offset)
 {char buf[32], *p;
- int port, i;
+ uint port, end;
+ int i;
ushort *sp;
ulong *lp;
vlong *vp;
@@ -362,14 +363,15 @@
IOMap *m;
Rdwrfn *fn;
+ port = offset;
+ end = port+n;
 	switch((ulong)c->qid.path){case Qdir:
return devdirread(c, a, n, archdir, narchdir, devgen);
case Qiob:
- port = offset;
- checkport(offset, offset+n);
- for(p = a; port < offset+n; port++)
+ checkport(port, end);
+ for(p = a; port < end; port++)
*p++ = inb(port);
return n;
@@ -376,9 +378,8 @@
case Qiow:
if(n & 1)
error(Ebadarg);
- checkport(offset, offset+n);
- sp = a;
- for(port = offset; port < offset+n; port += 2)
+ checkport(port, end);
+ for(sp = a; port < end; port += 2)
*sp++ = ins(port);
return n;
@@ -385,9 +386,8 @@
case Qiol:
if(n & 3)
error(Ebadarg);
- checkport(offset, offset+n);
- lp = a;
- for(port = offset; port < offset+n; port += 4)
+ checkport(port, end);
+ for(lp = a; port < end; port += 4)
*lp++ = inl(port);
return n;
@@ -394,8 +394,8 @@
case Qmsr:
if(n & 7)
error(Ebadarg);
- vp = a;
- for(port = offset; port < offset+n; port += 8)
+ end = port+(n/8);
+ for(vp = a; port < end; port++)
if(rdmsr(port, vp++) < 0)
error(Ebadarg);
return n;
@@ -404,7 +404,8 @@
lock(&iomap);
i = 0;
 		for(m = iomap.m; m != nil; m = m->next){- i = snprint(buf, sizeof(buf), "%8lux %8lux %-12.12s\n", m->start, m->end-1, m->tag);
+ i = snprint(buf, sizeof(buf), "%8lux %8lux %-12.12s\n",
+ m->start, m->end-1, m->tag);
offset -= i;
if(offset < 0)
break;
@@ -429,18 +430,19 @@
static long
archwrite(Chan *c, void *a, long n, vlong offset)
 {+ uint port, end;
char *p;
- int port;
ushort *sp;
ulong *lp;
vlong *vp;
Rdwrfn *fn;
+ port = offset;
+ end = port+n;
 	switch((ulong)c->qid.path){case Qiob:
- p = a;
- checkport(offset, offset+n);
- for(port = offset; port < offset+n; port++)
+ checkport(port, end);
+ for(p = a; port < end; port++)
outb(port, *p++);
return n;
@@ -447,9 +449,8 @@
case Qiow:
if(n & 1)
error(Ebadarg);
- checkport(offset, offset+n);
- sp = a;
- for(port = offset; port < offset+n; port += 2)
+ checkport(port, end);
+ for(sp = a; port < end; port += 2)
outs(port, *sp++);
return n;
@@ -456,9 +457,8 @@
case Qiol:
if(n & 3)
error(Ebadarg);
- checkport(offset, offset+n);
- lp = a;
- for(port = offset; port < offset+n; port += 4)
+ checkport(port, end);
+ for(lp = a; port < end; port += 4)
outl(port, *lp++);
return n;
@@ -465,8 +465,8 @@
case Qmsr:
if(n & 7)
error(Ebadarg);
- vp = a;
- for(port = offset; port < offset+n; port += 8)
+ end = port+(n/8);
+ for(vp = a; port < end; port++)
if(wrmsr(port, *vp++) < 0)
error(Ebadarg);
return n;
--
⑨