Index: branches/meklort/i386/boot2/modules.c =================================================================== --- branches/meklort/i386/boot2/modules.c (revision 490) +++ branches/meklort/i386/boot2/modules.c (revision 491) @@ -301,17 +301,20 @@ struct symtab_command* symtabCommand = NULL; //struct dysymtab_command* dysymtabCommand = NULL; - UInt32 binaryIndex = sizeof(struct mach_header); + UInt32 binaryIndex = 0; UInt16 cmd = 0; // Parse through the load commands if(((struct mach_header*)binary)->magic == MH_MAGIC) { is64 = 0; + binaryIndex += sizeof(struct mach_header); } - else if(((struct mach_header_64*)binary)->magic != MH_MAGIC_64) + else if(((struct mach_header_64*)binary)->magic == MH_MAGIC_64) { + // NOTE: modules cannot be 64bit... is64 = 1; + binaryIndex += sizeof(struct mach_header_64); } else { @@ -342,7 +345,9 @@ case LC_SYMTAB: symtabCommand = binary + binaryIndex; break; + case LC_SEGMENT: + case LC_SEGMENT_64: break; case LC_DYSYMTAB: @@ -1043,12 +1048,9 @@ //char* symbolTable = base + symtabCommand->symoff; if(!is64) { - + struct nlist* symbolEntry = (void*)base + symtabCommand->symoff; while(symbolIndex < symtabCommand->nsyms) { - - struct nlist* symbolEntry = (void*)base + symtabCommand->symoff + (symbolIndex * sizeof(struct nlist)); - // If the symbol is exported by this module if(symbolEntry->n_value && symbol_handler(symbolString + symbolEntry->n_un.n_strx, (long long)base + symbolEntry->n_value, is64) != 0xFFFFFFFF) @@ -1058,17 +1060,17 @@ module_start = base + symbolEntry->n_value; } - symbolEntry+= sizeof(struct nlist); + symbolEntry++; symbolIndex++; // TODO remove } } else { - + struct nlist_64* symbolEntry = (void*)base + symtabCommand->symoff; + // NOTE First entry is *not* correct, but we can ignore it (i'm getting radar:// right now) while(symbolIndex < symtabCommand->nsyms) { - struct nlist_64* symbolEntry = (void*)base + symtabCommand->symoff + (symbolIndex * sizeof(struct nlist_64)); // If the symbol is exported by this module if(symbolEntry->n_value && @@ -1079,7 +1081,7 @@ module_start = base + symbolEntry->n_value; } - symbolEntry+= sizeof(struct nlist); + symbolEntry++; symbolIndex++; // TODO remove } } Index: branches/meklort/i386/modules/KernelPatcher/kernel_patcher.c =================================================================== --- branches/meklort/i386/modules/KernelPatcher/kernel_patcher.c (revision 490) +++ branches/meklort/i386/modules/KernelPatcher/kernel_patcher.c (revision 491) @@ -12,38 +12,41 @@ patchRoutine_t* patches = NULL; kernSymbols_t* kernelSymbols = NULL; +unsigned long long textAddress = 0; +unsigned long long textSection = 0; +//UInt64 vmaddr = 0; -UInt32 textSection = 0; -UInt32 textAddress = 0; - - void KernelPatcher_start() { //register_kernel_patch(patch_cpuid_set_info, KERNEL_32, CPUID_MODEL_ATOM); // TODO: CPUFAMILY_INTEL_PENRYN, CPUID_MODEL_PENRYN //register_kernel_patch(patch_cpuid_set_info, KERNEL_32, CPUID_MODEL_UNKNOWN); // 0, 0 - register_kernel_patch(patch_cpuid_set_info_all, KERNEL_32, CPUID_MODEL_UNKNOWN); + register_kernel_patch(patch_cpuid_set_info_all, KERNEL_ANY, CPUID_MODEL_UNKNOWN); - register_kernel_patch(patch_commpage_stuff_routine, KERNEL_32, CPUID_MODEL_ANY); + register_kernel_patch(patch_commpage_stuff_routine, KERNEL_ANY, CPUID_MODEL_ANY); - register_kernel_patch(patch_lapic_init, KERNEL_32, CPUID_MODEL_ANY); + register_kernel_patch(patch_lapic_init, KERNEL_ANY, CPUID_MODEL_ANY); + // NOTE: following is currently 32bit only register_kernel_patch(patch_lapic_configure, KERNEL_32, CPUID_MODEL_ANY); - //register_kernel_patch(patch_lapic_interrupt, KERNEL_32, CPUID_MODEL_ANY); - register_kernel_symbol(KERNEL_32, "_panic"); - register_kernel_symbol(KERNEL_32, "_cpuid_set_info"); - register_kernel_symbol(KERNEL_32, "_pmCPUExitHaltToOff"); - register_kernel_symbol(KERNEL_32, "_lapic_init"); - register_kernel_symbol(KERNEL_32, "_commpage_stuff_routine"); + register_kernel_symbol(KERNEL_ANY, "_panic"); + register_kernel_symbol(KERNEL_ANY, "_cpuid_set_info"); + register_kernel_symbol(KERNEL_ANY, "_pmCPUExitHaltToOff"); + register_kernel_symbol(KERNEL_ANY, "_lapic_init"); + register_kernel_symbol(KERNEL_ANY, "_commpage_stuff_routine"); // LAPIC configure symbols - register_kernel_symbol(KERNEL_32, "_lapic_configure"); - register_kernel_symbol(KERNEL_32, "_lapic_interrupt"); + register_kernel_symbol(KERNEL_ANY, "_lapic_configure"); - register_kernel_symbol(KERNEL_32, "_lapic_start"); - register_kernel_symbol(KERNEL_32, "_lapic_interrupt_base"); + register_kernel_symbol(KERNEL_ANY, "_lapic_start"); + register_kernel_symbol(KERNEL_ANY, "_lapic_interrupt_base"); + + + //register_kernel_patch(patch_lapic_interrupt, KERNEL_ANY, CPUID_MODEL_ANY); + //register_kernel_symbol(KERNEL_ANY, "_lapic_interrupt"); + // TODO: register needed symbols @@ -213,17 +216,32 @@ **/ int locate_symbols(void* kernelData) { - + char is64; struct load_command *loadCommand; - struct symtab_command *symtableData; - // struct nlist *symbolEntry; - - char* symbolString; + struct symtab_command *symtableData = NULL; + struct segment_command *segCommand = NULL; + struct segment_command_64 *segCommand64 = NULL; UInt32 kernelIndex = 0; - kernelIndex += sizeof(struct mach_header); - if(((struct mach_header*)kernelData)->magic != MH_MAGIC) return KERNEL_64; + if(((struct mach_header*)kernelData)->magic == MH_MAGIC) + { + is64 = 0; + kernelIndex += sizeof(struct mach_header); + + } + else if(((struct mach_header_64*)kernelData)->magic == MH_MAGIC_64) + { + is64 = 1; + kernelIndex += sizeof(struct mach_header_64); + + } + else + { + printf("Invalid mach magic 0x%X\n", ((struct mach_header*)kernelData)->magic); + getc(); + return KERNEL_ERR; + } int cmd = 0; @@ -235,58 +253,84 @@ UInt cmdSize = loadCommand->cmdsize; - - if((loadCommand->cmd & 0x7FFFFFFF) == LC_SYMTAB) // We only care about the symtab segment + switch ((loadCommand->cmd & 0x7FFFFFFF)) { - //printf("Located symtable, length is 0x%X, 0x%X\n", (unsigned int)loadCommand->cmdsize, (unsigned int)sizeof(symtableData)); - - symtableData = kernelData + kernelIndex; - kernelIndex += sizeof(struct symtab_command); - - symbolString = kernelData + symtableData->stroff; - } - else if((loadCommand->cmd & 0x7FFFFFFF) == LC_SEGMENT) // We only care about the __TEXT segment, any other load command can be ignored - { - - struct segment_command *segCommand; - - segCommand = kernelData + kernelIndex; - - //printf("Segment name is %s\n", segCommand->segname); - - if(strcmp("__TEXT", segCommand->segname) == 0) - { - UInt32 sectionIndex; + case LC_SYMTAB: + //printf("Located symtable, length is 0x%X, 0x%X\n", (unsigned int)loadCommand->cmdsize, (unsigned int)sizeof(symtableData)); + symtableData = kernelData + kernelIndex; + break; - sectionIndex = sizeof(struct segment_command); + case LC_SEGMENT: // 32bit macho + segCommand = kernelData + kernelIndex; - struct section *sect; + //printf("Segment name is %s\n", segCommand->segname); - while(sectionIndex < segCommand->cmdsize) + if(strcmp("__TEXT", segCommand->segname) == 0) { - sect = kernelData + kernelIndex + sectionIndex; + UInt32 sectionIndex; - sectionIndex += sizeof(struct section); + sectionIndex = sizeof(struct segment_command); + struct section *sect; - if(strcmp("__text", sect->sectname) == 0) + while(sectionIndex < segCommand->cmdsize) { - // __TEXT,__text found, save the offset and address for when looking for the calls. - textSection = sect->offset; - textAddress = sect->addr; - break; - } + sect = kernelData + kernelIndex + sectionIndex; + + sectionIndex += sizeof(struct section); + + + if(strcmp("__text", sect->sectname) == 0) + { + // __TEXT,__text found, save the offset and address for when looking for the calls. + textSection = sect->offset; + textAddress = sect->addr; + break; + } + } } - } - - - kernelIndex += cmdSize; - } else { - kernelIndex += cmdSize; + break; + case LC_SEGMENT_64: // 64bit macho's + segCommand64 = kernelData + kernelIndex; + + //printf("Segment name is %s\n", segCommand->segname); + + if(strcmp("__TEXT", segCommand64->segname) == 0) + { + UInt32 sectionIndex; + + sectionIndex = sizeof(struct segment_command_64); + + struct section_64 *sect; + + while(sectionIndex < segCommand64->cmdsize) + { + sect = kernelData + kernelIndex + sectionIndex; + + sectionIndex += sizeof(struct section_64); + + + if(strcmp("__text", sect->sectname) == 0) + { + // __TEXT,__text found, save the offset and address for when looking for the calls. + textSection = sect->offset; + textAddress = sect->addr; + + break; + } + } + } + + break; + + default: + break; + } + kernelIndex += cmdSize; } - handle_symtable((UInt32)kernelData, symtableData, &symbol_handler, determineKernelArchitecture(kernelData) == KERNEL_64); + return 1 << is64; } long long symbol_handler(char* symbolName, long long addr, char is64) @@ -295,8 +339,13 @@ kernSymbols_t *symbol = lookup_kernel_symbol(symbolName); + if(symbol) { + + //printf("Located %sbit symbol %s at 0x%lX\n", is64 ? "64" : "32", symbolName, addr); + //getc(); + symbol->addr = addr; } return 0xFFFFFFFF; // fixme Index: branches/meklort/i386/modules/KernelPatcher/Makefile =================================================================== --- branches/meklort/i386/modules/KernelPatcher/Makefile (revision 490) +++ branches/meklort/i386/modules/KernelPatcher/Makefile (revision 491) @@ -21,7 +21,7 @@ INSTALLDIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/standalone -OPTIM = -Os -Oz +OPTIM = -O3 DEBUG = -DNOTHING #DEBUG = -DDEBUG_HELLO_WORLD=1 CFLAGS = $(RC_CFLAGS) $(OPTIM) $(MORECPP) -arch i386 -g -Wmost \ Index: branches/meklort/i386/modules/HelloWorld/HelloWorld.c =================================================================== --- branches/meklort/i386/modules/HelloWorld/HelloWorld.c (revision 490) +++ branches/meklort/i386/modules/HelloWorld/HelloWorld.c (revision 491) @@ -4,8 +4,8 @@ */ #include "libsaio.h" +#include "modules.h" - void helloWorld(void* binary, void* arg2, void* arg3, void* arg4) { printf("Hello world from ExecKernel hook. Binary located at 0x%X\n", binary); Index: branches/meklort/i386/Makefile =================================================================== --- branches/meklort/i386/Makefile (revision 490) +++ branches/meklort/i386/Makefile (revision 491) @@ -44,5 +44,22 @@ ) || exit $$?; \ done +modules: + @for i in "modules"; \ + do \ + echo ================= make $@ for $$i =================; \ + ( cd $$i; ${MAKE} \ + "OBJROOT=$(OBJROOT)/$$i" \ + "SYMROOT=$(SYMROOT)" \ + "DSTROOT=$(DSTROOT)" \ + "SRCROOT=$(SRCROOT)" \ + "RC_ARCHS=$(RC_ARCHS)" \ + "RC_KANJI=$(RC_KANJI)" \ + "JAPANESE=$(JAPANESE)" \ + "RC_CFLAGS=$(RC_CFLAGS)" $@ \ + ) || exit $$?; \ + done + + installsrc: tar cf - . | (cd ${SRCROOT}; tar xfBp -)