home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * @(#)utils.c 1.4 2/23/90
- */
-
- /* Copyright 1986 Eric Jul. May not be used for any purpose without */
- /* written permission from the author. */
- /* The Emerald kernel for the Emerald programming language. */
-
- /* This file contains the implementation of a number of utilities. */
- /* Most of these procedures take a reference to some data structure */
- /* and return a printable string. Most are for debugging and test */
- /* output (traces and snapshots). */
-
- #include <stdio.h>
-
- #include "Kernel/h/system.h"
- #include "Kernel/h/assert.h"
- #include "Kernel/h/emTypes.h"
- #include "Kernel/h/kmdTypes.h"
- #include "Kernel/h/mmMsgTypes.h"
- #include "Kernel/h/lmTypes.h"
- #include "Kernel/h/emkDefs.h"
- #include "Kernel/h/consts.h"
- #include "Kernel/h/kEvents.h"
-
- extern char *sbrk();
-
- extern ODP OTLookup();
- extern Boolean SSValidAddr();
- extern int etext;
-
- /* Forward */
- char *PPODBasicTag();
-
- char *BasicTagName[] = {
- "InvalidTag",
- "UnknownTag",
- "GODTag",
- "GODataTag",
- "SSODTag",
- "SSTag",
- "CodeODTag",
- "CodeTag",
- "LOTag",
- "ProcessODTag",
- "AbConTag",
- "CondTag",
- "DotoTag",
- "LastODBasicTag" /* Must be last tag AND have this name */
- };
-
- char *ParamInfoNames[] = {
- "Is not parameter",
- "Is argument",
- "Is result",
- "Is return-by-move result"
- };
-
- char *BrandNames[] = {
- "DataBrand",
- "ODPBrand",
- "AddrBrand",
- "VectorBrand",
- "VariableBrand",
- "MonitorLockBrand",
- "InvokeQueueBrand",
- "UnusedBrand"
- };
-
- char *ITagNames[] = {
- "INVALIDITAG", /* Must be the first tag */
-
- "InvokeITag",
- "ReplyITag",
- "RemoteLoadReqITag",
- "CodeTransferITag",
- "ParamTag",
- "ConfirmITag",
- "ShoutITag",
- "SearchITag",
- "ConfirmReplyITag",
- "ShoutReplyITag",
- "SearchReplyITag",
- "PingITag",
- "PongITag",
- "PingTimingITag",
- "PongTimingITag",
- "MoveITag",
- "MoveReplyITag",
-
- "TTFirstITag", /* Must be the first TT tag */
- "TTGODITag",
- "TTSSODITag",
- "TTCodeODITag",
- "TTAbConITag",
- "TTGODataITag",
- "TTLOITag",
- "TTROITag",
- "TTMoveGODITag",
- "TTMoveSSODITag",
- "TTMoveCITag",
- "TTFetchGODITag",
- "TTCodeAddrITag",
- "TTInvokeITag",
- "TTIncomingIITag",
- "TTCondITag",
- "TTMoveCondITag",
- "TTLastITag", /* Must be the last TT tag */
-
- "LastITag" /* Must be the very last tag AND have this name */
-
- };
-
- char *RTagNames[] = {
- "INVALID ZERO RTag!!",
- "InvokeRTag",
- "IncomingIRTag",
- "LocateRTag",
- "MoveRTag",
- "StackBreakRTag",
- "CompilerLoadRTag",
- "CodeLoadRTag",
- "CheatingLoadRTag",
- "InitiallyRTag",
- "ConformRTag",
- "ViewRTag",
- "IncomingMoveRTag",
- "OwnRTag",
- "CondWaitRTag",
- "MonWaitRTag",
- "TimedWaitRTag",
-
- "LastRTag" /* Must be last RTag */
- };
-
- char *SSRunStatusNames[] = {
- "NotInUse",
- "Allocated",
- "Runnable",
- "Condition Wait",
- "Monitor Entry Wait",
- "Req Wait",
- "Invoke Wait",
- "Timer Wait",
- "Initially Wait",
- "Move Wait",
- "Locate Wait",
- "Conform Wait",
- "Read IO Wait",
- "Write IO Wait",
- "Own Wait",
- "Broken & dead",
-
- "LastRunStatus" /* Must be last enum in SSRunStatus */
- };
-
- typedef struct BitDescription {
- unsigned int position;
- char *name;
- char *printableValue[2];
- } BitDescription;
-
- #define END_MARK 3333
-
- BitDescription bitD[] = {
- { ODTag_frozen, "frozen", {"", "FROZEN"}},
- { ODTag_global, "global", {"local", "global"}},
- { ODTag_replicated, "replicated", {"", "repl"}},
- { ODTag_isResident, "isResident", {"remote", "resident"}},
- { ODTag_setUpDone, "setUpDone", {"~init", "initOK"}},
- { ODTag_isFixed, "isFixed", {"", "Fxd"}},
- { ODTag_inTransit, "inTransit", {"", "transit"}},
- { ODTag_allInstancesAreLocal, "allInstancesAreLocal", {"", "allLocal"}},
- { ODTag_hasNoPointer, "hasNoPointer", {"", "noPtr"}},
- { ODTag_broken, "broken", {"", "BROKEN"}},
- { ODTag_gcDoNotCollect, "gcDoNotCollect", {"", "KEEP"}},
- { ODTag_gcMark1, "gcMark1", {"", "1"}},
- { ODTag_gcMark2, "gcMark2", {"", "2"}},
- { ODTag_gcFrozen, "gcFrozen", {"", "gcFz"}},
- { ODTag_localgcMark1, "localgcMark1", {"", "l1"}},
- { ODTag_localgcMark2, "localgcMark2", {"", "l2"}},
- { ODTag_xref, "xref", {"", "xref"}},
- { ODTag_dormant, "dormant", {"", "dormant"}},
- { ODTag_stopped, "stopped", {"", "stopped"}},
- { ODTag_seenHere, "seenHere", {"", "seenH"}},
- { END_MARK, "END_MARK", {"", ""}}
- };
-
- unsigned int validMask[32];
-
- /************************************************************************/
- /* PPValid */
- /************************************************************************/
- Boolean PPValidAddr(fAddr)
- SSAddr *fAddr;
- /* True iff fAddr is an address in the data area */
- {
- return (&etext < (int *) fAddr && (int *)fAddr < (int *) sbrk(0));
- }
-
- /************************************************************************/
- /* IPMapLookup */
- /************************************************************************/
- Offset IPMapLookup(fMap, fOffset)
- register IPMapPtr fMap;
- register Offset fOffset;
- /* Given a map and an offset, return the associated data item */
- /* The map must exist */
- {
- register IPMapEntryPtr entry;
- if ((fOffset > fMap->highestIPOffset)||(fOffset < fMap->lowestIPOffset)){
- return (Offset) 0;
- };
- entry = & fMap->mapEntries[0];
- while (fOffset > entry->highIPOffset) entry++;
- return entry->offset;
- }
-
- /************************************************************************/
- /* SSDownOne */
- /* Given a pointer to an activation record, return a pointer to the */
- /* caller activation record. */
- /************************************************************************/
- SSAddr SSDownOne(fL)
- SSAddr fL;
- {
- return mDynLinkPtrFromL(fL)->l;
- }
-
-
- /************************************************************************/
- /* PP procedures generate printable ASCII strings for stuff */
- /************************************************************************/
-
- /* Buffers are managed cyclically -- do not save the buf ptr for long! */
- #define NBUFS 20
- int next = 0;
- char buffers[NBUFS][300];
- char overrunarea[200]; /* In case the buffers area should overflow */
-
- char *getNextBuf()
- {
- return buffers[(++next >= NBUFS ? next = 0 : next)];
- }
-
- /************************************************************************/
- /* ValidSSPtr */
- /* Given a SSPtr, check it for validity */
- /************************************************************************/
- Boolean ValidSSPtr(fSSPtr)
- SSPtr fSSPtr;
- {
- if (!PPValidAddr((SSAddr *) fSSPtr)) return FALSE;
- if (fSSPtr->tag.tag != SSTag) return FALSE;
- if (fSSPtr->tag.otherstuff != OBSCUREVALUE) return FALSE;
- return TRUE;
- }
-
- /************************************************************************/
- /* SSValidAddr */
- /* Given a stack address and a stack pointer, validate the addr */
- /************************************************************************/
- Boolean SSValidAddr(fSSPtr, fAddr)
- SSPtr fSSPtr;
- SSAddr fAddr;
- /* SSValidAddr checks to see whether the given address is inside the stack
- segment. */
- {
- return ValidSSPtr(fSSPtr) &&
- ((fAddr >= fSSPtr->regs.sp) && (fAddr < fSSPtr->endOfSS));
- }
-
- /************************************************************************/
- /* SSHighAddr */
- /************************************************************************/
- SSAddr SSHighAddr(fSSPtr)
- register SSPtr fSSPtr;
- /* Return the highest address of the Stack Segment. Following conventions,
- this address is the address of the first byte AFTER the SS */
- {
- return ((SSAddr) fSSPtr->endOfSS);
- }
-
- /************************************************************************/
- /* PPString */
- /************************************************************************/
- char *PPString(fStrPtr)
- StringPtr fStrPtr;
- /* Given a ptr for an Emerald string, return a ptr to a C string */
- {
- char *buf = getNextBuf();
- if (fStrPtr == (StringPtr) EMNIL) {
- (void) sprintf(buf, "[EMNIL]");
- } else {
- (void) sprintf(buf, "%.*s", fStrPtr->sizeInBytes, (char *)&fStrPtr->data[0]);
- }
- return buf;
- }
-
- /************************************************************************/
- /* PPCName */
- /************************************************************************/
- char *PPCName(fCodePtr)
- register CodePtr fCodePtr;
- /* Given a CodePtr for some code, return a string to print */
- {
- register StringPtr nameAddr;
- char *buf = getNextBuf();
-
- if (IsNULL(fCodePtr)) {
- (void) sprintf(buf, "NULL");
- } else if ((!PPValidAddr((SSAddr *) fCodePtr))
- ||(fCodePtr->tag.tag != CodeTag)) {
- (void) sprintf(buf, "INVALID");
- } else if (IsNULL(fCodePtr->codeNameOffset)){
- (void) sprintf(buf, "NAMELESS");
- } else {
- nameAddr = (StringPtr) addOffset(fCodePtr, fCodePtr->codeNameOffset);
- if (!PPValidAddr((SSAddr *) nameAddr)) {
- (void) sprintf(buf, "Code: Invalid name or code");
- return buf;
- }
- return PPString(nameAddr);
- }
- return buf;
- }
-
- /************************************************************************/
- /* PPCodePtr */
- /************************************************************************/
- char *PPCodePtr(fCodePtr)
- CodePtr fCodePtr;
- /* Given a CodePtr for some code object, return a string to print */
- {
- char *buf = getNextBuf();
-
- if (IsNIL(fCodePtr) || IsNULL(fCodePtr) ||
- (!PPValidAddr((SSAddr *) fCodePtr)) || fCodePtr->tag.tag != CodeTag) {
- (void) sprintf(buf, "CODEPTR(0x%02x)", fCodePtr);
- } else {
- if (fCodePtr->tag.tag != CodeTag) {
- (void) sprintf(buf, "C%08.8x", fCodePtr->ownOID);
- } else {
- (void) sprintf(buf, "C%08.8x (%s)", fCodePtr->ownOID, PPCName(fCodePtr));
- }
- }
- return buf;
- }
-
- /************************************************************************/
- /* PPCOID */
- /************************************************************************/
- char *PPCOID(fCOID)
- OID fCOID;
- /* Given an OID for some code object, return a string to print */
- {
- char *buf = getNextBuf();
- CodeODP cODP;
-
- if (IsNULL(fCOID)) {
- (void) sprintf(buf, "NULL CODEOID");
- } else if (IsNIL(fCOID)) {
- (void) sprintf(buf, "NIL CODEOID");
- } else {
- cODP = (CodeODP) OTLookup(fCOID);
- if (IsNULL(cODP) || cODP->tag.tag != CodeODTag || IsNULL(cODP->dataPtr)) {
- (void) sprintf(buf, "C%08.8x", fCOID);
- } else {
- (void) sprintf(buf, "C%08.8x (%s)", fCOID, PPCName(cODP->dataPtr));
- }
- }
- return buf;
- }
-
- /************************************************************************/
- /* PPOID */
- /************************************************************************/
- char *PPOID(fOID)
- OID fOID;
- /* Given an OID for something return a string */
- {
- char *buf = getNextBuf();
- (void) sprintf(buf, "0x%08.8x", fOID);
- return buf;
- }
-
- /************************************************************************/
- /* PPPOID */
- /************************************************************************/
- char *PPPOID(fPOID)
- OID fPOID;
- /* Given an OID for a process return a printable version */
- {
- char *buf = getNextBuf();
- (void) sprintf(buf, "P%08.8x", fPOID);
- return buf;
- }
-
- /************************************************************************/
- /* PPGOID */
- /************************************************************************/
- char *PPGOID(fGOID)
- OID fGOID;
- /* Given an OID for some global object, return a string to print */
- {
- char *buf = getNextBuf();
- if (fGOID == (OID) NULL) {
- (void) sprintf(buf, "ANONYMOUS");
- } else {
- (void) sprintf(buf, "G%08.8x", fGOID);
- }
- return buf;
- }
- /************************************************************************/
- /* PPLoc */
- /************************************************************************/
- char *PPLoc(fLoc)
- EmLocation fLoc;
- /* Return printable string for location */
- {
- register EmLocationStructPtr theLoc;
- char *buf = getNextBuf();
-
- theLoc = (EmLocationStructPtr) &fLoc;
- if (theLoc->timestamp == 0) {
- (void) sprintf(buf, "LOC UNKNOWN");
- } else {
- (void) sprintf(buf, "<%2u, #%2u>", theLoc->timestamp, theLoc->lnn);
- }
- return buf;
- }
-
- /************************************************************************/
- /* PPVar */
- /************************************************************************/
- char *PPVar(fVarAddr)
- AVariablePtr fVarAddr;
- /* Given the address of a variable, return a string to print */
- {
- char *buf = getNextBuf();
- ODP theODP;
-
- if (IsNULL(fVarAddr)) {
- (void) sprintf(buf, "(NULL VARADDR)");
- } else if ((int *) fVarAddr < &etext) {
- (void) sprintf(buf, "(ADDR 0x%01x TOO SMALL)", fVarAddr);
- } else if (((int *) fVarAddr > (int *) sbrk(0)) &&
- !( ((int *) fVarAddr < (int *) 0x7ffffff0) && /* could be on stack*/
- ((int *) fVarAddr > (int *) 0x7f000000)
- )
- ) {
- (void) sprintf(buf, "(ADDR 0x%01x TOO LARGE)", fVarAddr);
- } else if (IsNIL(fVarAddr->myAbConPtr) || IsNIL(fVarAddr->myAddr)) {
- (void) sprintf(buf, "(NIL)");
- } else if (!PPValidAddr((SSAddr *) fVarAddr->myAbConPtr)
- || (fVarAddr->myAbConPtr->tag.tag != AbConTag)) {
- theODP = (ODP) fVarAddr->myAddr;
- (void) sprintf(buf, "(0x%05x, 0x%05x)", theODP, fVarAddr->myAbConPtr);
- } else {
- theODP = (ODP) fVarAddr->myAddr;
- (void) sprintf(buf, "(0x%01x) one of %s viewed as %s", theODP,
- PPCOID(fVarAddr->myAbConPtr->CodeOID),
- PPCOID(fVarAddr->myAbConPtr->ATOID));
- };
- return buf;
- }
-
- /************************************************************************/
- /* PPODP */
- /************************************************************************/
- char *PPODP(fODP)
- ODP fODP;
- /* Given an ODP, return a string describing it */
- {
- char *buf = getNextBuf();
-
- if (IsNIL(fODP)) {
- (void) sprintf(buf, "NIL");
- } else if (IsNULL(fODP)) {
- (void) sprintf(buf, "NULL");
- } else if ((int *) fODP < &etext) {
- (void) sprintf(buf, "(ADDR 0x%01x TOO SMALL)", fODP);
- } else if ((int *) fODP > (int *) sbrk(0)) {
- (void) sprintf(buf, "(ADDR 0x%01x TOO LARGE)", fODP);
- } else if (fODP->G.tag.tag == GODTag) {
- (void) sprintf(buf, "GOD, one of %s", PPCOID(fODP->G.myCodeOID));
- } else if ((fODP->G.tag.tag == GODataTag) ||(fODP->G.tag.tag == LOTag)) {
- (void) sprintf(buf, "0x%06x (one of %s)", fODP,
- PPCodePtr(fODP->L.myCodePtr));
- } else {
- (void) sprintf(buf, "(0x%06x, %s)", fODP, PPODBasicTag(fODP->G.tag.tag));
- };
- return buf;
- }
-
- /************************************************************************/
- /* PPFindLineNo */
- /************************************************************************/
- char *PPFindLineNo(fCodeP, fip)
- CodePtr fCodeP;
- CodeAddr fip;
- /* Given a code ptr and a ip, return the line number (0, if none) */
- {
- char *buf = getNextBuf();
- Offset ipRelative;
- IPMapPtr mapAddr;
- int lineNumber;
-
- if (PPValidAddr((SSAddr *) fCodeP) && (fCodeP->tag.tag == CodeTag) &&
- PPValidAddr((SSAddr *) &fCodeP->lineNumberMapOffset) &&
- NonNULL(fCodeP->lineNumberMapOffset)) {
- ipRelative = (Offset) byteOffset(fCodeP, fip);
- mapAddr = (IPMapPtr) addOffset(fCodeP, fCodeP->lineNumberMapOffset);
- lineNumber = (int) IPMapLookup(mapAddr, ipRelative);
- (void) sprintf(buf, "%d", lineNumber);
- } else {
- (void) sprintf(buf, "<LINENUMBER NOT AVAILABLE>");
- }
- return buf;
- }
-
- /************************************************************************/
- /* PPRegsPlace */
- /************************************************************************/
- char *PPRegsPlace(fRegsPtr, fCurrentIP)
- RegisterSavePtr fRegsPtr;
- CodeAddr fCurrentIP;
- /* Given a pointer to a set of registers, find the AR place and
- return a string to print "<object name>, line xxx" */
- {
- char *buf = getNextBuf();
- GODataPtr g;
- CodePtr cPtr;
-
- if (NonNULL(fRegsPtr->l)){
- g = (GODataPtr) (fRegsPtr->g);
- if (!PPValidAddr((SSAddr *) g)) {
- (void) sprintf(buf, "BAD OBJECT REFERENCE 0x%06x", g);
- return buf;
- }
- cPtr = g->myCodePtr;
- (void) sprintf(buf, "\"%s\", line %s", PPCName(cPtr),
- PPFindLineNo(cPtr, fCurrentIP));
- } else {
- (void) sprintf(buf, "\"** Empty Stack **\"");
- }
- return buf;
- }
-
-
- /************************************************************************/
- /* PPSSPlace */
- /************************************************************************/
- char *PPSSPlace(fSSPtr)
- SSPtr fSSPtr;
- /* Given a SSPtr, return a string to print "<object name>, line xxx" */
- {
- char *buf = getNextBuf();
- CodeAddr ip;
- GODataPtr g;
- CodePtr cPtr;
-
- if (!ValidSSPtr(fSSPtr)) return "Invalid SSPtr";
-
- if (!PPValidAddr((SSAddr *) fSSPtr->regs.b)) {
- (void) sprintf(buf, "SS has invalid b = 0x%06x", fSSPtr->regs.b);
- return buf;
- }
-
- if (!PPValidAddr((SSAddr *) fSSPtr->regs.g)) {
- (void) sprintf(buf, "SS has invalid g = 0x%06x", fSSPtr->regs.g);
- return buf;
- }
-
- if (
- SSValidAddr(fSSPtr, fSSPtr->regs.l) &&
- SSValidAddr(fSSPtr, fSSPtr->regs.sp)
- ) {
- ip = * (CodeAddr *) (fSSPtr->regs.sp);
- g = (GODataPtr) (fSSPtr->regs.g);
- cPtr = g->myCodePtr;
- (void) sprintf(buf, "\"%s\", line %s", PPCName(cPtr),
- PPFindLineNo(cPtr, ip));
- } else {
- (void) sprintf(buf, "\"** Empty Stack **\"");
- }
- return buf;
- }
-
- /**********************************************************************/
- /* PPPrintPos, PPGetPos */
- /**********************************************************************/
- char *PPGetPos(fG, fIp)
- unsigned int fG, fIp;
- /* For debugging */
- {
- char *buf = getNextBuf();
- unsigned int limit;
- CodePtr cPtr;
-
- limit = (unsigned int) sbrk(0);
- if ((fIp > limit) || (fIp < (unsigned int) &etext)) {
- (void) sprintf(buf, "Invalid ip value 0x%06x\n", fIp);
- return buf;
- }
-
- if ((fG > limit) ||
- (fG < (unsigned int) &etext) ||
- ( (((GODataPtr) fG)->tag.tag != GODataTag) &&
- (((GODataPtr) fG)->tag.tag != LOTag)
- ) ||
- (((GODataPtr) fG)->tag.otherstuff != OBSCUREVALUE) )
- {
- (void) sprintf(buf, "Invalid object pointer 0x%06x\n", fG);
- return buf;
- }
- cPtr = ((GODataPtr) fG)->myCodePtr;
- if (((unsigned int) cPtr > limit) ||
- ((unsigned int) cPtr < (unsigned int) &etext) ||
- (cPtr->tag.tag != CodeTag) ||
- (cPtr->tag.otherstuff != OBSCUREVALUE) ) {
- (void) sprintf(buf, "Invalid code pointer 0x%06x\n", cPtr);
- return buf;
- }
-
- (void) sprintf(buf, "\"%s\", line %s\n", PPCName(cPtr),
- PPFindLineNo(((GODataPtr)fG)->myCodePtr, (CodeAddr) fIp));
- return buf;
- }
-
-
- /**********************************************************************/
- /* PPPrintPos */
- /**********************************************************************/
- void PPPrintPos(fG, fIp)
- unsigned int fG, fIp;
- /* For debugging; callable from dbx - can be useful */
- {
- unsigned int limit;
- CodePtr cPtr;
-
- limit = (unsigned int) sbrk(0);
- if ((fIp > limit) || (fIp < (unsigned int) &etext)) {
- printf("Bogus ip value 0x%06x\n", fIp);
- return;
- }
-
- if ((fG > limit) || (fG < (unsigned int) &etext) ||
- (((GODataPtr) fG)->tag.tag != GODataTag) ||
- (((GODataPtr) fG)->tag.otherstuff != OBSCUREVALUE) ){
- printf("Bogus fG 0x%06x\n", fG);
- return;
- }
- cPtr = ((GODataPtr) fG)->myCodePtr;
- if (((unsigned int) cPtr > limit) ||
- ((unsigned int) cPtr < (unsigned int) &etext) ||
- (cPtr->tag.tag != CodeTag) ||
- (cPtr->tag.otherstuff != OBSCUREVALUE) ) {
- printf("Bogus CodePtr 0x%06x\n", cPtr);
- return;
- }
-
- printf("\"%s\", line %s\n", PPCName(cPtr),
- PPFindLineNo(((GODataPtr)fG)->myCodePtr, (CodeAddr) fIp));
- }
-
-
-
- /**********************************************************************/
- /**********************************************************************/
-
- /**********************************************************************/
- /* PPODBasicTag */
- /**********************************************************************/
-
- char *PPODBasicTag(fTag)
- ODBasicTag fTag;
- /* Return a printable string representation for the tag. */
- /* I.e., ODBasicTag.asString */
- {
- char *buf = getNextBuf();
- unsigned int index;
-
- index = (unsigned int) fTag;
-
- if (index < (unsigned int) (LastODBasicTag)) {
- return BasicTagName[index];
- }
- (void) sprintf(buf, "INVALID TAG #0x%02x", index);
- return buf;
- }
-
- /**********************************************************************/
- /* PPODTag */
- /**********************************************************************/
- char *PPODTag(fTag)
- ODTag fTag;
- /* return a printable version of the tag, i.e., ODTag.asString */
- {
- char *buf = getNextBuf();
- unsigned int rawTag, mask, index, i, bit, bitValue;
-
- (void) strcpy(buf, PPODBasicTag(fTag.tag));
- if (fTag.otherstuff != OBSCUREVALUE) {
- (void) strcat(buf, " ");
- (void) strcat(buf, "**TRASHED**");
- }
-
- index = (unsigned int) fTag.tag;
-
- assert(sizeof(ODTag) == sizeof(unsigned int));
-
- bcopy((char *) &fTag, (char *) &rawTag, sizeof(unsigned int));
- mask = ~0;
- if (index < (unsigned int) LastODBasicTag) {
- /* Mask out irrelevant bits */
- mask &= validMask[index];
- }
-
- for (i = 0; bitD[i].position != END_MARK; i++) {
- bit = bitD[i].position;
- if (!((1 << bit) & mask)) continue;
- /* Bit #bit is releveant */
- bitValue = ((1 << bit) & rawTag) ? 1 : 0;
- (void) strcat(buf, " ");
- (void) strcat(buf, bitD[i].printableValue[bitValue]);
- }
- return buf;
- }
-
- /**********************************************************************/
- /* PPLocalGCBits */
- /**********************************************************************/
- char *PPLocalGCBits(fODP)
- ODP fODP;
- {
- char *buf = getNextBuf();
-
- if (fODP->G.tag.localgcMark1) {
- if (fODP->G.tag.localgcMark2) {
- strcpy(buf, "Black");
- } else {
- strcpy(buf, "Grey");
- }
- } else {
- if (fODP->G.tag.localgcMark2) {
- strcpy(buf, "INVALIDLOCALGCMARK");
- } else {
- strcpy(buf, "White");
- }
- }
- return buf;
- }
-
- /**********************************************************************/
- /* PPBrand */
- /**********************************************************************/
-
- char *PPBrand(fBrand)
- Brand fBrand;
- /* Return a printable string representation for Brand. */
- /* I.e., Brand.asString */
- {
- char *buf = getNextBuf();
- unsigned int index;
-
- index = (unsigned int) fBrand;
-
- if (index < (unsigned int) (UnusedBrand)) {
- return BrandNames[index];
- }
- (void) sprintf(buf, "INVALID BRAND #0x%02x", index);
- return buf;
- }
-
- /**********************************************************************/
- /* PPParamInfo */
- /**********************************************************************/
-
- char *PPParamInfo(fParamInfo)
- ParamInfo fParamInfo;
- /* Return a printable string representation for Brand. */
- /* I.e., Brand.asString */
- {
- char *buf = getNextBuf();
- unsigned int index;
-
- index = (unsigned int) fParamInfo;
-
- if (index < (unsigned int) (UnusedBrand)) {
- return ParamInfoNames[index];
- }
- (void) sprintf(buf, "INVALID BRAND #0x%02x", index);
- return buf;
- }
-
- /**********************************************************************/
- /* PPITag */
- /**********************************************************************/
-
- char *PPITag(fITag)
- ITag fITag;
- /* Return a printable string representation for ITag. */
- /* I.e., ITag.asString */
- {
- char *buf = getNextBuf();
- unsigned int index;
-
- index = (unsigned int) fITag;
-
- if (index < (unsigned int) (LastITag)) {
- (void) strcpy(buf, ITagNames[index]);
- return buf;
- }
-
- (void) sprintf(buf, "INVALID ITag #0x%02x", index);
- return buf;
- }
-
- /**********************************************************************/
- /* PPRTag */
- /**********************************************************************/
-
- char *PPRTag(fRTag)
- ReqTag fRTag;
- /* Return a printable string representation for ReqTag. */
- /* I.e., ReqTag.asString */
- {
- char *buf = getNextBuf();
- unsigned int index;
-
- index = (unsigned int) fRTag;
-
- if (index < (unsigned int) (LastRTag)) {
- (void) strcpy(buf, RTagNames[index]);
- return buf;
- }
-
- (void) sprintf(buf, "INVALID RTag #0x%02x", index);
- return buf;
- }
-
- /**********************************************************************/
- /* PPSSRunStatus */
- /**********************************************************************/
- char *PPSSRunStatus(fStatus)
- {
- char *buf = getNextBuf();
- unsigned int index;
-
- index = (unsigned int) fStatus;
-
- if (index < (unsigned int) (SSLastRunStatus)) {
- (void) strcpy(buf, SSRunStatusNames[index]);
- return buf;
- }
-
- (void) sprintf(buf, "INVALID SSRunStatus #0x%02x", index);
-
- return buf;
- }
-
- /**********************************************************************/
- /* PPInvokeResult */
- /**********************************************************************/
- char *PPInvokeResult(fInvokeResult)
- InvokeResult fInvokeResult;
- {
- char *buf = getNextBuf();
- switch (fInvokeResult) {
-
- case INVOKEDONE: {
- strcpy(buf, "INVOKE DONE");
- break;
- }
-
- case INVOKEUNAVAILABLE: {
- strcpy(buf, "INVOKED OBJECT UNAVAILABLE");
- break;
- }
-
- case INVOKEFAILED: {
- strcpy(buf, "INVOKE FAILED");
- break;
- }
-
- default: {
- (void) sprintf(buf, "BAD INVOKE RESULT %d", fInvokeResult);
- break;
- }
- }
- return buf;
- }
-
- /**********************************************************************/
- /* Doubly linked queue operations */
- /* Provide access to the insque and remque instructions */
- /**********************************************************************/
-
- /*ARGSUSED*/
- void InsertDQ(fHead, fNewElem)
- register DQueuePtr fHead, fNewElem;
- /* Insert at head of queue */
- {
- #ifdef vax
- asm(" insque (r10),(r11)");
- #ifdef lint
- /* Dummy stuff for lint -- do not EVER compile this in */
- fHead = fNewElem;
- fNewElem = fHead;
- #endif lint
- #endif
- #ifdef sun
- HoldSigs();
-
- fNewElem->next = fHead;
- fNewElem->prev = fHead->prev;
- fHead->prev = fNewElem;
- (fNewElem->prev)->next = fNewElem;
-
- ReleaseSigs();
- #endif
- }
-
- /*ARGSUSED*/
- DQueuePtr RemoveDQ(fElem)
- register DQueuePtr fElem;
- {
- #ifdef vax
- asm(" remque (r11),r0");
- #ifdef lint
- /* Dummy stuff for lint -- do not EVER compile this in */
- fElem = fElem;
- return fElem;
- #endif lint
- #endif
- #ifdef sun
-
- HoldSigs();
-
- if (fElem->next == fElem ) {
-
- ReleaseSigs();
-
- return( (DQueuePtr) 0 );
- }
- (fElem->prev)->next = fElem->next;
- (fElem->next)->prev = fElem->prev;
-
- ReleaseSigs();
-
- return( fElem );
- #endif
- }
-
- #ifndef lint
- #ifdef vax
- #define ODBit(xxx) (1 << ODTag_/**/xxx)
- #endif
- #ifdef sun
- #define ODBit(xxx) (1 << (31 - ODTag_/**/xxx))
- #endif
- #else lint
- #define ODBit(xxx) 1
- #endif lint
-
- void UtilsInit()
- {
- unsigned int gcMask, i;
- ODTag tempTag;
- int tempInt;
- tempInt = ODBit(frozen);
- tempTag = *(ODTag *) &tempInt;
- assert(tempTag.frozen);
- KMDTrace("Portability", 3, "UtilsInit: setting bit masks\n");
- gcMask =
- ODBit(gcDoNotCollect) | ODBit(gcMark1) |
- ODBit(gcMark2) | ODBit(gcFrozen) |
- ODBit(localgcMark1) | ODBit(localgcMark2) |
- ODBit(xref);
-
- for (i=0; i < 32; i++) validMask[i] = 0;
- validMask[(unsigned int) InvalidTag] = ~0;
- validMask[(unsigned int) GODTag] =
- ODBit(frozen) | ODBit(global) |
- ODBit(replicated) | ODBit(isResident) |
- ODBit(setUpDone) | ODBit(isFixed) |
- ODBit(inTransit) | ODBit(broken) |
- ODBit(seenHere) | gcMask;
- validMask[(unsigned int) UnknownTag] =
- validMask[(unsigned int) GODTag];
- validMask[(unsigned int) GODataTag] =
- ODBit(global) | ODBit(replicated) |
- ODBit(inTransit) | ODBit(broken) |
- gcMask;
- validMask[(unsigned int) SSODTag] =
- ODBit(frozen) | ODBit(isResident) |
- ODBit(inTransit) | ODBit(seenHere) |
- gcMask;
- validMask[(unsigned int) SSTag] =
- ODBit(frozen) | gcMask;
- validMask[(unsigned int) CodeODTag] =
- ODBit(frozen) | ODBit(isResident) |
- ODBit(setUpDone) | ODBit(inTransit) |
- ODBit(allInstancesAreLocal) |
- ODBit(hasNoPointer) | ODBit(seenHere) |
- gcMask;
- validMask[(unsigned int) CodeTag] =
- ODBit(setUpDone) | ODBit(allInstancesAreLocal) |
- ODBit(hasNoPointer) | gcMask;
- validMask[(unsigned int) LOTag] =
- ODBit(global) | ODBit(replicated) |
- ODBit(broken) | gcMask;
- validMask[(unsigned int) ProcessODTag] = ~0; /* obsolete */
- validMask[(unsigned int) AbConTag] =
- ODBit(global) |
- ODBit(allInstancesAreLocal) |
- ODBit(hasNoPointer) | gcMask;
- validMask[(unsigned int) CondTag] =
- validMask[(unsigned int) GODTag];
- validMask[(unsigned int) DotoTag] =
- ODBit(seenHere) | gcMask;
-
- /* Check that we have got the Names of enumeration types right */
- if (strcmp(RTagNames[(int) LastRTag], "LastRTag")){
- ErrMsg("UtilsInit: Minor warning, RTagNames inconsistent\n");
- }
-
- if (strcmp(ITagNames[(int) LastITag], "LastITag")) {
- ErrMsg("UtilsInit: Minor warning, ITagNames inconsistent\n");
- }
-
- if (strcmp(SSRunStatusNames[(int) SSLastRunStatus], "LastRunStatus")) {
- ErrMsg("UtilsInit: Minor warning, SSRunStatusNames inconsistent\n");
- }
-
- if (strcmp(BasicTagName[(int) LastODBasicTag], "LastODBasicTag")) {
- ErrMsg("UtilsInit: Minor warning, BasicTagName inconsistent\n");
- }
- }
-
- /* Copyright 1986 Eric Jul */
-