diff options
author | aiju <devnull@localhost> | 2011-04-15 20:29:46 +0200 |
---|---|---|
committer | aiju <devnull@localhost> | 2011-04-15 20:29:46 +0200 |
commit | 68d6b0808bbd57a91abf2a5ac4571e4372a8d3fc (patch) | |
tree | 4b0b6214de9c0e70fc26d09264c41557f1f23510 /sys/src/9/pc/devarch.c | |
parent | a95f7282410ebfa4e2a4ff816e8486e7e0f8284a (diff) |
added geode driver
Diffstat (limited to 'sys/src/9/pc/devarch.c')
-rw-r--r-- | sys/src/9/pc/devarch.c | 20 |
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); |