summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/devarch.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2011-04-15 20:29:46 +0200
committeraiju <devnull@localhost>2011-04-15 20:29:46 +0200
commit68d6b0808bbd57a91abf2a5ac4571e4372a8d3fc (patch)
tree4b0b6214de9c0e70fc26d09264c41557f1f23510 /sys/src/9/pc/devarch.c
parenta95f7282410ebfa4e2a4ff816e8486e7e0f8284a (diff)
added geode driver
Diffstat (limited to 'sys/src/9/pc/devarch.c')
-rw-r--r--sys/src/9/pc/devarch.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/sys/src/9/pc/devarch.c b/sys/src/9/pc/devarch.c
index bd216c2ad..3228736ee 100644
--- a/sys/src/9/pc/devarch.c
+++ b/sys/src/9/pc/devarch.c
@@ -33,6 +33,7 @@ enum {
Qiob,
Qiow,
Qiol,
+ Qmsr,
Qbase,
Qmax = 16,
@@ -55,6 +56,7 @@ static Dirtab archdir[Qmax] = {
"iob", { Qiob, 0 }, 0, 0660,
"iow", { Qiow, 0 }, 0, 0660,
"iol", { Qiol, 0 }, 0, 0660,
+ "msr", { Qmsr, 0}, 0, 0660,
};
Lock archwlock; /* the lock is only for changing archdir */
int narchdir = Qbase;
@@ -356,6 +358,7 @@ archread(Chan *c, void *a, long n, vlong offset)
int port;
ushort *sp;
ulong *lp;
+ vlong *vp;
IOMap *m;
Rdwrfn *fn;
@@ -389,6 +392,14 @@ archread(Chan *c, void *a, long n, vlong offset)
*lp++ = inl(port);
return n;
+ case Qmsr:
+ if(n & 7)
+ error(Ebadarg);
+ vp = a;
+ for(port = offset; port < offset+n; port += 8)
+ rdmsr(port, vp++);
+ return n;
+
case Qioalloc:
break;
@@ -429,6 +440,7 @@ archwrite(Chan *c, void *a, long n, vlong offset)
int port;
ushort *sp;
ulong *lp;
+ vlong *vp;
Rdwrfn *fn;
switch((ulong)c->qid.path){
@@ -458,6 +470,14 @@ archwrite(Chan *c, void *a, long n, vlong offset)
outl(port, *lp++);
return n;
+ case Qmsr:
+ if(n & 7)
+ error(Ebadarg);
+ vp = a;
+ for(port = offset; port < offset+n; port += 8)
+ wrmsr(port, *vp++);
+ return n;
+
default:
if(c->qid.path < narchdir && (fn = writefn[c->qid.path]))
return fn(c, a, n, offset);