git: 9front

Download patch

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;
--