|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /*
25: * Copyright (c) 1997 Apple Computer, Inc.
26: *
27: *
28: * HISTORY
29: *
30: * Simon Douglas 22 Oct 97
31: * - first checked in.
32: */
33:
34:
35: /*
36: File: zPEF.h
37:
38: Contains: PEF format declarations.
39:
40: Version: Maxwell
41:
42: Copyright: � 1992-1996 by Apple Computer, Inc., all rights reserved.
43:
44: File Ownership:
45:
46: DRI: Alan Lillich
47:
48: Other Contact: <<unknown>>
49:
50: Technology: Core Runtime
51:
52: Writers:
53:
54: (AWL) Alan Lillich
55: (ELE) Erik Eidt
56:
57: Change History (most recent first):
58:
59: <7> 2/28/96 AWL Adapt for new container handler model.
60: <6> 4/12/95 AWL Fix bit field problem.
61: <5> 8/29/94 AWL Remove "never" share mode.
62: <4> 8/23/94 AWL Update section sharing constants.
63: <3> 4/28/94 AWL Simplify cross address space use for booting.
64: <2> 4/11/94 AWL Use 68K alignment for the export symbol structure.
65: <1> 2/15/94 AWL Initial checkin for kernel based CFM.
66:
67: -------------------------------------------------------------------------------------
68:
69: <7> 8/26/93 AWL Move CFTypes.h and CFLoader.h up with other Apple private headers.
70: <5> 7/8/93 AWL (&ELE) Fixed version field names in import file IDs
71: <4> 6/9/93 JRG ELE & AWL Changes:
72: <4> 06/08/93 AWL (&ELE) Added more standard section types and packed data opcodes.
73: <3> 9/23/92 ELE added precomputed hash table for improved runtime performance.
74:
75: Version 1.3 Erik Eidt 9/23/92 updated for new hash table capabilities
76: Version 1.2 Erik Eidt 7/8/92 updated for new relocations and other loader section size optimizations
77: Version 1.1 Cheryl Lins 5/27/92 updated for PEF 1.2 definition
78: Version 1.0 Cheryl Lins 4/7/92 initial version
79: */
80:
81:
82: #ifndef __IOPEFINTERNALS__
83: #define __IOPEFINTERNALS__ 1
84:
85: #include <driverkit/ppc/IOMacOSTypes.h>
86: #include "IOPEFLoader.h"
87:
88:
89: typedef signed int PEF_SBits32; // ! Can't use SInt32, it is "signed long".
90: typedef unsigned int PEF_UBits32; // ! Can't use UInt32, it is "unsigned long".
91:
92:
93: #pragma options align=mac68k
94:
95: /*========== File Header ==========*/
96:
97: typedef struct {
98: UInt16 magic1; /* magic flag describing execution machine and environment */
99: UInt16 magic2; /* magic flag describing execution machine and environment */
100: OSType fileTypeID; /* OSType identifier = 'pef' */
101: OSType architectureID; /* OSType identifier = 'pwpc' */
102: UInt32 versionNumber; /* version number of this file format */
103: UInt32 dateTimeStamp; /* Macintosh date/time stamp */
104: UInt32 oldDefVersion; /* old definition version number */
105: UInt32 oldImpVersion; /* old implementation version number */
106: UInt32 currentVersion; /* current version number */
107: SInt16 numberSections; /* number of sections */
108: SInt16 loadableSections; /* number of sections that are loadable for execution,
109: also the section # of first non-loadable section */
110: BytePtr memoryAddress; /* the location this container was last loaded */
111: } FileHeader, *FileHeaderPtr;
112:
113: #define kPEFVersion 1 /* current version number */
114: #define kPEFMagic1 0x4A6F /* value of magic1 for PEF */
115: #define kPEFMagic2 0x7921 /* value of magic2 for PEF */
116: #define kPEFTypeID 0x70656666 /* value of fileTypeID for 'peff' */
117: #define kPowerPCID 0x70777063 /* value of architecture ID 'pwpc' */
118:
119: /*========== Section Header ==========*/
120:
121: typedef struct {
122: ByteCount sectionName; /* offset into global string table for section name */
123: BytePtr sectionAddress; /* preferred base address for the section */
124: ByteCount execSize; /* section size in bytes during execution in memory including zero initialization */
125: ByteCount initSize; /* section size in bytes during execution in memory before zero initialization */
126: ByteCount rawSize; /* section size in bytes in container before loading */
127: ByteCount containerOffset;/* container offest to section's raw data */
128: UInt8 regionKind; /* section/region classification */
129: UInt8 shareKind; /* sharing classification */
130: UInt8 alignment; /* execution alignment requirement (0=byte,1=half,2=word,3=doubleword,4=quadword..) */
131: UInt8 reservedA;
132: } SectionHeader, *SectionHeaderPtr;
133:
134: /* TCFLSectionKind */
135: #define kPEFCodeSection 0
136: #define kPEFDataSection 1
137: #define kPEFPIDataSection 2
138: #define kPEFConstantSection 3
139: #define kPEFLoaderSection 4
140: #define kPEFDebugSection 5
141: #define kPEFExecDataSection 6
142: #define kPEFExceptionSection 7
143: #define kPEFTracebackSection 8
144:
145: /* TCFLShareKind */
146: #define kPEFContextShare 1
147: #define kPEFGlobalShare 4
148: #define kPEFProtectedShare 5
149:
150: /* Defines for PIDataSections */
151: #define kPEFZero 0
152: #define kPEFBlock 1
153: #define kPEFRepeat 2
154: #define kPEFRepeatBlock 3
155: #define kPEFRepeatZero 4
156: #define kPEFNoOpcode 0x0fff
157: #define kPEFOpcodeShift 5
158: #define kPEFFirstOperandMask 31
159:
160:
161: /*========== Loader Header ==========*/
162:
163: typedef struct {
164: SInt32 entryPointSection; /* section number containing entry point descriptor */
165: ByteCount entryPointOffset; /* offset to entry point descriptor within section */
166:
167: SInt32 initPointSection; /* section number containing entry point descriptor */
168: ByteCount initPointOffset; /* offset to entry point descriptor within section */
169:
170: SInt32 termPointSection; /* section number containing entry point descriptor */
171: ByteCount termPointOffset; /* offset to entry point descriptor within section */
172:
173: ItemCount numImportFiles; /* number of import file id entries */
174: ItemCount numImportSyms; /* number of import symbol table entries */
175: ItemCount numSections; /* number of sections with load-time relocations */
176: ByteCount relocationsOffset; /* offset to relocation descriptions table */
177:
178: ByteCount stringsOffset; /* offset to loader string table */
179:
180: ByteCount hashSlotTable; /* offset to hash slot table */
181: ItemCount hashSlotTabSize; /* number of hash slot entries */
182: ItemCount numExportSyms; /* number of export symbol table entries */
183: } LoaderHeader, *LoaderHeaderPtr;
184:
185: /*========== Loader Section Header ==========*/
186:
187: typedef struct {
188: SInt16 sectionNumber; /* reference to primary section number */
189: SInt16 reservedA; /* if TSectNum were 16 bits, which it isn't */
190: ItemCount numRelocations; /* number of loader relocations for this section */
191: ByteCount relocationsOffset; /* offset to relocation descriptions for this section */
192: } LoaderRelExpHeader, *LoaderRelExpHeaderPtr;
193:
194: /*========== Loader Import File ID's Entry ==========*/
195:
196: typedef struct {
197: ByteCount fileNameOffset; /* offset into loader string table for file name */
198: UInt32 oldImpVersion; /* oldest compatible implementation library */
199: UInt32 linkedVersion; /* current version at link time */
200: ItemCount numImports; /* number of imports from this file */
201: ItemCount impFirst; /* number of the first imports from this file (relative to all imports) */
202: UInt8 options; /* call this libraries initialization routine before mine */
203: UInt8 reservedA;
204: UInt16 reservedB;
205: } LoaderImportFileID, *LoaderImportFileIDPtr;
206:
207: #define kPEFInitBeforeMask 0x80
208: #define kPEFWeakLibraryMask 0x40
209: #define kPEFDeferredBindMask 0x20
210:
211: /*========== Loader Import Symbol Table Entry ==========*/
212:
213: typedef struct {
214: PEF_UBits32 symClass : 8; // Actually ot type TCFLSymbolClass.
215: PEF_UBits32 nameOffset : 24;
216: } LoaderImport, *LoaderImportPtr;
217:
218: #define kPEFWeakSymbolMask 0x80
219:
220: /*========== Loader Export Hash Slot Table Entry ==========*/
221:
222: typedef struct {
223: PEF_UBits32 chainCount : 14;
224: PEF_UBits32 chainIndex : 18;
225: } HashSlotEntry, *HashSlotEntryPtr;
226:
227: #define PEFHashHighBits(hashword,bitCount) ((hashword) >> (bitCount))
228: #define PEFHashMaskBits(hashword,bitCount) (((UInt32)(1) << (bitCount)) - 1)
229:
230: #define GetPEFHashSlot(hashword,bitCount) \
231: ( (ItemCount) (((hashword) ^ PEFHashHighBits((hashword),(bitCount))) & PEFHashMaskBits((hashword),(bitCount))) )
232:
233: /*========== Loader Export Hash Chain Table Entry ==========*/
234:
235: typedef struct {
236: UInt32 hashword; /* (hashword >> 16) == nameLength !! */
237: } HashChainEntry, *HashChainEntryPtr;
238:
239: /*========== Loader Export Symbol Table Entry ==========*/
240:
241: /* Section number controls how 'address' is interpreted.
242: >=0: section number exporting the symbol; 'address' is offset from start of the section to
243: the symbol being exported (ie address of a routine or data item)
244: -1: value is absolute (non-relocatable)
245: -2: value is a physical address (non-relocatable)
246: -3: re-export imported symbol whose number is in 'address'
247: */
248:
249: /* this struct is stored in the file, non-aligned: size = 10 */
250: typedef struct {
251: PEF_UBits32 symClass : 8; // Actually ot type TCFLSymbolClass.
252: PEF_UBits32 nameOffset : 24;
253: ByteCount offset; /* offset into section to exported symbol */
254: SInt16 sectionNumber;
255: } LoaderExport, *LoaderExportPtr;
256:
257: #define SIZEOF_LoaderExport (sizeof (TUnsigned32)*2 + sizeof (SInt16))
258:
259:
260: #define kPEFAbsoluteExport -1
261: #define kPEFPhysicalExport -2
262: #define kPEFReExportImport -3
263:
264: /*========== Loader Relocation Entry ==========*/
265:
266: typedef UInt16 RelocInstr;
267:
268: typedef union {
269: struct { unsigned op:7, rest:9; } opcode;
270: struct { unsigned op:2, delta_d4:8, cnt:6; } deltadata;
271: struct { unsigned op:7, cnt_m1:9; } run;
272: struct { unsigned op:7, idx:9; } glp;
273: struct { unsigned op:4, delta_m1:12; } delta;
274: struct { unsigned op:4, icnt_m1:4, rcnt_m1:8; } rpt;
275: struct { unsigned op:6, idx_top:10; } large1;
276: struct { unsigned op:6, cnt_m1:4, idx_top:6; } large2;
277: UInt16 instr;
278: UInt16 bot;
279: } Relocation;
280:
281: // opcode definitions which can be used with
282: // Relocation.opcode.op:7, if masked properly
283: // by the up coming table
284: // (NOTE: a half word of 0 is garunteed to be an unused relocation instruction)
285:
286: #define krDDAT 0x00 // type deltadata
287:
288: #define krCODE 0x20 // type run
289: #define krDATA 0x21 // type run
290: #define krDESC 0x22 // type run
291: #define krDSC2 0x23 // type run
292: #define krVTBL 0x24 // type run
293: #define krSYMR 0x25 // type run
294: // 0x26
295: // 0x2F
296:
297: #define krSYMB 0x30 // type glp
298: #define krCDIS 0x31 // type glp
299: #define krDTIS 0x32 // type glp
300: #define krSECN 0x33 // type glp
301: // 0x34
302: // 0x3F
303:
304: #define krDELT 0x40 // type delta
305: #define krRPT 0x48 // type rpt
306:
307: #define krLABS 0x50 // type large1
308: #define krLSYM 0x52 // type large1
309: // 0x54
310: // 0x56
311:
312: #define krLRPT 0x58 // type large2
313: #define krLSEC 0x5A // type large2
314: // 0x5C
315: // 0x5E
316:
317: // LSEC usage:
318: // LSEC 0, n -- Long SECN
319: // LSEC 1, n -- Long CDIS
320: // LSEC 2, n -- Long DTIS
321: // LSEC 3, n -- free
322: // LSEC 15, n -- free
323:
324: // constants that indicate the maximum sizes of fields
325: // (before packing, ie: subtracting one, in some cases)
326:
327: #define ksDELTA 4096 // delta max for DELTA from
328:
329: #define ksDDDMAX 1023 // delta max for DELTA-DAT (DDAT) form
330: #define ksDDRMAX 63 // run max for DELTA-DAT (DDAT) form
331:
332: #define ksCODE 512 // count max for CODE form
333: #define ksDATA 512 // count max for DATA form
334: #define ksDEMAX 512 // count max for DESC form
335: #define ksVTMAX 512 // count max for VTBL form
336: #define ksISMAX 512 // count max for IMPS form
337: #define ksRPTMAX 256 // count max for RPT form
338:
339: #define IsLARG(op) (((op) & 0x70) == 0x50)
340:
341: #define RELOPSHFT 9
342:
343: #define ksDVDMAX 0 // (63) delta max for DELTA-VTBL (DVBL) form
344: #define ksDVRMAX 0 // (256) run max for DELTA-VTBL (DVBL) form
345:
346: #define krXXXX 0xff
347:
348:
349: /*
350: From: PEFBinaryFormat.i
351: Revision: 9
352: */
353:
354: enum {
355: /* The packed data opcodes. */
356: kPEFPkDataZero = 0, /* Zero fill "count" bytes. */
357: kPEFPkDataBlock = 1, /* Block copy "count" bytes. */
358: kPEFPkDataRepeat = 2, /* Repeat "count" bytes "count2"+1 times. */
359: kPEFPkDataRepeatBlock = 3, /* Interleaved repeated and unique data. */
360: kPEFPkDataRepeatZero = 4 /* Interleaved zero and unique data. */
361: };
362:
363:
364: enum {
365: kPEFPkDataOpcodeShift = 5,
366: kPEFPkDataCount5Mask = 0x1F,
367: kPEFPkDataMaxCount5 = 31,
368: kPEFPkDataVCountShift = 7,
369: kPEFPkDataVCountMask = 0x7F,
370: kPEFPkDataVCountEndMask = 0x80
371: };
372:
373: #define PEFPkDataOpcode(byte) ( ((UInt8)(byte)) >> kPEFPkDataOpcodeShift )
374:
375: #define PEFPkDataCount5(byte) ( ((UInt8)(byte)) & kPEFPkDataCount5Mask )
376:
377: #define PEFPkDataComposeInstr(opcode,count5) \
378: ( (((UInt8)(opcode)) << kPEFPkDataOpcodeShift) | ((UInt8)(count5)) )
379:
380:
381:
382:
383:
384: /*
385: File: CodeFragmentContainerPriv.h
386:
387: Contains: Physical container routines of the ModernOS version of CFM.
388:
389: Version: Maxwell
390:
391: DRI: Alan Lillich
392:
393: Copyright: � 1984-1996 by Apple Computer, Inc.
394: All rights reserved.
395:
396: Warning: *** APPLE INTERNAL USE ONLY ***
397: This file contains unreleased SPI's
398:
399: BuildInfo: Built by: Simon Douglas
400: With Interfacer: 2.0d13 (PowerPC native)
401: From: CodeFragmentContainerPriv.i
402: Revision: 9
403: Dated: 10/9/96
404: Last change by: AWL
405: Last comment: Remove special SMP sharing, using prepare option instead.
406:
407: Bugs: Report bugs to Radar component �System Interfaces�, �Latest�
408: List the version information (from above) in the Problem Description.
409:
410: */
411: /*
412: -------------------------------------------------------------------------------------------
413: This file contains what used to be called the CFLoader interface. The name was changed to
414: fit the newer convention of having CodeFragment as a common prefix, and to reduce pervasive
415: confusion between the Code Fragment Manager and the Code Fragment Loaders, promulgated by
416: the long history of the Segment Loader. This file defines the abstract interface to the
417: physical representation of code fragments.
418: !!! This version has minimal comments, the main purpose is to get things compiled.
419: */
420:
421:
422: /*
423: �
424: ===========================================================================================
425: General Types and Constants
426: ===========================
427: */
428: typedef SInt32 CFContSignedIndex;
429: typedef UInt32 CFContStringHash;
430: #define CFContStringHashLength(hashValue) ((hashValue) >> 16)
431: struct CFContHashedName {
432: CFContStringHash nameHash; /* ! Includes the name length.*/
433: BytePtr nameText;
434: };
435: typedef struct CFContHashedName CFContHashedName;
436:
437: /*
438: ------------------------------------------
439: Declarations for code fragment containers.
440: */
441:
442: enum {
443: kCFContContainerInfoVersion = 0x00010001
444: };
445:
446: struct CFContContainerInfo {
447: CFContHashedName cfragName;
448: UInt32 modDate; /* !!! Abstract type?*/
449: OSType architecture;
450: CFragVersionNumber currentVersion;
451: CFragVersionNumber oldImpVersion;
452: CFragVersionNumber oldDefVersion;
453: UInt32 reservedA;
454: void * reservedB;
455: };
456: typedef struct CFContContainerInfo CFContContainerInfo;
457:
458: /*
459: ----------------------------------------
460: Declarations for code fragment sections.
461: */
462: struct CFContLogicalLocation {
463: CFContSignedIndex section; /* "Real" sections use zero based indices, special ones are negative.*/
464: ByteCount offset;
465: };
466: typedef struct CFContLogicalLocation CFContLogicalLocation;
467:
468:
469: enum {
470: kCFContNoSectionIndex = -1,
471: kCFContAbsoluteSectionIndex = -2,
472: kCFContReexportSectionIndex = -3
473: };
474:
475: typedef UInt8 CFContSectionSharing;
476:
477: enum {
478: kCFContShareSectionInClosure = 0, /* ! Not supported at present!*/
479: kCFContShareSectionInProcess = 1,
480: kCFContShareSectionAcrossSystem = 4,
481: kCFContShareSectionWithProtection = 5
482: };
483:
484: typedef UInt8 CFContMemoryAccess;
485:
486: enum {
487: kCFContMemReadMask = 0x01, /* Readable memory can also be executed.*/
488: kCFContMemWriteMask = 0x02,
489: kCFContMemExecuteMask = 0x04, /* ! Affects cache actions, not protection!*/
490: kCFContReadOnlyData = kCFContMemReadMask,
491: kCFContWriteableData = kCFContMemReadMask | kCFContMemWriteMask,
492: kCFContNormalCode = kCFContMemReadMask | kCFContMemExecuteMask,
493: kCFContExcludedMemory = 0
494: };
495:
496: typedef UInt32 CFContSectionOptions;
497:
498: enum {
499: /* Values for CFContSectionOptions.*/
500: kPackedCFContSectionMask = 0x01, /* Stored contents are compressed.*/
501: kRelocatedCFContSectionMask = 0x02, /* Section contents have relocations.*/
502: kEmptyFillCFContSectionMask = 0x04, /* The extension part may be left untouched.*/
503: kResidentCFContSectionMask = 0x08,
504: kPrefaultCFContSectionMask = 0x10
505: };
506:
507:
508: enum {
509: kCFContSectionInfoVersion = 0x00010001
510: };
511:
512: struct CFContSectionInfo {
513: CFContHashedName sectionName;
514: CFContMemoryAccess access;
515: CFContSectionSharing sharing;
516: UInt8 alignment; /* ! The power of 2, a.k.a. number of low order zero bits.*/
517: UInt8 reservedA;
518: CFContSectionOptions options;
519: ByteCount containerOffset;
520: ByteCount containerLength;
521: ByteCount unpackedLength;
522: ByteCount totalLength;
523: LogicalAddress defaultAddress;
524: UInt32 reservedB;
525: void * reservedC;
526: };
527: typedef struct CFContSectionInfo CFContSectionInfo;
528:
529: /*
530: ----------------------------------
531: Declarations for exported symbols.
532: */
533: typedef UInt32 CFContExportedSymbolOptions;
534: /*
535: ! enum { // Values for CFContExportedSymbolOptions.
536: ! // ! No options at present.
537: ! };
538: */
539:
540: enum {
541: kCFContExportedSymbolInfoVersion = 0x00010001
542: };
543:
544: struct CFContExportedSymbolInfo {
545: CFContHashedName symbolName;
546: CFContLogicalLocation location;
547: CFContExportedSymbolOptions options;
548: CFragSymbolClass symbolClass;
549: UInt8 reservedA;
550: UInt16 reservedB;
551: UInt32 reservedC;
552: void * reservedD;
553: };
554: typedef struct CFContExportedSymbolInfo CFContExportedSymbolInfo;
555:
556: /*
557: ------------------------------------------------
558: Declarations for imported libraries and symbols.
559: */
560: typedef UInt32 CFContImportedLibraryOptions;
561:
562: enum {
563: /* Values for CFContImportedLibraryOptions.*/
564: kCFContWeakLibraryMask = 0x01, /* ! Same as kCFContWeakSymbolMask to reduce errors.*/
565: kCFContInitBeforeMask = 0x02,
566: kCFContDeferredBindMask = 0x04
567: };
568:
569:
570: enum {
571: kCFContImportedLibraryInfoVersion = 0x00010001
572: };
573:
574: struct CFContImportedLibraryInfo {
575: CFContHashedName libraryName;
576: CFragVersionNumber linkedVersion;
577: CFragVersionNumber oldImpVersion;
578: CFContImportedLibraryOptions options;
579: };
580: typedef struct CFContImportedLibraryInfo CFContImportedLibraryInfo;
581:
582: typedef UInt32 CFContImportedSymbolOptions;
583:
584: enum {
585: /* Values for CFContImportedSymbolOptions.*/
586: kCFContWeakSymbolMask = 0x01 /* ! Same as kCFContWeakLibraryMask to reduce errors.*/
587: };
588:
589:
590: enum {
591: kCFContImportedSymbolInfoVersion = 0x00010001
592: };
593:
594: struct CFContImportedSymbolInfo {
595: CFContHashedName symbolName;
596: ItemCount libraryIndex;
597: CFContImportedSymbolOptions options;
598: CFragSymbolClass symbolClass;
599: UInt8 reservedA;
600: UInt16 reservedB;
601: UInt32 reservedC;
602: void * reservedD;
603: };
604: typedef struct CFContImportedSymbolInfo CFContImportedSymbolInfo;
605:
606: /*
607: -------------------------------------------------
608: Declarations for dealing with container handlers.
609: */
610: typedef UInt32 CFContOpenOptions;
611:
612: enum {
613: /* Values for CFContOpenOptions.*/
614: kCFContPrepareInPlaceMask = 0x01,
615: kCFContMinimalOpenMask = 0x02
616: };
617:
618: typedef UInt32 CFContCloseOptions;
619:
620: enum {
621: /* Values for CFContCloseOptions.*/
622: kCFContPartialCloseMask = 0x01
623: };
624:
625: typedef struct OpaqueCFContHandlerRef* CFContHandlerRef;
626: typedef struct CFContHandlerProcs CFContHandlerProcs;
627: typedef CFContHandlerProcs *CFContHandlerProcsPtr;
628: typedef LogicalAddress (*CFContAllocateMem)(ByteCount size);
629: typedef void (*CFContReleaseMem)(LogicalAddress address);
630: /*
631: �
632: ===========================================================================================
633: Container Handler Routines
634: ==========================
635: */
636: typedef OSStatus (*CFCont_OpenContainer)(LogicalAddress mappedAddress, LogicalAddress runningAddress, ByteCount containerLength, KernelProcessID runningProcessID, const CFContHashedName *cfragName, CFContOpenOptions options, CFContAllocateMem Allocate, CFContReleaseMem Release, CFContHandlerRef *containerRef, CFContHandlerProcsPtr *handlerProcs);
637: typedef OSStatus (*CFCont_CloseContainer)(CFContHandlerRef containerRef, CFContCloseOptions options);
638: typedef OSStatus (*CFCont_GetContainerInfo)(CFContHandlerRef containerRef, PBVersion infoVersion, CFContContainerInfo *containerInfo);
639: /* -------------------------------------------------------------------------------------------*/
640: typedef OSStatus (*CFCont_GetSectionCount)(CFContHandlerRef containerRef, ItemCount *sectionCount);
641: typedef OSStatus (*CFCont_GetSectionInfo)(CFContHandlerRef containerRef, ItemCount sectionIndex, PBVersion infoVersion, CFContSectionInfo *sectionInfo);
642: typedef OSStatus (*CFCont_FindSectionInfo)(CFContHandlerRef containerRef, const CFContHashedName *sectionName, PBVersion infoVersion, ItemCount *sectionIndex, CFContSectionInfo *sectionInfo);
643: typedef OSStatus (*CFCont_SetSectionAddress)(CFContHandlerRef containerRef, ItemCount sectionIndex, LogicalAddress mappedAddress, LogicalAddress runningAddress);
644: /* -------------------------------------------------------------------------------------------*/
645: typedef OSStatus (*CFCont_GetAnonymousSymbolLocations)(CFContHandlerRef containerRef, CFContLogicalLocation *mainLocation, CFContLogicalLocation *initLocation, CFContLogicalLocation *termLocation);
646: /* -------------------------------------------------------------------------------------------*/
647: typedef OSStatus (*CFCont_GetExportedSymbolCount)(CFContHandlerRef containerRef, ItemCount *exportCount);
648: typedef OSStatus (*CFCont_GetExportedSymbolInfo)(CFContHandlerRef containerRef, CFContSignedIndex exportedIndex, PBVersion infoVersion, CFContExportedSymbolInfo *exportInfo);
649: typedef OSStatus (*CFCont_FindExportedSymbolInfo)(CFContHandlerRef containerRef, const CFContHashedName *exportName, PBVersion infoVersion, ItemCount *exportIndex, CFContExportedSymbolInfo *exportInfo);
650: /* -------------------------------------------------------------------------------------------*/
651: typedef OSStatus (*CFCont_GetImportCounts)(CFContHandlerRef containerRef, ItemCount *libraryCount, ItemCount *symbolCount);
652: typedef OSStatus (*CFCont_GetImportedLibraryInfo)(CFContHandlerRef containerRef, ItemCount libraryIndex, PBVersion infoVersion, CFContImportedLibraryInfo *libraryInfo);
653: typedef OSStatus (*CFCont_GetImportedSymbolInfo)(CFContHandlerRef containerRef, ItemCount symbolIndex, PBVersion infoVersion, CFContImportedSymbolInfo *symbolInfo);
654: typedef OSStatus (*CFCont_SetImportedSymbolAddress)(CFContHandlerRef containerRef, ItemCount symbolIndex, LogicalAddress symbolAddress);
655: /* -------------------------------------------------------------------------------------------*/
656: typedef OSStatus (*CFCont_UnpackSection)(CFContHandlerRef containerRef, ItemCount sectionIndex, ByteCount sectionOffset, LogicalAddress bufferAddress, ByteCount bufferLength);
657: typedef OSStatus (*CFCont_RelocateSection)(CFContHandlerRef containerRef, ItemCount sectionIndex);
658: typedef OSStatus (*CFCont_RelocateImportsOnly)(CFContHandlerRef containerRef, ItemCount sectionIndex, ItemCount libraryIndex);
659: typedef OSStatus (*CFCont_MakeSectionExecutable)(CFContHandlerRef containerRef, ItemCount sectionIndex);
660: typedef OSStatus (*CFCont_AllocateSection)(CFContHandlerRef containerRef, ItemCount sectionIndex, LogicalAddress *mappedAddress, LogicalAddress *runningAddress);
661: typedef OSStatus (*CFCont_ReleaseSection)(CFContHandlerRef containerRef, ItemCount sectionIndex);
662: /* -------------------------------------------------------------------------------------------*/
663:
664: #if 0
665: struct CFContHandlerInfo {
666: OrderedItemName orderedName;
667: OrderRequirements orderedReq;
668: CFCont_OpenContainer OpenHandler;
669: };
670: typedef struct CFContHandlerInfo CFContHandlerInfo;
671: #endif
672:
673: struct CFContHandlerProcs {
674: ItemCount procCount;
675: CFragShortVersionPair abiVersion;
676:
677: CFCont_OpenContainer OpenContainer; /* 1*/
678: CFCont_CloseContainer CloseContainer; /* 2*/
679: CFCont_GetContainerInfo GetContainerInfo; /* 3*/
680:
681: CFCont_GetSectionCount GetSectionCount; /* 4*/
682: CFCont_GetSectionInfo GetSectionInfo; /* 5*/
683: CFCont_FindSectionInfo FindSectionInfo; /* 6*/
684: CFCont_SetSectionAddress SetSectionAddress; /* 7*/
685:
686: CFCont_GetAnonymousSymbolLocations GetAnonymousSymbolLocations; /* 8*/
687:
688: CFCont_GetExportedSymbolCount GetExportedSymbolCount; /* 9*/
689: CFCont_GetExportedSymbolInfo GetExportedSymbolInfo; /* 10*/
690: CFCont_FindExportedSymbolInfo FindExportedSymbolInfo; /* 11*/
691:
692: CFCont_GetImportCounts GetImportCounts; /* 12*/
693: CFCont_GetImportedLibraryInfo GetImportedLibraryInfo; /* 13*/
694: CFCont_GetImportedSymbolInfo GetImportedSymbolInfo; /* 14*/
695: CFCont_SetImportedSymbolAddress SetImportedSymbolAddress; /* 15*/
696:
697: CFCont_UnpackSection UnpackSection; /* 16*/
698: CFCont_RelocateSection RelocateSection; /* 17*/
699: CFCont_RelocateImportsOnly RelocateImportsOnly; /* 18*/
700: CFCont_MakeSectionExecutable MakeSectionExecutable; /* 19 (Opt.)*/
701: CFCont_AllocateSection AllocateSection; /* 20 (Opt.)*/
702: CFCont_ReleaseSection ReleaseSection; /* 21 (Opt.)*/
703: };
704:
705:
706: enum {
707: kCFContMinimumProcCount = 18,
708: kCFContCurrentProcCount = 21,
709: kCFContHandlerABIVersion = 0x00010001
710: };
711:
712: /*
713: -----------------------------------------------------------------------------------------
714: The ABI version is a pair of UInt16s used as simple counters. The high order part is the
715: current version number, the low order part is the oldest compatible definition version.
716: number. This pair is to be used by the specific container handlers to describe what
717: version of the container handler ABI they support.
718: 0x00010001
719: ----------
720: The initial release of this ABI. (The old CFLoader ABI does not count.)
721: �
722: ===========================================================================================
723: General Routines
724: ================
725: */
726: extern CFContStringHash CFContHashName(BytePtr nameText, ByteCount nameLength);
727:
728: #if 0
729:
730: /* -------------------------------------------------------------------------------------------*/
731: extern OSStatus CFContOpenContainer(LogicalAddress mappedAddress, LogicalAddress runningAddress, ByteCount containerLength, KernelProcessID runningProcessID, const CFContHashedName *cfragName, CFContOpenOptions options, CFContAllocateMem Allocate, CFContReleaseMem Release, CFContHandlerRef *containerRef, CFContHandlerProcsPtr *handlerProcs);
732:
733: /* -------------------------------------------------------------------------------------------*/
734: extern OSStatus CFContRegisterContainerHandler(const OrderedItemName *orderedName, const OrderRequirements *orderedReq, CFCont_OpenContainer OpenHandler, OrderedItemName *rejectingHandler);
735:
736: extern OSStatus CFContUnregisterContainerHandler(const OrderedItemName *orderedName);
737:
738: extern OSStatus CFContGetContainerHandlers(ItemCount requestedCount, ItemCount *totalCount, CFContHandlerInfo *handlers);
739:
740: /* -------------------------------------------------------------------------------------------*/
741: #endif
742:
743:
744:
745:
746:
747:
748: /*
749: File: PEFLoader.h
750:
751: Contains: PEF Loader Interface.
752:
753: Version: Maxwell
754:
755: Copyright: � 1992-1996 by Apple Computer, Inc., all rights reserved.
756:
757: File Ownership:
758:
759: DRI: Alan Lillich
760:
761: Other Contact: <<unknown>>
762:
763: Technology: Core Runtime
764:
765: Writers:
766:
767: (AWL) Alan Lillich
768: (ELE) Erik Eidt
769:
770: Change History (most recent first):
771:
772: <7> 8/23/96 AWL (1379028) Propagate changes from CodeFragmentContainerPriv.
773: <6> 2/28/96 AWL Adapt for new container handler model.
774: <5> 6/20/94 AWL Move private PEF loader info struct here to be visible to the
775: booting "wacky" PEF loader.
776: <4> 6/8/94 AWL Make all CFL routines visible for direct use in special cases
777: such as booting.
778: <3> 5/16/94 AWL Fix typo.
779: <2> 2/25/94 AWL Update for Q&D solution to loading across address spaces.
780: <1> 2/15/94 AWL Initial checkin for kernel based CFM.
781: */
782:
783: // ===========================================================================================
784:
785: enum {
786: kBuiltinSectionArraySize = 4
787: };
788:
789: struct PEFPrivateInfo { // !!! Clean up field names, collapse Booleans, etc.
790: CFContAllocateMem Allocate;
791: CFContReleaseMem Release;
792: BytePtr mappedContainer;
793: BytePtr runningContainer;
794: ItemCount sectionCount; // Just the instantiated sections.
795: SectionHeader * sections;
796: BytePtr stringTable;
797: ItemCount ldrSectionNo;
798: LoaderHeader * ldrHeader;
799: BytePtr ldrStringTable;
800: LoaderRelExpHeader * ldrSections;
801: LoaderImportFileID * ldrImportFiles;
802: LoaderImport * ldrImportSymbols;
803: HashSlotEntry * ldrHashSlot;
804: HashChainEntry * ldrHashChain;
805: LoaderExport * ldrExportSymbols;
806: BytePtr ldrRelocations;
807: BytePtr * mappedOrigins; // Mapped base address for each section.
808: ByteCount * runningOffsets; // Running offset from presumed address.
809: BytePtr * imports;
810: BytePtr originArray [kBuiltinSectionArraySize]; // ! Only used if big enough.
811: ByteCount offsetArray [kBuiltinSectionArraySize]; // ! Only used if big enough.
812: Boolean loadInPlace;
813: Boolean resolved;
814: };
815:
816: typedef struct PEFPrivateInfo PEFPrivateInfo;
817:
818:
819: // ===========================================================================================
820:
821:
822: extern OSStatus PEF_OpenContainer ( LogicalAddress mappedAddress,
823: LogicalAddress runningAddress,
824: ByteCount containerLength,
825: KernelProcessID runningProcessID,
826: const CFContHashedName * cfragName,
827: CFContOpenOptions options,
828: CFContAllocateMem Allocate,
829: CFContReleaseMem Release,
830: CFContHandlerRef * containerRef_o,
831: CFContHandlerProcs * * handlerProcs_o );
832:
833: extern OSStatus PEF_CloseContainer ( CFContHandlerRef containerRef,
834: CFContCloseOptions options );
835:
836: extern OSStatus PEF_GetContainerInfo ( CFContHandlerRef containerRef,
837: PBVersion infoVersion,
838: CFContContainerInfo * containerInfo );
839:
840: // -------------------------------------------------------------------------------------------
841:
842: extern OSStatus PEF_GetSectionCount ( CFContHandlerRef containerRef,
843: ItemCount * sectionCount );
844:
845: extern OSStatus PEF_GetSectionInfo ( CFContHandlerRef containerRef,
846: ItemCount sectionIndex,
847: PBVersion infoVersion,
848: CFContSectionInfo * sectionInfo );
849:
850: extern OSStatus PEF_FindSectionInfo ( CFContHandlerRef containerRef,
851: const CFContHashedName * sectionName,
852: PBVersion infoVersion,
853: ItemCount * sectionIndex, // May be null.
854: CFContSectionInfo * sectionInfo ); // May be null.
855:
856: extern OSStatus PEF_SetSectionAddress ( CFContHandlerRef containerRef,
857: ItemCount sectionIndex,
858: LogicalAddress mappedAddress,
859: LogicalAddress runningAddress );
860:
861: // -------------------------------------------------------------------------------------------
862:
863: extern OSStatus PEF_GetAnonymousSymbolLocations ( CFContHandlerRef containerRef,
864: CFContLogicalLocation * mainLocation, // May be null.
865: CFContLogicalLocation * initLocation, // May be null.
866: CFContLogicalLocation * termLocation ); // May be null.
867:
868: // -------------------------------------------------------------------------------------------
869:
870: extern OSStatus PEF_GetExportedSymbolCount ( CFContHandlerRef containerRef,
871: ItemCount * exportCount );
872:
873: extern OSStatus PEF_GetExportedSymbolInfo ( CFContHandlerRef containerRef,
874: CFContSignedIndex exportIndex,
875: PBVersion infoVersion,
876: CFContExportedSymbolInfo * exportInfo );
877:
878: extern OSStatus PEF_FindExportedSymbolInfo ( CFContHandlerRef containerRef,
879: const CFContHashedName * exportName,
880: PBVersion infoVersion,
881: ItemCount * exportIndex, // May be null.
882: CFContExportedSymbolInfo * exportInfo ); // May be null.
883:
884: // -------------------------------------------------------------------------------------------
885:
886: extern OSStatus PEF_GetImportCounts ( CFContHandlerRef containerRef,
887: ItemCount * libraryCount, // May be null.
888: ItemCount * symbolCount ); // May be null.
889:
890: extern OSStatus PEF_GetImportedLibraryInfo ( CFContHandlerRef containerRef,
891: ItemCount libraryIndex,
892: PBVersion infoVersion,
893: CFContImportedLibraryInfo * libraryInfo );
894:
895: extern OSStatus PEF_GetImportedSymbolInfo ( CFContHandlerRef containerRef,
896: ItemCount symbolIndex,
897: PBVersion infoVersion,
898: CFContImportedSymbolInfo * symbolInfo );
899:
900: extern OSStatus PEF_SetImportedSymbolAddress ( CFContHandlerRef containerRef,
901: ItemCount symbolIndex,
902: LogicalAddress symbolAddress );
903:
904: // -------------------------------------------------------------------------------------------
905:
906: extern OSStatus PEF_UnpackSection ( CFContHandlerRef containerRef,
907: ItemCount sectionIndex,
908: ByteCount sectionOffset,
909: LogicalAddress bufferAddress,
910: ByteCount bufferLength );
911:
912: extern OSStatus PEF_RelocateSection ( CFContHandlerRef containerRef,
913: ItemCount sectionIndex );
914:
915: extern OSStatus PEF_RelocateImportsOnly ( CFContHandlerRef containerRef,
916: ItemCount sectionIndex,
917: ItemCount libraryIndex );
918:
919: struct CFragInitBlock {
920: void * contextID;
921: void * closureID;
922: void * connectionID;
923: SInt32 where; // locator rec
924: LogicalAddress address;
925: ByteCount length;
926: Boolean inPlace;
927: UInt8 resvA;
928: UInt16 resvB;
929: char * libName;
930: UInt32 resvC;
931: };
932: typedef struct CFragInitBlock CFragInitBlock;
933:
934: #pragma options align=reset
935:
936: #endif // __IOPEFINTERNALS__
937:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.