diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-31 16:48:33 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-31 16:48:33 +0200 |
commit | e91301a40108d39125eacb40c42d290c028914e7 (patch) | |
tree | 5ac56c44291c6007b9cb8998f288ae276b056214 /sys/src | |
parent | a7ed529d97c42300881af7fd5b4095a6061cd5f3 (diff) |
rdmsr/wrmsr become tryrdmsr/trywrmsr, we can should check for trap
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/pc/cputemp.c | 16 | ||||
-rw-r--r-- | sys/src/9/pc/devarch.c | 4 | ||||
-rw-r--r-- | sys/src/9/pc/fns.h | 6 | ||||
-rw-r--r-- | sys/src/9/pc/l.s | 23 | ||||
-rw-r--r-- | sys/src/9/pc/trap.c | 6 |
5 files changed, 21 insertions, 34 deletions
diff --git a/sys/src/9/pc/cputemp.c b/sys/src/9/pc/cputemp.c index 4cbf620c7..61b939f3f 100644 --- a/sys/src/9/pc/cputemp.c +++ b/sys/src/9/pc/cputemp.c @@ -29,7 +29,7 @@ cputemprd0(Chan*, void *a, long n, vlong offset) cpuid(6, regs); if((regs[0] & 1) == 0) - return readstr(offset, a, n, "-1±-1 unsupported\n"); + goto unsup; if(tj == 0){ /* * magic undocumented msr. tj(max) is 100 or 85. @@ -38,13 +38,15 @@ cputemprd0(Chan*, void *a, long n, vlong offset) d = X86MODEL(m->cpuidax); d |= (m->cpuidax>>12) & 0xf0; if((d == 0xf && (m->cpuidax & 0xf)>1) || d == 0xe){ - rdmsr(0xee, &emsr); - msr = emsr; - if(msr & 1<<30) - tj = 85; + if(rdmsr(0xee, &emsr) == 0){ + msr = emsr; + if(msr & 1<<30) + tj = 85; + } } } - rdmsr(0x19c, &emsr); + if(rdmsr(0x19c, &emsr) < 0) + goto unsup; msr = emsr; t = -1; if(msr & 1<<31){ @@ -57,6 +59,8 @@ cputemprd0(Chan*, void *a, long n, vlong offset) s = " alarm"; snprint(buf, sizeof buf, "%ld±%uld%s\n", t, res, s); return readstr(offset, a, n, buf); +unsup: + return readstr(offset, a, n, "-1±-1 unsupported\n"); } static long diff --git a/sys/src/9/pc/devarch.c b/sys/src/9/pc/devarch.c index fc407fa6a..47e4a754f 100644 --- a/sys/src/9/pc/devarch.c +++ b/sys/src/9/pc/devarch.c @@ -397,7 +397,7 @@ archread(Chan *c, void *a, long n, vlong offset) error(Ebadarg); vp = a; for(port = offset; port < offset+n; port += 8) - if(tryrdmsr(port, vp++) < 0) + if(rdmsr(port, vp++) < 0) error(Ebadarg); return n; @@ -476,7 +476,7 @@ archwrite(Chan *c, void *a, long n, vlong offset) error(Ebadarg); vp = a; for(port = offset; port < offset+n; port += 8) - if(trywrmsr(port, *vp++) < 0) + if(wrmsr(port, *vp++) < 0) error(Ebadarg); return n; diff --git a/sys/src/9/pc/fns.h b/sys/src/9/pc/fns.h index 040c4b066..e9e899f03 100644 --- a/sys/src/9/pc/fns.h +++ b/sys/src/9/pc/fns.h @@ -154,7 +154,7 @@ void putcr0(ulong); void putcr3(ulong); void putcr4(ulong); void* rampage(void); -void rdmsr(int, vlong*); +int rdmsr(int, vlong*); void realmode(Ureg*); void screeninit(void); void (*screenputs)(char*, int); @@ -169,8 +169,6 @@ void trapenable(int, void (*)(Ureg*, void*), void*, char*); void trapinit(void); void trapinit0(void); int tas(void*); -int tryrdmsr(int, vlong*); -int trywrmsr(int, vlong); uvlong tscticks(uvlong*); ulong umbmalloc(ulong, int, int); void umbfree(ulong, int); @@ -184,7 +182,7 @@ void* vmap(ulong, int); int vmapsync(ulong); void vunmap(void*, int); void wbinvd(void); -void wrmsr(int, vlong); +int wrmsr(int, vlong); int xchgw(ushort*, int); #define userureg(ur) (((ur)->cs & 3) == 3) diff --git a/sys/src/9/pc/l.s b/sys/src/9/pc/l.s index 83e6e91a3..61394e6fb 100644 --- a/sys/src/9/pc/l.s +++ b/sys/src/9/pc/l.s @@ -538,39 +538,24 @@ TEXT lcycles(SB),1,$0 RET TEXT rdmsr(SB), $0 /* model-specific register */ - MOVL index+0(FP), CX - RDMSR - MOVL vlong+4(FP), CX /* &vlong */ - MOVL AX, 0(CX) /* lo */ - MOVL DX, 4(CX) /* hi */ - RET - -TEXT tryrdmsr(SB), $0 /* model-specific register */ MOVL $0, BP MOVL index+0(FP), CX -TEXT _tryrdmsrinst(SB), $0 +TEXT _rdmsrinst(SB), $0 RDMSR MOVL vlong+4(FP), CX /* &vlong */ MOVL AX, 0(CX) /* lo */ MOVL DX, 4(CX) /* hi */ - MOVL BP, AX + MOVL BP, AX /* BP set to -1 if traped */ RET TEXT wrmsr(SB), $0 - MOVL index+0(FP), CX - MOVL lo+4(FP), AX - MOVL hi+8(FP), DX - WRMSR - RET - -TEXT trywrmsr(SB), $0 MOVL $0, BP MOVL index+0(FP), CX MOVL lo+4(FP), AX MOVL hi+8(FP), DX -TEXT _trywrmsrinst(SB), $0 +TEXT _wrmsrinst(SB), $0 WRMSR - MOVL BP, AX + MOVL BP, AX /* BP set to -1 if traped */ RET /* diff --git a/sys/src/9/pc/trap.c b/sys/src/9/pc/trap.c index c433a0365..0593784fb 100644 --- a/sys/src/9/pc/trap.c +++ b/sys/src/9/pc/trap.c @@ -436,8 +436,8 @@ trap(Ureg* ureg) extern void _forkretpopes(void); extern void _forkretpopds(void); extern void _forkretiret(void); - extern void _tryrdmsrinst(void); - extern void _trywrmsrinst(void); + extern void _rdmsrinst(void); + extern void _wrmsrinst(void); extern void load_fs(ulong); extern void load_gs(ulong); @@ -460,7 +460,7 @@ trap(Ureg* ureg) sp[4] = UDSEL; /* SS */ return; } - } else if(pc == _tryrdmsrinst || pc == _trywrmsrinst){ + } else if(pc == _rdmsrinst || pc == _wrmsrinst){ if(vno == VectorGPF){ ureg->bp = -1; ureg->pc += 2; |