summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>2000-12-10 15:23:12 +0000
committerwtc%netscape.com <devnull@localhost>2000-12-10 15:23:12 +0000
commitf2fb1d7f9a0e28d401cbf8da7800ab6cf05816d6 (patch)
treea6923dbf5c958df4cc3eb30e6052462ef3efe8c4
parent5dcf6dffd6cd1aaaaaae43bdec1a4ef308dc1c31 (diff)
downloadnspr-hg-f2fb1d7f9a0e28d401cbf8da7800ab6cf05816d6.tar.gz
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)
-rw-r--r--pr/include/md/_netbsd.h105
1 files changed, 77 insertions, 28 deletions
diff --git a/pr/include/md/_netbsd.h b/pr/include/md/_netbsd.h
index 0d076db8..8edc6ab9 100644
--- a/pr/include/md/_netbsd.h
+++ b/pr/include/md/_netbsd.h
@@ -71,40 +71,89 @@
#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
+** Initialize a thread context to run "_main()" when started
+*/
+#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
-#else
-#error "Need to define SP index in jmp_buf here"
+#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 _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); \
-}
-
#define _MD_SWITCH_CONTEXT(_thread) \
if (!sigsetjmp(CONTEXT(_thread), 1)) { \
(_thread)->md.errcode = errno; \