mirror of
https://github.com/ctm/executor.git
synced 2026-03-12 02:41:37 +00:00
268 lines
5.5 KiB
C
268 lines
5.5 KiB
C
#if !defined(_cfm_h_)
|
|
#define _cfm_h_
|
|
|
|
#include "FileMgr.h"
|
|
|
|
/*
|
|
* Copyright 2000 by Abacus Research and Development, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* $Id: cfm.h 63 2004-12-24 18:19:43Z ctm $
|
|
*/
|
|
|
|
enum
|
|
{
|
|
kUnresolvedCFragSymbolAddress = 0
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
uint32 reserved0 PACKED;
|
|
uint32 reserved1 PACKED;
|
|
uint32 version PACKED;
|
|
uint32 reserved2 PACKED;
|
|
uint32 reserved3 PACKED;
|
|
uint32 reserved4 PACKED;
|
|
uint32 reserved5 PACKED;
|
|
int32 n_descripts PACKED;
|
|
}
|
|
cfrg_resource_t;
|
|
|
|
#define CFRG_VERSION_X(cfrg) ((cfgr)->version)
|
|
#define CFRG_VERSION(cfrg) (CL (CFRG_VERSION_X (cfgr)))
|
|
|
|
#define CFRG_N_DESCRIPTS_X(cfrg) ((cfrg)->n_descripts)
|
|
#define CFRG_N_DESCRIPTS(cfrg) (CL (CFRG_N_DESCRIPTS_X (cfrg)))
|
|
|
|
typedef struct
|
|
{
|
|
OSType isa PACKED;
|
|
uint32 update_level PACKED;
|
|
uint32 current_version PACKED;
|
|
uint32 oldest_definition_version PACKED;
|
|
uint32 stack_size PACKED;
|
|
int16 appl_library_dir PACKED;
|
|
uint8 fragment_type PACKED;
|
|
uint8 fragment_location PACKED;
|
|
int32 offset_to_fragment PACKED;
|
|
int32 fragment_length PACKED;
|
|
uint32 reserved0 PACKED;
|
|
uint32 reserved1 PACKED;
|
|
uint16 cfir_length PACKED;
|
|
unsigned char name[1] PACKED;
|
|
}
|
|
cfir_t;
|
|
|
|
#define CFIR_ISA_X(cfir) ((cfir)->isa)
|
|
#define CFIR_ISA(cfir) (CL (CFIR_ISA_X (cfir)))
|
|
|
|
#define CFIR_TYPE_X(cfir) ((cfir)->fragment_type)
|
|
#define CFIR_TYPE(cfir) (CB (CFIR_TYPE_X (cfir)))
|
|
|
|
#define CFIR_LOCATION_X(cfir) ((cfir)->fragment_location)
|
|
#define CFIR_LOCATION(cfir) (CL (CFIR_LOCATION_X(cfir)))
|
|
|
|
#define CFIR_LENGTH_X(cfir) ((cfir)->cfir_length)
|
|
#define CFIR_LENGTH(cfir) (CL (CFIR_LENGTH_X(cfir)))
|
|
|
|
#define CFIR_OFFSET_TO_FRAGMENT_X(cfir) ((cfir)->offset_to_fragment)
|
|
#define CFIR_OFFSET_TO_FRAGMENT(cfir) (CL (CFIR_OFFSET_TO_FRAGMENT_X(cfir)))
|
|
|
|
#define CFIR_FRAGMENT_LENGTH_X(cfir) ((cfir)->fragment_length)
|
|
#define CFIR_FRAGMENT_LENGTH(cfir) (CL (CFIR_FRAGMENT_LENGTH_X(cfir)))
|
|
|
|
#define CFIR_NAME(cfir) ((cfir)->name)
|
|
|
|
enum
|
|
{
|
|
kImportLibraryCFrag,
|
|
kApplicationCFrag,
|
|
kDropInAdditionCFrag,
|
|
kStubLibraryCFrag,
|
|
kWeakStubLibraryCFrag,
|
|
};
|
|
|
|
|
|
enum
|
|
{
|
|
kWholeFork = 0
|
|
};
|
|
|
|
enum
|
|
{
|
|
kInMem, kOnDiskFlat, kOnDiskSegmented,
|
|
};
|
|
|
|
enum
|
|
{
|
|
kPowerPCArch = T('p', 'w', 'p', 'c'),
|
|
kMotorola68KArch = T('m', '6', '8', 'k'),
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
kLoadLib = 1, /* deprecated */
|
|
kReferenceCFrag = 1,
|
|
kFindLib = 2,
|
|
kLoadNewCopy = 5,
|
|
}
|
|
LoadFlags;
|
|
|
|
typedef struct MemFragment
|
|
{
|
|
Ptr address PACKED;
|
|
uint32 length PACKED;
|
|
BOOLEAN inPlace PACKED;
|
|
}
|
|
MemFragment;
|
|
|
|
typedef struct DiskFragment
|
|
{
|
|
FSSpecPtr fileSpec PACKED;
|
|
uint32 offset PACKED;
|
|
uint32 length PACKED;
|
|
}
|
|
DiskFragment;
|
|
|
|
typedef struct SegmentedFragment
|
|
{
|
|
FSSpecPtr fileSpec PACKED;
|
|
OSType rsrcType PACKED;
|
|
INTEGER rsrcID PACKED;
|
|
}
|
|
SegmentedFragment;
|
|
|
|
typedef struct FragmentLocator
|
|
{
|
|
uint32 where PACKED;
|
|
union
|
|
{
|
|
MemFragment inMem;
|
|
DiskFragment onDisk;
|
|
SegmentedFragment inSegs;
|
|
}
|
|
u PACKED;
|
|
}
|
|
FragmentLocator;
|
|
|
|
typedef struct InitBlock
|
|
{
|
|
uint32 contextID PACKED;
|
|
uint32 closureID PACKED;
|
|
FragmentLocator fragLocator PACKED;
|
|
Ptr libName PACKED;
|
|
uint32 reserved4a PACKED;
|
|
uint32 reserved4b PACKED;
|
|
uint32 reserved4c PACKED;
|
|
uint32 reserved4d PACKED;
|
|
}
|
|
InitBlock;
|
|
|
|
typedef struct CFragConnection *ConnectionID;
|
|
|
|
extern OSErr C_GetDiskFragment (FSSpecPtr fsp, LONGINT offset, LONGINT length,
|
|
Str63 fragname, LoadFlags flags,
|
|
ConnectionID *connp, Ptr *mainAddrp,
|
|
Str255 errname);
|
|
|
|
typedef uint8 SymClass;
|
|
|
|
extern OSErr C_FindSymbol (ConnectionID connID, Str255 symName, Ptr *symAddr,
|
|
SymClass *symClass);
|
|
|
|
|
|
extern char *ROMlib_p2cstr (StringPtr str);
|
|
|
|
/* NOTE: The following data structures are just for proof-of-concept
|
|
use. They are not going to be compatible with what is really on a
|
|
Macintosh, but they may be good enough to get PS5.5 limping. */
|
|
|
|
typedef struct
|
|
{
|
|
syn68k_addr_t start;
|
|
uint32 length;
|
|
uint32 ref_count;
|
|
uint8 perms;
|
|
}
|
|
section_info_t;
|
|
|
|
typedef struct CFragConnection
|
|
{
|
|
FragmentLocator frag;
|
|
struct PEFLoaderInfoHeader *lihp;
|
|
uint32 ref_count;
|
|
uint32 n_sects;
|
|
section_info_t sects[0];
|
|
}
|
|
CFragConnection_t;
|
|
|
|
enum
|
|
{
|
|
fragConnectionIDNotFound = -2801,
|
|
fragSymbolNotFound = -2802,
|
|
fragLibNotFound = -2804,
|
|
fragNoMem = -2809
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
ConnectionID cid;
|
|
int32 n_symbols;
|
|
int32 first_symbol;
|
|
}
|
|
lib_t;
|
|
|
|
#define LIB_CID_X(l) ((l)->cid)
|
|
#define LIB_CID(l) (CL (LIB_CID_X (l)))
|
|
|
|
#define LIB_N_SYMBOLS_X(l) ((l)->n_symbols)
|
|
#define LIB_N_SYMBOLS(l) (CL (LIB_N_SYMBOLS_X (l)))
|
|
|
|
#define LIB_FIRST_SYMBOL_X(l) ((l)->first_symbol)
|
|
#define LIB_FIRST_SYMBOL(l) (CL (LIB_FIRST_SYMBOL_X (l)))
|
|
|
|
typedef struct
|
|
{
|
|
uint32 n_libs;
|
|
lib_t libs[0];
|
|
}
|
|
CFragClosure_t;
|
|
|
|
#define N_LIBS_X(c) ((c)->n_libs)
|
|
#define N_LIBS(c) (CL (N_LIBS_X (c)))
|
|
|
|
typedef CFragClosure_t *CFragClosureID;
|
|
|
|
typedef struct
|
|
{
|
|
const char *symbol_name;
|
|
void *value;
|
|
}
|
|
map_entry_t;
|
|
|
|
extern cfir_t *ROMlib_find_cfrg (Handle cfrg, OSType arch, uint8 type,
|
|
Str255 name);
|
|
|
|
extern OSErr C_CloseConnection (ConnectionID *cidp);
|
|
|
|
|
|
extern OSErr C_GetSharedLibrary (Str63 library, OSType arch,
|
|
LoadFlags loadflags,
|
|
ConnectionID *cidp, Ptr *mainaddrp,
|
|
Str255 errName);
|
|
|
|
extern OSErr C_GetMemFragment (void * addr, uint32 length, Str63 fragname,
|
|
LoadFlags flags, ConnectionID *connp,
|
|
Ptr *mainAddrp, Str255 errname);
|
|
|
|
extern OSErr C_CountSymbols (ConnectionID id, LONGINT *countp);
|
|
|
|
extern OSErr C_GetIndSymbol (ConnectionID id, LONGINT index,
|
|
Str255 name, Ptr *addrp,
|
|
SymClass *classp);
|
|
|
|
extern ConnectionID ROMlib_new_connection (uint32 n_sects);
|
|
extern void ROMlib_release_tracking_values (void);
|
|
|
|
#endif
|