mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-21 03:31:39 +00:00
317 lines
11 KiB
C
317 lines
11 KiB
C
|
/*
|
|||
|
File: CodeFragments.h
|
|||
|
|
|||
|
Contains: Code Fragment Manager:
|
|||
|
System Programmer's Interface
|
|||
|
|
|||
|
Written by: Erik L Eidt
|
|||
|
|
|||
|
Copyright: <EFBFBD> 1992 by Apple Computer, Inc., all rights reserved.
|
|||
|
|
|||
|
Change History (most recent first):
|
|||
|
|
|||
|
<1> 12/7/92 DRF first checked in
|
|||
|
<7> 11/11/92 ELE char ==> unsigned char
|
|||
|
<6> 11/3/92 NL Added back #include <Memory.h>, because it is definitely needed!
|
|||
|
Specifically, for the THz typedef, as well as for prototypes for
|
|||
|
functions (eg: GetZone()).
|
|||
|
<5> 10/28/92 WSK Remove "#include <Memory.h>" (not needed).
|
|||
|
Bracket "#include"s with "#ifndefs" so native debugger can
|
|||
|
be compiled using this file (by #defining the symbols and
|
|||
|
substituting its own definitions as required).
|
|||
|
<4> 10/22/92 DRF Get rid of inline glue from <3>. Moved it to a new file,
|
|||
|
CodeFragmentsTrap.h. This way we can still build GoNative, and
|
|||
|
only those folks who need to use the trap interface will have it
|
|||
|
defined.
|
|||
|
<3> 10/22/92 DRF Added inline glue for 68K to call FragCreateContext,
|
|||
|
FragPrepare, FragRelease, and FragRegister.
|
|||
|
<2> 10/6/92 jrc Changed "typedef struct" syntax to agree with Sean's
|
|||
|
InterfaceTool. Also changed "typedef enum".
|
|||
|
<7> 9/30/92 ELE change TCFLProcs from typedef to struct so CFLoader.h still not
|
|||
|
required
|
|||
|
<6> 9/30/92 ELE add TVersionNum type
|
|||
|
<5> 9/29/92 ELE make Dave F. happy!
|
|||
|
<4> 9/29/92 ELE remove include of CFLoader.h
|
|||
|
<3> 9/23/92 ELE change tab settings
|
|||
|
<2> 9/23/92 ELE had to add blank line onto end of file - MPW C was complaining about illegal character
|
|||
|
<1> 9/18/92 ELE first checked in
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
#ifndef __CODEFRAGMENTS__
|
|||
|
|
|||
|
#define __CODEFRAGMENTS__ 1
|
|||
|
|
|||
|
#ifndef __TYPES__
|
|||
|
#include <Types.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef __FILES__
|
|||
|
#include <Files.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef __PROCESSES__
|
|||
|
#include <Processes.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef __MEMORY__
|
|||
|
#include <Memory.h>
|
|||
|
#endif
|
|||
|
|
|||
|
// typedefs that probably should be in some other system header
|
|||
|
typedef long TaskID;
|
|||
|
typedef long TeamID;
|
|||
|
typedef long AddressSpaceID;
|
|||
|
typedef unsigned long LogicalAddress; // the type used for addresses in address spaces
|
|||
|
typedef unsigned long TVersionNum; /* Version number */
|
|||
|
|
|||
|
|
|||
|
typedef long FragContextID; // ID<49>s to identify the app, agent, task or team
|
|||
|
// to which a module should attached
|
|||
|
typedef LogicalAddress FragConnectionID; // the value interpreted only by the Frag
|
|||
|
typedef unsigned long Mask; // for flags
|
|||
|
typedef unsigned char SymClass; // for symbol class of export symbols
|
|||
|
|
|||
|
typedef OSErr FragErr;
|
|||
|
|
|||
|
|
|||
|
// system & boot context value
|
|||
|
#define kSystemFragContext 1
|
|||
|
|
|||
|
|
|||
|
// default values for creating contexts
|
|||
|
#define kDefaultTaskID (long) (GetZone ()) // unique to an app
|
|||
|
#define kDefaultTeamID 1 // the BLUE world
|
|||
|
#define kDefaultAddrSpaceID 1 // the Mac address space
|
|||
|
|
|||
|
enum { kDefaultContext = 0, kFragDebugApp = 1,
|
|||
|
kFragDebugAll = 2, kFragInSystem = 4 };
|
|||
|
|
|||
|
|
|||
|
// values for preparing objects
|
|||
|
enum { kDefaultPlacement, kUseMemInPlace };
|
|||
|
enum { kAttachStatic, kAttachDynamic };
|
|||
|
#define kNoLibName ((unsigned char *) 0)
|
|||
|
#define kNoLocator ((FragmentLocatorPtr) 0)
|
|||
|
#define kPowerPC 'pwpc'
|
|||
|
|
|||
|
|
|||
|
// values for releasing contexts
|
|||
|
#define kAllConnections ((FragConnectionID) 0)
|
|||
|
enum { kTaskID = 1, kTeamID = 2, kAddressSpace = 4, kDefaultRelease = kTaskID };
|
|||
|
enum { kAbnormalTerm, kNormalTerm };
|
|||
|
|
|||
|
|
|||
|
// for registering libraries with Frag
|
|||
|
enum { kAfterPMSP, kBeforePMSP };
|
|||
|
enum { kFullLib, kUpdateLib };
|
|||
|
enum { kRegister, kUnregister };
|
|||
|
|
|||
|
|
|||
|
// fragment locator description types
|
|||
|
enum { kOnDiskFlat, kInMem, kOnDiskSegmented };
|
|||
|
|
|||
|
struct MemFragment {
|
|||
|
Ptr address;
|
|||
|
long length;
|
|||
|
Boolean inPlace;
|
|||
|
};
|
|||
|
typedef struct MemFragment MemFragment;
|
|||
|
|
|||
|
|
|||
|
struct DiskFragment {
|
|||
|
FSSpecPtr fileSpec;
|
|||
|
long offset;
|
|||
|
long length;
|
|||
|
};
|
|||
|
typedef struct DiskFragment DiskFragment;
|
|||
|
|
|||
|
|
|||
|
struct SegmentedFragment {
|
|||
|
FSSpecPtr fileSpec;
|
|||
|
OSType rsrcType;
|
|||
|
short rsrcID;
|
|||
|
};
|
|||
|
typedef struct SegmentedFragment SegmentedFragment;
|
|||
|
|
|||
|
struct FragmentLocator{
|
|||
|
long where;
|
|||
|
union {
|
|||
|
MemFragment inMem;
|
|||
|
DiskFragment onDisk;
|
|||
|
SegmentedFragment inSegs;
|
|||
|
} u;
|
|||
|
};
|
|||
|
typedef struct FragmentLocator FragmentLocator, *FragmentLocatorPtr;
|
|||
|
|
|||
|
|
|||
|
// search function types
|
|||
|
enum { kAfterOthers, kBeforeOthers };
|
|||
|
|
|||
|
typedef FragErr (*FragSearchProcPtr) ( Str63 pNamePtr,
|
|||
|
long updateLevel,
|
|||
|
short vRefNum,
|
|||
|
long parID,
|
|||
|
TVersionNum linkedVersion,
|
|||
|
TVersionNum oldDefVersion,
|
|||
|
OSType architecure,
|
|||
|
FragmentLocator *fragLoc,
|
|||
|
Boolean *isPrivate,
|
|||
|
long *position );
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// System Programmer's Interface
|
|||
|
//
|
|||
|
// Functions that do actions
|
|||
|
//
|
|||
|
|
|||
|
FragErr FragCreateContext ( FragContextID *contextID,
|
|||
|
THz heapZone,
|
|||
|
AddressSpaceID addressSpace,
|
|||
|
TaskID taskID,
|
|||
|
TeamID teamID,
|
|||
|
Mask contextFlags );
|
|||
|
|
|||
|
FragErr FragPrepare ( FragContextID contextID,
|
|||
|
FragmentLocatorPtr fragLocator,
|
|||
|
Str63 libName,
|
|||
|
Boolean attachDynamic,
|
|||
|
OSType architecture,
|
|||
|
FragConnectionID *connectionID,
|
|||
|
LogicalAddress *entryAddress,
|
|||
|
Str63 errName );
|
|||
|
|
|||
|
FragErr FragRelease ( FragContextID contextID,
|
|||
|
FragConnectionID connectionID,
|
|||
|
Mask releaseWhich,
|
|||
|
Boolean normalTerm );
|
|||
|
|
|||
|
|
|||
|
FragErr FragRegister ( FragmentLocatorPtr fragLocator,
|
|||
|
Boolean beforePMSP,
|
|||
|
long updateLevel,
|
|||
|
Str63 libName,
|
|||
|
Boolean unregister );
|
|||
|
|
|||
|
FragErr FragAddSearchFcn ( FragSearchProcPtr SearchFcn,
|
|||
|
Boolean callFirst );
|
|||
|
|
|||
|
//
|
|||
|
// System Programmer's Interface
|
|||
|
//
|
|||
|
// Functions that return information
|
|||
|
//
|
|||
|
|
|||
|
struct RegisteredInfo{
|
|||
|
Str63 libName;
|
|||
|
FragmentLocator fragLocator;
|
|||
|
};
|
|||
|
typedef struct RegisteredInfo RegisteredInfo;
|
|||
|
|
|||
|
|
|||
|
FragErr FragGetRegisterInfo ( long libIndex,
|
|||
|
RegisteredInfo *registerInfo );
|
|||
|
|
|||
|
|
|||
|
FragErr FragResolveSymbol ( FragContextID contextID,
|
|||
|
FragConnectionID connectionID,
|
|||
|
Str255 symbolName,
|
|||
|
SymClass *symbolClass,
|
|||
|
long *symbolIndex,
|
|||
|
LogicalAddress *symbolAddress );
|
|||
|
|
|||
|
|
|||
|
struct ContextInfo {
|
|||
|
FragContextID contextID;
|
|||
|
THz heapZone;
|
|||
|
AddressSpaceID addressSpace;
|
|||
|
TaskID taskID;
|
|||
|
TeamID teamID;
|
|||
|
};
|
|||
|
typedef struct ContextInfo ContextInfo;
|
|||
|
|
|||
|
FragErr FragGetContextInfo ( FragContextID contextID,
|
|||
|
Boolean nextContext,
|
|||
|
ContextInfo *contextInfo );
|
|||
|
|
|||
|
|
|||
|
struct ConnectionInfo {
|
|||
|
FragConnectionID connectionID;
|
|||
|
OSType loaderType;
|
|||
|
FragmentLocator fragLocator;
|
|||
|
long sectionCount;
|
|||
|
long symbolCount;
|
|||
|
struct TCFLProcs *theProcs;
|
|||
|
struct TCFLPrivateInfo *containerInfo;
|
|||
|
};
|
|||
|
typedef struct ConnectionInfo ConnectionInfo;
|
|||
|
|
|||
|
FragErr FragGetConnectionInfo( FragContextID contextID,
|
|||
|
FragConnectionID connectionID,
|
|||
|
Boolean nextConnection,
|
|||
|
ConnectionInfo *connectionInfo );
|
|||
|
|
|||
|
|
|||
|
struct SectionInfo {
|
|||
|
LogicalAddress sectionAddress;
|
|||
|
long sectionLength;
|
|||
|
Boolean executable;
|
|||
|
Boolean writeable;
|
|||
|
long shareCount;
|
|||
|
};
|
|||
|
typedef struct SectionInfo SectionInfo;
|
|||
|
|
|||
|
FragErr FragGetSectionInfo ( FragContextID contextID,
|
|||
|
FragConnectionID connectionID,
|
|||
|
long sectionIndex,
|
|||
|
long sectionCount,
|
|||
|
SectionInfo *sectionInfo );
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#define kUnresolvedSymbolAddress 0x0
|
|||
|
|
|||
|
//
|
|||
|
// Error codes and other constants
|
|||
|
//
|
|||
|
|
|||
|
enum {
|
|||
|
fragNoErr = 0,
|
|||
|
fragContextNotFound // contextID was not valid
|
|||
|
= -10000,
|
|||
|
fragConnectionIDNotFound, // connecionID was not valid
|
|||
|
fragSymbolNotFound, // symbol was not found in connection
|
|||
|
fragSectionNotFound, // section was not found
|
|||
|
fragLibNotFound, // library name not found in Frag registry
|
|||
|
fragHadUnresolveds, // loaded fragment had unacceptable unresolveds
|
|||
|
fragHadSoftUnresolveds, // loaded fragment has acceptable unresolveds
|
|||
|
fragNoMem, // out of memory for interal bookkeeping
|
|||
|
fragNoAddrSpace, // out of memory in user's address space for loadable section
|
|||
|
fragNoContextIDs, // no more context id<69>s
|
|||
|
fragObjectInitSeqErr, // order error during user initialization function invocation
|
|||
|
fragImportTooOld, // import library was too old and therefore incompatible
|
|||
|
fragImportTooNew, // import library was too new and therefore incompatible
|
|||
|
fragInitLoop, // circularity detected in mandatory initialization order
|
|||
|
fragInitRtnUsageErr, // boot library has initialization routine
|
|||
|
fragMgrInitErr // error in initailization of this manager
|
|||
|
};
|
|||
|
typedef long FragErrors;
|
|||
|
|
|||
|
|
|||
|
#define kFirstOrLastInTask 1
|
|||
|
#define kFirstOrLastInTeam 2
|
|||
|
#define kFirstOrLastInGroup 4
|
|||
|
|
|||
|
typedef OSErr ConnectionInitializationRoutine ( Mask flags,
|
|||
|
FragConnectionID connectionID );
|
|||
|
typedef void ConnectionTerminationRoutine ( Mask flags,
|
|||
|
FragConnectionID connectionID );
|
|||
|
|
|||
|
|
|||
|
#endif /* __CODEFRAGMENTS__ */
|
|||
|
|
|||
|
|
|||
|
|