summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-08-31 16:48:33 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-08-31 16:48:33 +0200
commite91301a40108d39125eacb40c42d290c028914e7 (patch)
tree5ac56c44291c6007b9cb8998f288ae276b056214 /sys/src
parenta7ed529d97c42300881af7fd5b4095a6061cd5f3 (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.c16
-rw-r--r--sys/src/9/pc/devarch.c4
-rw-r--r--sys/src/9/pc/fns.h6
-rw-r--r--sys/src/9/pc/l.s23
-rw-r--r--sys/src/9/pc/trap.c6
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;