| | 28 | |
| | 29 | #define MODULE_START 0xD8000000 |
| | 30 | #define MODULE_END 0xE0000000 |
| | 31 | |
| | 32 | void* ModuleSymbolFind(struct Module* module, const char* symName, int type) |
| | 33 | { |
| | 34 | int i; |
| | 35 | struct ElfSymbol* symbol; |
| | 36 | |
| | 37 | for (i=1; i<module->symTableSize/(sizeof(struct ElfSymbol)); i++) |
| | 38 | { |
| | 39 | symbol=&module->symTable[i]; |
| | 40 | |
| | 41 | if (symbol->symIndex == STN_UNDEF) |
| | 42 | continue; |
| | 43 | |
| | 44 | if (ELF_ST_TYPE(symbol->symInfo) != type) |
| | 45 | continue; |
| | 46 | |
| | 47 | if (strcmp(symName, module->strTable+symbol->symName)) |
| | 48 | continue; |
| | 49 | |
| | 50 | /* Handle data? */ |
| | 51 | return (module->textAddr+symbol->symValue); |
| | 52 | } |
| | 53 | |
| | 54 | return NULL; |
| | 55 | } |
| 36 | | /* Call ModuleInit */ |
| | 75 | for (i=0; i<elfHeader->shEntries; i++) |
| | 76 | { |
| | 77 | if (sectionHeaders[i].shFlags & SEC_FLAGS_EXEC) |
| | 78 | module->textAddr=loadAddr+sectionHeaders[i].shOffset; |
| | 79 | |
| | 80 | /* Save the symbol table off for resolving later. */ |
| | 81 | if (sectionHeaders[i].shType == SEC_TYPE_SYMTAB) |
| | 82 | { |
| | 83 | module->symTable=loadAddr+sectionHeaders[i].shOffset; |
| | 84 | module->symTableSize=sectionHeaders[i].shSize; |
| | 85 | } |
| | 86 | |
| | 87 | if (sectionHeaders[i].shType == SEC_TYPE_STRTAB) |
| | 88 | module->strTable=loadAddr+sectionHeaders[i].shOffset; |
| | 89 | } |
| | 90 | |
| | 91 | /* Resolve entries in the module file. */ |
| | 92 | |
| | 93 | /* Find the init and exit functions, using the symbol and string table addresses. */ |
| | 94 | int (*modInit)(void); |
| | 95 | |
| | 96 | modInit=ModuleSymbolFind(module, "ModuleInit", STT_FUNC); |
| | 97 | |
| | 98 | printf("modInit = %#X\n", modInit); |
| | 99 | |
| | 100 | if (modInit) |
| | 101 | /* Call ModuleInit */ |
| | 102 | printf("ret = %d\n", (*modInit)()); |
| 43 | | /* Copy in data from userspace. */ |
| 44 | | return ModuleAdd(data, length, 0); |
| | 109 | void* kData; |
| | 110 | |
| | 111 | /* Check data is ok to access. */ |
| | 112 | |
| | 113 | kData=(void*)VirtMapPhysRange(MODULE_START, MODULE_END, PAGE_ALIGN_UP(length) >> PAGE_SHIFT, 3); |
| | 114 | |
| | 115 | memcpy(kData, data, length); |
| | 116 | |
| | 117 | return ModuleAdd(kData, length, 0); |