/* $Id $ */ /** @file * Mach-0 structures, types and defines. */ #ifndef __kLdrModMachO_h__ #define __kLdrModMachO_h__ #ifndef IMAGE_FAT_SIGNATURE /** The FAT signature (universal binaries). */ # define IMAGE_FAT_SIGNATURE UINT32_C(0xcafebabe) #endif #ifndef IMAGE_FAT_SIGNATURE_OE /** The FAT signature (universal binaries), other endian. */ # define IMAGE_FAT_SIGNATURE_OE UINT32_C(0xbebafeca) #endif /** * The fat header found at the start of universal binaries. * It is followed by \a nfat_arch numbers of \a fat_arch structures. */ typedef struct fat_header { uint32_t magic; uint32_t nfat_arch; } fat_header; /** * Description of fat file item. */ struct fat_arch { int32_t cputype; int32_t cpusubtype; uint32_t offset; uint32_t size; uint32_t align; /**< Power of 2. */ } fat_arch; #ifdef IMAGE_MACHO32_SIGNATURE /** The 32-bit Mach-O signature. */ # define IMAGE_MACHO32_SIGNATURE UINT32_C(0xfeedface) #endif #ifdef IMAGE_MACHO32_SIGNATURE_OE /** The 32-bit Mach-O signature, other endian. */ # define IMAGE_MACHO32_SIGNATURE_OE UINT32_C(0xcefaedfe) #endif #define MH_MAGIC IMAGE_MACHO32_SIGNATURE #define MH_CIGAM IMAGE_MACHO32_SIGNATURE_OE /** * 32-bit Mach-O header. * This is followed by \a ncmds number of load commands. * @see mach_header_64 */ typedef struct mach_header_32 { uint32_t magic; int32_t cputype; int32_t cpusubtype; uint32_t filetype; uint32_t ncmds; uint32_t sizeofcmds; uint32_t flags; } mach_header_32; #ifdef IMAGE_MACHO64_SIGNATURE /** The 64-bit Mach-O signature. */ # define IMAGE_MACHO64_SIGNATURE UINT32_C(0xfeedfacf) #endif #ifdef IMAGE_MACHO64_SIGNATURE_OE /** The 64-bit Mach-O signature, other endian. */ # define IMAGE_MACHO64_SIGNATURE_OE UINT32_C(0xfefaedfe) #endif #define MH_MAGIC_64 IMAGE_MACHO64_SIGNATURE #define MH_CIGAM_64 IMAGE_MACHO64_SIGNATURE_OE /** * 64-bit Mach-O header. * This is followed by \a ncmds number of load commands. * @see mach_header */ typedef struct mach_header_64 { uint32_t magic; int32_t cputype; int32_t cpusubtype; uint32_t filetype; uint32_t ncmds; uint32_t sizeofcmds; uint32_t flags; uint32_t reserved; /**< (for proper struct and command alignment I guess) */ } mach_header_64; /** @name CPU types / bits. * @{ */ #define CPU_ARCH_MASK INT32_C(0xff000000) #define CPU_ARCH_ABI64 INT32_C(0x01000000) #define CPU_TYPE_ANY INT32_C(-1) #define CPU_TYPE_VAX INT32_C(1) #define CPU_TYPE_MC680x0 INT32_C(6) #define CPU_TYPE_X86 INT32_C(7) #define CPU_TYPE_I386 CPU_TYPE_X86 #define CPU_TYPE_X86_64 (CPU_TYPE_X86 | CPU_ARCH_ABI64) #define CPU_TYPE_MC98000 INT32_C(10) #define CPU_TYPE_HPPA INT32_C(11) #define CPU_TYPE_MC88000 INT32_C(13) #define CPU_TYPE_SPARC INT32_C(14) #define CPU_TYPE_I860 INT32_C(15) #define CPU_TYPE_POWERPC INT32_C(18) #define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64) /** @} */ /** @name CPU subtypes * @{ */ #define CPU_SUBTYPE_MULTIPLE INT32_C(-1) #define CPU_SUBTYPE_LITTLE_ENDIAN INT32_C(0) /**< figure this one out. */ #define CPU_SUBTYPE_BIG_ENDIAN INT32_C(1) /**< ditto */ /* VAX */ #define CPU_SUBTYPE_VAX_ALL INT32_C(0) #define CPU_SUBTYPE_VAX780 INT32_C(1) #define CPU_SUBTYPE_VAX785 INT32_C(2) #define CPU_SUBTYPE_VAX750 INT32_C(3) #define CPU_SUBTYPE_VAX730 INT32_C(4) #define CPU_SUBTYPE_UVAXI INT32_C(5) #define CPU_SUBTYPE_UVAXII INT32_C(6) #define CPU_SUBTYPE_VAX8200 INT32_C(7) #define CPU_SUBTYPE_VAX8500 INT32_C(8) #define CPU_SUBTYPE_VAX8600 INT32_C(9) #define CPU_SUBTYPE_VAX8650 INT32_C(10) #define CPU_SUBTYPE_VAX8800 INT32_C(11) #define CPU_SUBTYPE_UVAXIII INT32_C(12) /* MC680xx */ #define CPU_SUBTYPE_MC680x0_ALL INT32_C(1) #define CPU_SUBTYPE_MC68030 INT32_C(1) #define CPU_SUBTYPE_MC68040 INT32_C(2) #define CPU_SUBTYPE_MC68030_ONLY INT32_C(3) /* I386 */ #define CPU_SUBTYPE_INTEL(fam, model) ( (int32_t)(((model) << 4) | (fam)) ) #define CPU_SUBTYPE_INTEL_FAMILY(subtype) ( (subtype) & 0xf ) #define CPU_SUBTYPE_INTEL_MODEL(subtype) ( (subtype) >> 4 ) #define CPU_SUBTYPE_INTEL_FAMILY_MAX 0xf #define CPU_SUBTYPE_INTEL_MODEL_ALL 0 #define CPU_SUBTYPE_I386_ALL CPU_SUBTYPE_INTEL(3, 0) #define CPU_SUBTYPE_386 CPU_SUBTYPE_INTEL(3, 0) #define CPU_SUBTYPE_486 CPU_SUBTYPE_INTEL(4, 0) #define CPU_SUBTYPE_486SX CPU_SUBTYPE_INTEL(4, 8) #define CPU_SUBTYPE_586 CPU_SUBTYPE_INTEL(5, 0) #define CPU_SUBTYPE_PENT CPU_SUBTYPE_INTEL(5, 0) #define CPU_SUBTYPE_PENTPRO CPU_SUBTYPE_INTEL(6, 1) #define CPU_SUBTYPE_PENTII_M3 CPU_SUBTYPE_INTEL(6, 3) #define CPU_SUBTYPE_PENTII_M5 CPU_SUBTYPE_INTEL(6, 5) #define CPU_SUBTYPE_CELERON CPU_SUBTYPE_INTEL(7, 6) #define CPU_SUBTYPE_CELERON_MOBILE CPU_SUBTYPE_INTEL(7, 7) #define CPU_SUBTYPE_PENTIUM_3 CPU_SUBTYPE_INTEL(8, 0) #define CPU_SUBTYPE_PENTIUM_3_M CPU_SUBTYPE_INTEL(8, 1) #define CPU_SUBTYPE_PENTIUM_3_XEON CPU_SUBTYPE_INTEL(8, 2) #define CPU_SUBTYPE_PENTIUM_M CPU_SUBTYPE_INTEL(9, 0) #define CPU_SUBTYPE_PENTIUM_4 CPU_SUBTYPE_INTEL(10, 0) #define CPU_SUBTYPE_PENTIUM_4_M CPU_SUBTYPE_INTEL(10, 1) #define CPU_SUBTYPE_ITANIUM CPU_SUBTYPE_INTEL(11, 0) #define CPU_SUBTYPE_ITANIUM_2 CPU_SUBTYPE_INTEL(11, 1) #define CPU_SUBTYPE_XEON CPU_SUBTYPE_INTEL(12, 0) #define CPU_SUBTYPE_XEON_MP CPU_SUBTYPE_INTEL(12, 1) /* X86 */ #define CPU_SUBTYPE_X86_ALL INT32_C(3) /* CPU_SUBTYPE_I386_ALL */ #define CPU_SUBTYPE_X86_64_ALL INT32_C(3) /* CPU_SUBTYPE_I386_ALL */ #define CPU_SUBTYPE_X86_ARCH1 INT32_C(4) /* CPU_SUBTYPE_I486_ALL */ /* MIPS */ #define CPU_SUBTYPE_MIPS_ALL INT32_C(0) #define CPU_SUBTYPE_MIPS_R2300 INT32_C(1) #define CPU_SUBTYPE_MIPS_R2600 INT32_C(2) #define CPU_SUBTYPE_MIPS_R2800 INT32_C(3) #define CPU_SUBTYPE_MIPS_R2000a INT32_C(4) #define CPU_SUBTYPE_MIPS_R2000 INT32_C(5) #define CPU_SUBTYPE_MIPS_R3000a INT32_C(6) #define CPU_SUBTYPE_MIPS_R3000 INT32_C(7) /* MC98000 (PowerPC) */ #define CPU_SUBTYPE_MC98000_ALL INT32_C(0) #define CPU_SUBTYPE_MC98601 INT32_C(1) /* HP-PA */ #define CPU_SUBTYPE_HPPA_ALL INT32_C(0) #define CPU_SUBTYPE_HPPA_7100 INT32_C(0) #define CPU_SUBTYPE_HPPA_7100LC INT32_C(1) /* MC88000 */ #define CPU_SUBTYPE_MC88000_ALL INT32_C(0) #define CPU_SUBTYPE_MC88100 INT32_C(1) #define CPU_SUBTYPE_MC88110 INT32_C(2) /* SPARC */ #define CPU_SUBTYPE_SPARC_ALL INT32_C(0) /* I860 */ #define CPU_SUBTYPE_I860_ALL INT32_C(0) #define CPU_SUBTYPE_I860_860 INT32_C(1) /* PowerPC */ #define CPU_SUBTYPE_POWERPC_ALL INT32_C(0) #define CPU_SUBTYPE_POWERPC_601 INT32_C(1) #define CPU_SUBTYPE_POWERPC_602 INT32_C(2) #define CPU_SUBTYPE_POWERPC_603 INT32_C(3) #define CPU_SUBTYPE_POWERPC_603e INT32_C(4) #define CPU_SUBTYPE_POWERPC_603ev INT32_C(5) #define CPU_SUBTYPE_POWERPC_604 INT32_C(6) #define CPU_SUBTYPE_POWERPC_604e INT32_C(7) #define CPU_SUBTYPE_POWERPC_620 INT32_C(8) #define CPU_SUBTYPE_POWERPC_750 INT32_C(9) #define CPU_SUBTYPE_POWERPC_7400 INT32_C(10) #define CPU_SUBTYPE_POWERPC_7450 INT32_C(11) #define CPU_SUBTYPE_POWERPC_Max INT32_C(10) #define CPU_SUBTYPE_POWERPC_SCVger INT32_C(11) #define CPU_SUBTYPE_POWERPC_970 INT32_C(100) /** @} */ #endif