Bugzilla bug #61746: make NSPR local threads work on more NetBSD platforms. NSPRPUB_CLIENT_BRANCH
authorwtc%netscape.com
Sun, 10 Dec 2000 15:23:12 +0000
branchNSPRPUB_CLIENT_BRANCH
changeset 1632 8691b82dbca0ed948a6fe529424834ef4962e2d7
parent 1629 577245322ec9b2f2fefac4d7295eb6436afd69b6
child 1633 ce00878b24f946972a96605f7c13e0d1d39a25ef
child 1648 23acc3c668c42adcf2a84f07ed56e9d886e32557
push idunknown
push userunknown
push dateunknown
bugs61746
Bugzilla bug #61746: make NSPR local threads work on more NetBSD platforms. Thanks to Charles Hannum <mycroft@netbsd.org> for the patch. r=wtc. (NSPRPUB_CLIENT_BRANCH)
pr/include/md/_netbsd.h
--- a/pr/include/md/_netbsd.h
+++ b/pr/include/md/_netbsd.h
@@ -66,49 +66,98 @@
 
 #ifndef _PR_PTHREADS
 #include <setjmp.h>
 
 #define PR_CONTEXT_TYPE	sigjmp_buf
 
 #define CONTEXT(_th) ((_th)->md.context)
 
-#if defined(__i386__) || defined(__sparc__) || defined(__m68k__) || defined(__powerpc__)
-#define JB_SP_INDEX 2
-#elif defined(__mips__)
-#define JB_SP_INDEX 4
-#elif defined(__alpha__)
-#define JB_SP_INDEX 34
-#elif defined(__arm32__)
-/*
- * On the arm32, the jmpbuf regs underwent a name change after NetBSD 1.3.
- */
-#ifdef JMPBUF_REG_R13
-#define JB_SP_INDEX JMPBUF_REG_R13
-#else
-#define JB_SP_INDEX _JB_REG_R13
-#endif
-#else
-#error "Need to define SP index in jmp_buf here"
-#endif
-#define _MD_GET_SP(_th)    (_th)->md.context[JB_SP_INDEX]
-
-#define PR_NUM_GCREGS	_JBLEN
-
 /*
 ** Initialize a thread context to run "_main()" when started
 */
-#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)  \
-{  \
-    *status = PR_TRUE;  \
-    if (sigsetjmp(CONTEXT(_thread), 1)) {  \
-        _main();  \
-    }  \
-    _MD_GET_SP(_thread) = (unsigned char*) ((_sp) - 64); \
+#ifdef __i386__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)			\
+{									\
+    sigsetjmp(CONTEXT(_thread), 1);					\
+    CONTEXT(_thread)[2] = (unsigned char*) ((_sp) - 128);		\
+    CONTEXT(_thread)[0] = (int) _main;					\
+    *status = PR_TRUE;							\
+}
+#define	_MD_GET_SP(_thread)	CONTEXT(_thread)[2]
+#endif
+#ifdef __sparc__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)			\
+{									\
+    sigsetjmp(CONTEXT(_thread), 1);					\
+    CONTEXT(_thread)[2] = (unsigned char*) ((_sp) - 128);		\
+    CONTEXT(_thread)[3] = (int) _main;					\
+    CONTEXT(_thread)[4] = (int) _main + 4;				\
+    *status = PR_TRUE;							\
+}
+#define	_MD_GET_SP(_thread)	CONTEXT(_thread)[2]
+#endif
+#ifdef __powerpc__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)			\
+{									\
+    sigsetjmp(CONTEXT(_thread), 1);					\
+    CONTEXT(_thread)[3] = (unsigned char*) ((_sp) - 128);		\
+    CONTEXT(_thread)[4] = (int) _main;					\
+    *status = PR_TRUE;							\
+}
+#define	_MD_GET_SP(_thread)	CONTEXT(_thread)[3]
+#endif
+#ifdef __m68k__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)			\
+{									\
+    sigsetjmp(CONTEXT(_thread), 1);					\
+    CONTEXT(_thread)[2] = (unsigned char*) ((_sp) - 128);		\
+    CONTEXT(_thread)[5] = (int) _main;					\
+    *status = PR_TRUE;							\
 }
+#define	_MD_GET_SP(_thread)	CONTEXT(_thread)[2]
+#endif
+#ifdef __mips__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)			\
+{									\
+    sigsetjmp(CONTEXT(_thread), 1);					\
+    CONTEXT(_thread)[32] = (unsigned char*) ((_sp) - 128);		\
+    CONTEXT(_thread)[2] = (int) _main;					\
+    CONTEXT(_thread)[28] = (int) _main;					\
+    *status = PR_TRUE;							\
+}
+#define	_MD_GET_SP(_thread)	CONTEXT(_thread)[32]
+#endif
+#ifdef __arm32__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)			\
+{									\
+    sigsetjmp(CONTEXT(_thread), 1);					\
+    CONTEXT(_thread)[23] = (unsigned char*) ((_sp) - 128);		\
+    CONTEXT(_thread)[24] = (int) _main;					\
+    *status = PR_TRUE;							\
+}
+#define	_MD_GET_SP(_thread)	CONTEXT(_thread)[23]
+#endif
+#ifdef __alpha__
+#define _MD_INIT_CONTEXT(_thread, _sp, _main, status)			\
+{									\
+    sigsetjmp(CONTEXT(_thread), 1);					\
+    CONTEXT(_thread)[34] = (unsigned char*) ((_sp) - 128);		\
+    CONTEXT(_thread)[2] = (long) _main;					\
+    CONTEXT(_thread)[30] = (long) _main;				\
+    CONTEXT(_thread)[31] = (long) _main;				\
+    *status = PR_TRUE;							\
+}
+#define	_MD_GET_SP(_thread)	CONTEXT(_thread)[34]
+#endif
+#ifndef _MD_INIT_CONTEXT
+#error "Need to define _MD_INIT_CONTEXT for this platform"
+#endif
+
+#define PR_NUM_GCREGS	_JBLEN
 
 #define _MD_SWITCH_CONTEXT(_thread)  \
     if (!sigsetjmp(CONTEXT(_thread), 1)) {  \
         (_thread)->md.errcode = errno;  \
         _PR_Schedule();  \
     }
 
 /*