ref: 53b574197884cf8c7a92fa451750add1a9fea333
parent: 4cb5b46013453b44ca8410a59ab8cd923bc2ff06
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Fri Aug 31 12:48:33 EDT 2012
rdmsr/wrmsr become tryrdmsr/trywrmsr, we can should check for trap
--- a/sys/src/9/pc/cputemp.c
+++ b/sys/src/9/pc/cputemp.c
@@ -29,7 +29,7 @@
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 @@
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 @@
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
--- a/sys/src/9/pc/devarch.c
+++ b/sys/src/9/pc/devarch.c
@@ -397,7 +397,7 @@
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 @@
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;
--- a/sys/src/9/pc/fns.h
+++ b/sys/src/9/pc/fns.h
@@ -154,7 +154,7 @@
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 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 @@
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)
--- a/sys/src/9/pc/l.s
+++ b/sys/src/9/pc/l.s
@@ -538,39 +538,24 @@
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
/*
--- a/sys/src/9/pc/trap.c
+++ b/sys/src/9/pc/trap.c
@@ -436,8 +436,8 @@
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 @@
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;
--
⑨