Module Name:    src
Committed By:   matt
Date:           Tue May 26 02:16:38 UTC 2015

Modified Files:
        src/sys/arch/mips/include: mcontext.h

Log Message:
Change _lwp_getprivate_fast to use a syscall instead of rdhwr since rdhwr
emulation is problematic for the CN50xx.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/mips/include/mcontext.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/include/mcontext.h
diff -u src/sys/arch/mips/include/mcontext.h:1.20 src/sys/arch/mips/include/mcontext.h:1.21
--- src/sys/arch/mips/include/mcontext.h:1.20	Wed Sep 12 15:09:49 2012
+++ src/sys/arch/mips/include/mcontext.h	Tue May 26 02:16:38 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcontext.h,v 1.20 2012/09/12 15:09:49 matt Exp $	*/
+/*	$NetBSD: mcontext.h,v 1.21 2015/05/26 02:16:38 matt Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2002 The NetBSD Foundation, Inc.
@@ -203,17 +203,25 @@ __lwp_gettcb_fast(void)
 	/*
 	 * Only emit a rdhwr $3, $29 so the kernel can quickly emulate it.
 	 */
-	__asm __volatile(".set push; .set mips32r2; "
-		"rdhwr $3,$29; .set pop;"
-#ifdef __mips_o32
-		"addiu %[__tcb],$3,%1"
+	__asm __volatile(
+#if 1
+		// For some reason the syscall is much faster than
+		// emulating rdhwr $3,$29 on a CN50xx
+		"addiu $2,$0,316; syscall; nop; move %[__tcb],$2"
 #else
-		"daddiu %[__tcb],$3,%1"
+		".set push"   
+		";.set mips32r2"
+		";.p2align 4"
+		";ssnop"
+		";rdhwr $3,$29"
+		";ssnop"
+		";move %0,$3"
+		";.set pop"     
 #endif
 	    : [__tcb]"=r"(__tcb)
-	    : [__offset]"n"(-(TLS_TP_OFFSET + sizeof(*__tcb)))
-	    : "v1");
-	return __tcb;
+	    :
+	    : "v0", "v1", "a3");
+	return __tcb - (TLS_TP_OFFSET / sizeof(*__tcb) + 1);
 }
 
 void _lwp_setprivate(void *);

Reply via email to