mac-rom/Interfaces/CIncludes/FragLoad.h

321 lines
11 KiB
C
Raw Permalink Normal View History

/*
File: FragLoad.h
Contains: CFM Public API
Written by: Erik Eidt, Alan Lillich, Jeff Cobb
Copyright: <EFBFBD> 1993 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<15> 6/16/93 ELE (with AWL) Added new error code for UserInitProcFailure.
<14> 6/9/93 jrc (with SP) In the CFMTrap macro, remove the cast of (arg) to
signed short. This was confusing the interfacer.
<13> 6/9/93 EPT Changes for Universal Headers. Synched up with Reality.
<12> 6/5/93 BT (With JRG) "#ifndef interface_glue" should only be bracketing
the prototypes, not the type information. This was causing a
problem for ProcessesPriv.h where Eric was expecting some type
information to be available.
<11> 5/10/93 jrc Make C++ Happy.
<10> 4/7/93 jrc Use symbolic names for the MixedMode and CFM A-traps.
<9> 3/17/93 JRG Change how procinfos are constructed
<8> 3/4/93 AWL Change to "pascal" routines for Dagon.
<7> 3/2/93 jrc Fix Erik's fixes. "FourBytes" not "FourByte".
<6> 3/2/93 ELE Fixed two typo's in proc infos.
<5> 2/18/93 ELE Moved a bunch of stuff into here
from CodeFragments.h
<4> 2/15/93 ELE Added kAnyArchType.
<3> 1/28/93 jrc Rev for d4 MixedMode.
*/
/*******************************************************************************
FILENAME
FragLoad.h
COPYRIGHT
Copyright <EFBFBD> Apple Computer, Inc. 1992
All rights reserved.
*******************************************************************************/
#ifndef __FRAGLOAD__
#define __FRAGLOAD__ 1
#include <Types.h>
#include <Files.h>
#include <Traps.h>
typedef long ConnectionID;
typedef unsigned long Mask;
typedef unsigned char SymClass;
#define kPowerPC 'pwpc' // use as the architecture type
#define kAnyArchType 0x3f3f3f3f // '????'
#define kNoLibName ((unsigned char *) 0)
#define kNoConnectionID ((ConnectionID) 0)
#define kUnresolvedSymbolAddress ((Ptr) 0x0)
enum { // use for findFlags mask
kLoadLib = 1, // use existing connection if possible
kFindLib = 2, // just see if library is already loaded
kLoadNewCopy = 5, // load a new instance no matter what
kUseInPlace = 0x80 // use container's sections in place
};
enum {
kCodeSym = 0,
kDataSym = 1,
kTVectSym = 2,
kTOCSym = 3,
kGlueSym = 4
};
/************************************************************************/
/* for fragment initialization routines */
/************************************************************************/
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;
// NOTE: when fragLocator. where == kOnDisk, then
// fragLocator. u. onDisk. fileSpec is a pointer
// to the file that the library belonged to.
// the pointer is valid only for the duration
// of the init routine's invocation, so make
// a copy of the filespec if it is important
struct InitBlock {
long contextID;
long closureID;
long connectionID;
FragmentLocator fragLocator;
Ptr libName;
long reserved4a;
long reserved4b;
long reserved4c;
long reserved4d;
};
typedef struct InitBlock InitBlock, *InitBlockPtr;
// prototype for initialization routines
// Pascal calling conventions
// NOTE: initialization routines may comfortably ignore
// their parameters, however, they must return
// an error status (ie: noErr) in order to succeed
// with the load of the library
typedef pascal OSErr ConnectionInitializationRoutine ( InitBlockPtr initBlkPtr );
// termination routines get no parameters / return value
// Pascal calling conventions
typedef pascal void ConnectionTerminationRoutine ( void );
/************************************************************************/
/* for building shared libraries */
/************************************************************************/
#define kCFMRsrcType 'cfrg'
#define kSHLBFileType 'shlb'
/************************************************************************/
/* error codes */
/************************************************************************/
enum {
fragNoErr = 0,
fragContextNotFound = -2800, // contextID was not valid
fragConnectionIDNotFound = -2801, // connecionID was not valid
fragSymbolNotFound = -2802, // symbol was not found in connection
fragSectionNotFound = -2803, // section was not found
fragLibNotFound = -2804, // library name not found in Frag registry
fragDupRegLibName = -2805, // registered name already in use
fragFormatUnknown = -2806, // fragment container format unknown
fragHadUnresolveds = -2807, // loaded fragment had unacceptable unresolveds
fragHadSoftUnresolveds = -2808, // loaded fragment has acceptable unresolveds
fragNoMem = -2809, // out of memory for interal bookkeeping
fragNoAddrSpace = -2810, // out of memory in user's address space for loadable section
fragNoContextIDs = -2811, // no more context id<69>s
fragObjectInitSeqErr = -2812, // order error during user initialization function invocation
fragImportTooOld = -2813, // import library was too old and therefore incompatible
fragImportTooNew = -2814, // import library was too new and therefore incompatible
fragInitLoop = -2815, // circularity detected in mandatory initialization order
fragInitRtnUsageErr = -2816, // boot library has initialization routine
fragLibConnErr = -2817, // error connecting to library (error occured in sub prepare)
fragMgrInitErr = -2818, // error in initailization of this manager
fragConstErr = -2819, // internal inconstistancy
fragCorruptErr = -2820, // fragment container corrupted (known format)
fragUserInitProcErr = -2821, // user intialization routine did not return noErr
fragLastErrCode = -2899 // last reserved error code number
};
#if TurnOff68KCFMTraps || __powerc || powerc
#define CFMTrap(arg) /* don't want trap: 68k-code to link directly */
#else
#define CFMTrap(arg) = { 0x3F3C, arg, _CodeFragmentDispatch }
#endif
#ifdef __cplusplus
extern "C" {
#endif
pascal OSErr GetSharedLibrary ( Str63 libName,
OSType archType,
Mask findFlags,
ConnectionID *connID,
Ptr *mainAddr,
Str255 errName )
CFMTrap ( 1 );
#define GetSharedLibraryProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode) | \
STACK_PARAM_FIELD(6, kFourByteCode))
pascal OSErr GetDiskFragment ( FSSpecPtr fileSpec,
long offset,
long length,
Str63 fragName,
Mask findFlags,
ConnectionID *connID,
Ptr *mainAddr,
Str255 errName )
CFMTrap ( 2 );
#define GetDiskFragmentProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode) | \
STACK_PARAM_FIELD(6, kFourByteCode) | \
STACK_PARAM_FIELD(7, kFourByteCode) | \
STACK_PARAM_FIELD(8, kFourByteCode))
pascal OSErr GetMemFragment ( Ptr memAddr,
long length,
Str63 fragName,
Mask findFlags,
ConnectionID *connID,
Ptr *mainAddr,
Str255 errName )
CFMTrap ( 3 );
#define GetMemFragmentProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode) | \
STACK_PARAM_FIELD(6, kFourByteCode) | \
STACK_PARAM_FIELD(7, kFourByteCode))
pascal OSErr CloseConnection ( ConnectionID *connID )
CFMTrap ( 4 );
#define CloseConnectionProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode))
pascal OSErr FindSymbol ( ConnectionID connID,
Str255 symName,
Ptr *symAddr,
SymClass *symClass )
CFMTrap ( 5 );
#define FindSymbolProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode))
pascal OSErr CountSymbols ( ConnectionID connID,
long *symCount )
CFMTrap ( 6 );
#define CountSymbolsProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode))
pascal OSErr GetIndSymbol ( ConnectionID connID,
long symIndex,
Str255 symName,
Ptr *symAddr,
SymClass *symClass )
CFMTrap ( 7 );
#define GetIndSymbolProcInfo \
(kPascalStackBased | \
STACK_RESULT_FIELD(kTwoByteCode) | \
STACK_PARAM_FIELD(1, kFourByteCode) | \
STACK_PARAM_FIELD(2, kFourByteCode) | \
STACK_PARAM_FIELD(3, kFourByteCode) | \
STACK_PARAM_FIELD(4, kFourByteCode) | \
STACK_PARAM_FIELD(5, kFourByteCode))
#ifdef __cplusplus
}
#endif
#endif