summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgordon%netscape.com <devnull@localhost>1999-05-11 05:33:51 +0000
committergordon%netscape.com <devnull@localhost>1999-05-11 05:33:51 +0000
commit8a670f2cb00c3882aea25709987e0c5934025b12 (patch)
tree0b5a0f52c1d911cacf5b2667e58f6f832452feb2
parent29fc2ed6654c7e23bc69b49a385b1a34515c3ebf (diff)
downloadnspr-hg-8a670f2cb00c3882aea25709987e0c5934025b12.tar.gz
Fix for bug#4312. Conditionalized patching of StackSpace so it's only done when patching is allowed. Also removed obsolete 68k code, and replaced uses of the BUILD_ROUTINE_DESCRIPTOR macro with calls to NewRoutineDescriptor.
-rw-r--r--pr/src/md/mac/macthr.c79
-rw-r--r--pr/src/md/mac/mdmac.c47
2 files changed, 46 insertions, 80 deletions
diff --git a/pr/src/md/mac/macthr.c b/pr/src/md/mac/macthr.c
index 22aef032..b760bfb3 100644
--- a/pr/src/md/mac/macthr.c
+++ b/pr/src/md/mac/macthr.c
@@ -24,13 +24,9 @@
#include <LowMem.h>
-// This should be in LowMem.h
-#ifndef LMSetStackLowPoint
-#define LMSetStackLowPoint(value) \
- *((UInt32 *)(0x110)) = (value)
-#endif
-PRThread *gPrimaryThread = NULL;
+TimerUPP gTimerCallbackUPP = NULL;
+PRThread * gPrimaryThread = NULL;
PR_IMPLEMENT(PRThread *) PR_GetPrimaryThread()
{
@@ -111,16 +107,7 @@ void _MD_InitStack(PRThreadStack *ts, int redZoneBytes)
((UInt32 *)ts->stackBottom)[0] = 0xCAFEBEEF;
#else
#pragma unused (ts)
-#endif
-
- /*
- ** Turn off the snack stiffer. The NSPR stacks are allocated in the
- ** application's heap; this throws the stack sniffer for a tizzy.
- ** Note that the sniffer does not run on machines running the thread manager.
- ** Yes, we will blast the low-mem every time a new stack is created. We can afford
- ** a couple extra cycles.
- */
- LMSetStackLowPoint(0);
+#endif
}
extern void _MD_ClearStack(PRThreadStack *ts)
@@ -176,71 +163,17 @@ pascal void TimerCallback(TMTaskPtr tmTaskPtr)
PrimeTime((QElemPtr)tmTaskPtr, kMacTimerInMiliSecs);
}
-#if GENERATINGCFM
-
-RoutineDescriptor gTimerCallbackRD = BUILD_ROUTINE_DESCRIPTOR(uppTimerProcInfo, &TimerCallback);
-
-#else
-
-asm void gTimerCallbackRD(void)
-{
- // Check out LocalA5. If it is zero, then
- // it is our first time through, and we should
- // store away our A5. If not, then we are
- // a real time manager callback, so we should
- // store away A5, set up our local a5, jsr
- // to our callback, and then restore the
- // previous A5.
-
- lea LocalA5, a0
- move.l (a0), d0
- cmpi.l #0, d0
- bne TimerProc
-
- move.l a5, (a0)
- rts
-
-TimerProc:
-
- // Save A5, restore our local A5
-
- move.l a5, -(sp)
- move.l d0, a5
-
- // Jump to our C routine
-
- move.l a1, -(sp)
- jsr TimerCallback
-
- // Restore the previous A5
-
- move.l (sp)+, a5
-
- rts
-
-LocalA5:
-
- dc.l 0
-
-}
-
-#endif
void _MD_StartInterrupts(void)
{
gPrimaryThread = _PR_MD_CURRENT_THREAD();
- // If we are not generating CFM-happy code, then make sure that
- // we call our callback wrapper once so that we can
- // save away our A5.
-
-#if !GENERATINGCFM
- gTimerCallbackRD();
-#endif
+ if ( !gTimerCallbackUPP )
+ gTimerCallbackUPP = NewTimerProc(TimerCallback);
// Fill in the Time Manager queue element
- gTimeManagerTaskElem.tmAddr = (TimerUPP)&gTimerCallbackRD;
+ gTimeManagerTaskElem.tmAddr = (TimerUPP)gTimerCallbackUPP;
gTimeManagerTaskElem.tmCount = 0;
gTimeManagerTaskElem.tmWakeUp = 0;
gTimeManagerTaskElem.tmReserved = 0;
diff --git a/pr/src/md/mac/mdmac.c b/pr/src/md/mac/mdmac.c
index 52233a4a..2106f767 100644
--- a/pr/src/md/mac/mdmac.c
+++ b/pr/src/md/mac/mdmac.c
@@ -21,6 +21,7 @@
#include <Files.h>
#include <Errors.h>
#include <Folders.h>
+#include <Gestalt.h>
#include <Events.h>
#include <Processes.h>
#include <TextUtils.h>
@@ -65,8 +66,11 @@ extern PRThread *gPrimaryThread;
UniversalProcPtr gStackSpacePatchCallThru = NULL;
pascal long StackSpacePatch(UInt16);
-RoutineDescriptor StackSpacePatchRD = BUILD_ROUTINE_DESCRIPTOR(uppStackSpaceProcInfo, &StackSpacePatch);
+typedef CALLBACK_API( long , StackSpacePatchPtr )(UInt16 trapNo);
+typedef REGISTER_UPP_TYPE(StackSpacePatchPtr) StackSpacePatchUPP;
+#define NewStackSpaceProc(userRoutine) (StackSpacePatchUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppStackSpaceProcInfo, GetCurrentArchitecture())
+StackSpacePatchUPP gStackSpacePatchUPP = NULL;
//##############################################################################
//##############################################################################
@@ -208,8 +212,9 @@ void _MD_GetRegisters(PRUint32 *to)
void _MD_EarlyInit()
{
- Handle environmentVariables;
-
+ Handle environmentVariables;
+ long systemVersion;
+ OSErr err;
#if !defined(MAC_NSPR_STANDALONE)
// MacintoshInitializeMemory(); Moved to mdmacmem.c: AllocateRawMemory(Size blockSize)
@@ -251,11 +256,39 @@ void _MD_EarlyInit()
_MD_PutEnv ("NSPR_LOG_MODULES=clock:6,cmon:6,io:6,mon:6,linker:6,cvar:6,sched:6,thread:6");
#endif
- gStackSpacePatchCallThru = GetOSTrapAddress(0x0065);
- SetOSTrapAddress((UniversalProcPtr)&StackSpacePatchRD, 0x0065);
+ err = Gestalt(gestaltSystemVersion,&systemVersion);
+ if (systemVersion < 0x00000A00) // we still need to patch StackSpace()
{
- long foo;
- foo = StackSpace();
+ CFragConnectionID connID;
+ Str255 errMessage;
+ Ptr interfaceLibAddr;
+ CFragSymbolClass symClass;
+ UniversalProcPtr (*getOSTrapAddressProc)(UInt16);
+ void (*setOSTrapAddressProc)(UniversalProcPtr, UInt16);
+
+ // open connection to "InterfaceLib"
+ err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag,
+ &connID, &interfaceLibAddr, errMessage);
+ PR_ASSERT(err == noErr);
+
+ // get symbol GetOSTrapAddress and get trap address for StackSpace (A065)
+ err = FindSymbol(connID, "\pGetOSTrapAddress", &(Ptr)getOSTrapAddressProc, &symClass);
+ PR_ASSERT(err == noErr);
+ PR_ASSERT(symClass == kTVectorCFragSymbol);
+ if (err == noErr)
+ {
+ gStackSpacePatchCallThru = getOSTrapAddressProc(0x0065);
+ }
+
+ // get symbol SetOSTrapAddress and set trap address for _StackSpace (A065)
+ err = FindSymbol(connID, "\pSetOSTrapAddress", &(Ptr)setOSTrapAddressProc, &symClass);
+ PR_ASSERT(err == noErr);
+ PR_ASSERT(symClass == kTVectorCFragSymbol);
+ if (err == noErr && gStackSpacePatchCallThru)
+ {
+ gStackSpacePatchUPP = NewStackSpaceProc(StackSpacePatch);
+ setOSTrapAddressProc(gStackSpacePatchUPP, 0x0065);
+ }
}
}