Index: mem.c =================================================================== RCS file: /src/cvs/cvsroot/netbsd/src/sys/arch/i386/i386/mem.c,v retrieving revision 1.69 diff -a -c -3 -r1.69 mem.c *** mem.c 4 Mar 2007 05:59:57 -0000 1.69 --- mem.c 19 Feb 2008 18:31:14 -0000 *************** *** 93,101 **** --- 93,103 ---- #include #include + #include #include + #define DEV_MSR 13 /* XXX: /dev/cpu/msr */ #define DEV_IO 14 /* iopl for compat_10 */ extern char *vmmap; /* poor name! */ *************** *** 224,229 **** --- 226,259 ---- error = uiomove(zeropage, c, uio); break; + #ifdef DEV_MSR + case DEV_MSR: + { + union msrinfo { + uint64_t msr; + uint32_t regs[2]; + } msrinfo; + + o = uio->uio_offset; + c = min(iov->iov_len, sizeof(msrinfo)); + + if (uio->uio_rw == UIO_WRITE) { + if (c != sizeof(msrinfo)) { + error = EINVAL; + break; + } + error = uiomove(&msrinfo, c, uio); + if (error) + break; + wrmsr(o, msrinfo.msr); + } else { + msrinfo.msr = rdmsr(o); + error = uiomove(&msrinfo.msr, c, uio); + } + } + break; + #endif /* DEV_MSR */ + default: return (ENXIO); }