summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgordon%netscape.com <devnull@localhost>1999-05-21 20:08:09 +0000
committergordon%netscape.com <devnull@localhost>1999-05-21 20:08:09 +0000
commitdac0376d4953cc4cd99933e33192de9cd1ec426d (patch)
treecbc786915431cd308cb78e67bc9f8ec1ae74131e
parent830bd2f50caac8305585e69a4684e48315894f3a (diff)
downloadnspr-hg-dac0376d4953cc4cd99933e33192de9cd1ec426d.tar.gz
Fix for bug#4312. Conditionalized patching of StackSpace so it's only done when patching is allowed. Use FindSymbol to dynamically lookup NewRoutineDescriptor and CallOSTrapUniversalProc so we can link against CarbonLib.SeaMonkey_M6_BASE
-rw-r--r--pr/src/md/mac/mdmac.c132
1 files changed, 76 insertions, 56 deletions
diff --git a/pr/src/md/mac/mdmac.c b/pr/src/md/mac/mdmac.c
index 2106f767..5dd07662 100644
--- a/pr/src/md/mac/mdmac.c
+++ b/pr/src/md/mac/mdmac.c
@@ -41,16 +41,6 @@
#include "prgc.h"
-
-enum {
- uppExitToShellProcInfo = kPascalStackBased,
- uppStackSpaceProcInfo = kRegisterBased
- | RESULT_SIZE(SIZE_CODE(sizeof(long)))
- | REGISTER_RESULT_LOCATION(kRegisterD0)
- | REGISTER_ROUTINE_PARAMETER(1, kRegisterD1, SIZE_CODE(sizeof(UInt16)))
-};
-
-
#define UNIMPLEMENTED_ROUTINE \
DebugStr("\pNot Implemented Yet"); \
return 0;
@@ -64,13 +54,6 @@ unsigned char GarbageCollectorCacheFlusher(PRUint32 size);
extern PRThread *gPrimaryThread;
-UniversalProcPtr gStackSpacePatchCallThru = NULL;
-pascal long StackSpacePatch(UInt16);
-
-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;
//##############################################################################
//##############################################################################
@@ -78,6 +61,21 @@ StackSpacePatchUPP gStackSpacePatchUPP = NULL;
#pragma mark CREATING MACINTOSH THREAD STACKS
+enum {
+ uppExitToShellProcInfo = kPascalStackBased,
+ uppStackSpaceProcInfo = kRegisterBased
+ | RESULT_SIZE(SIZE_CODE(sizeof(long)))
+ | REGISTER_RESULT_LOCATION(kRegisterD0)
+ | REGISTER_ROUTINE_PARAMETER(1, kRegisterD1, SIZE_CODE(sizeof(UInt16)))
+};
+
+typedef CALLBACK_API( long , StackSpacePatchPtr )(UInt16 trapNo);
+typedef REGISTER_UPP_TYPE(StackSpacePatchPtr) StackSpacePatchUPP;
+
+StackSpacePatchUPP gStackSpacePatchUPP = NULL;
+UniversalProcPtr gStackSpacePatchCallThru = NULL;
+long (*gCallOSTrapUniversalProc)(UniversalProcPtr,ProcInfoType,...) = NULL;
+
pascal long StackSpacePatch(UInt16 trapNo)
{
@@ -92,7 +90,7 @@ pascal long StackSpacePatch(UInt16 trapNo)
if ((thisThread == gPrimaryThread) ||
(&tos < thisThread->stack->stackBottom) ||
(&tos > thisThread->stack->stackTop)) {
- return CallOSTrapUniversalProc(gStackSpacePatchCallThru, uppStackSpaceProcInfo, trapNo);
+ return gCallOSTrapUniversalProc(gStackSpacePatchCallThru, uppStackSpaceProcInfo, trapNo);
}
else {
return &tos - thisThread->stack->stackBottom;
@@ -100,6 +98,65 @@ pascal long StackSpacePatch(UInt16 trapNo)
}
+static void InstallStackSpacePatch(void)
+{
+ long systemVersion;
+ OSErr err;
+ CFragConnectionID connID;
+ Str255 errMessage;
+ Ptr interfaceLibAddr;
+ CFragSymbolClass symClass;
+ UniversalProcPtr (*getOSTrapAddressProc)(UInt16);
+ void (*setOSTrapAddressProc)(UniversalProcPtr, UInt16);
+ UniversalProcPtr (*newRoutineDescriptorProc)(ProcPtr,ProcInfoType,ISAType);
+
+
+ err = Gestalt(gestaltSystemVersion,&systemVersion);
+ if (systemVersion >= 0x00000A00) // we don't need to patch StackSpace()
+ return;
+
+ // open connection to "InterfaceLib"
+ err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag,
+ &connID, &interfaceLibAddr, errMessage);
+ PR_ASSERT(err == noErr);
+ if (err != noErr)
+ return;
+
+ // get symbol GetOSTrapAddress
+ err = FindSymbol(connID, "\pGetOSTrapAddress", &(Ptr)getOSTrapAddressProc, &symClass);
+ if (err != noErr)
+ return;
+
+ // get symbol SetOSTrapAddress
+ err = FindSymbol(connID, "\pSetOSTrapAddress", &(Ptr)setOSTrapAddressProc, &symClass);
+ if (err != noErr)
+ return;
+
+ // get symbol NewRoutineDescriptor
+ err = FindSymbol(connID, "\pNewRoutineDescriptor", &(Ptr)newRoutineDescriptorProc, &symClass);
+ if (err != noErr)
+ return;
+
+ // get symbol CallOSTrapUniversalProc
+ err = FindSymbol(connID, "\pCallOSTrapUniversalProc", &(Ptr)gCallOSTrapUniversalProc, &symClass);
+ if (err != noErr)
+ return;
+
+ // get and set trap address for StackSpace (A065)
+ gStackSpacePatchCallThru = getOSTrapAddressProc(0x0065);
+ if (gStackSpacePatchCallThru)
+ {
+ gStackSpacePatchUPP =
+ (StackSpacePatchUPP)newRoutineDescriptorProc((ProcPtr)(StackSpacePatch), uppStackSpaceProcInfo, GetCurrentArchitecture());
+ setOSTrapAddressProc(gStackSpacePatchUPP, 0x0065);
+ }
+
+#if DEBUG
+ StackSpace();
+#endif
+}
+
+
//##############################################################################
//##############################################################################
#pragma mark -
@@ -213,8 +270,6 @@ void _MD_GetRegisters(PRUint32 *to)
void _MD_EarlyInit()
{
Handle environmentVariables;
- long systemVersion;
- OSErr err;
#if !defined(MAC_NSPR_STANDALONE)
// MacintoshInitializeMemory(); Moved to mdmacmem.c: AllocateRawMemory(Size blockSize)
@@ -256,40 +311,7 @@ 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
- err = Gestalt(gestaltSystemVersion,&systemVersion);
- if (systemVersion < 0x00000A00) // we still need to patch 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);
- }
- }
+ InstallStackSpacePatch();
}
void _MD_FinalInit()
@@ -435,9 +457,7 @@ char *strdup(const char *source)
char *newAllocation;
size_t stringLength;
-#ifdef DEBUG
PR_ASSERT(source);
-#endif
stringLength = strlen(source) + 1;