diff --git a/src/ElfUtils.cpp b/src/ElfUtils.cpp index 4f7afd9..f8b73f4 100644 --- a/src/ElfUtils.cpp +++ b/src/ElfUtils.cpp @@ -13,146 +13,146 @@ #include "ElfUtils.h" // See https://github.com/decaf-emu/decaf-emu/blob/43366a34e7b55ab9d19b2444aeb0ccd46ac77dea/src/libdecaf/src/cafe/loader/cafe_loader_reloc.cpp#L144 -bool ElfUtils::elfLinkOne(char type, size_t offset, int32_t addend, uint32_t destination, uint32_t symbol_addr, relocation_trampolin_entry_t * trampolin_data, uint32_t trampolin_data_length, RelocationType reloc_type) { - if(type == R_PPC_NONE) { +bool ElfUtils::elfLinkOne(char type, size_t offset, int32_t addend, uint32_t destination, uint32_t symbol_addr, relocation_trampolin_entry_t *trampolin_data, uint32_t trampolin_data_length, RelocationType reloc_type) { + if (type == R_PPC_NONE) { return true; } - auto target = destination + offset; + auto target = destination + offset; auto value = symbol_addr + addend; auto relValue = value - static_cast(target); switch (type) { - case R_PPC_NONE: - break; - case R_PPC_ADDR32: - *((uint32_t *)(target)) = value; - break; - case R_PPC_ADDR16_LO: - *((uint16_t *)(target)) = static_cast(value & 0xFFFF); - break; - case R_PPC_ADDR16_HI: - *((uint16_t *)(target)) = static_cast(value >> 16); - break; - case R_PPC_ADDR16_HA: - *((uint16_t *)(target)) = static_cast((value + 0x8000) >> 16); - break; - case R_PPC_DTPMOD32: - DEBUG_FUNCTION_LINE("################IMPLEMENT ME"); - //*((int32_t *)(target)) = tlsModuleIndex; - break; - case R_PPC_DTPREL32: - *((uint32_t *)(target)) = value; - break; - case R_PPC_GHS_REL16_HA: - *((uint16_t *)(target)) = static_cast((relValue + 0x8000) >> 16); - break; - case R_PPC_GHS_REL16_HI: - *((uint16_t *)(target)) = static_cast(relValue >> 16); - break; - case R_PPC_GHS_REL16_LO: - *((uint16_t *)(target)) = static_cast(relValue & 0xFFFF); - break; - case R_PPC_REL14: { - auto distance = static_cast(value) - static_cast(target); - if (distance > 0x7FFC || distance < -0x7FFC) { - DEBUG_FUNCTION_LINE("***14-bit relative branch cannot hit target."); - return false; - } - - if (distance & 3) { - DEBUG_FUNCTION_LINE("***RELOC ERROR %d: lower 2 bits must be zero before shifting.", -470040); - return false; - } - - if ((distance >= 0 && (distance & 0xFFFF8000)) || - (distance < 0 && ((distance & 0xFFFF8000) != 0xFFFF8000))) { - DEBUG_FUNCTION_LINE("***RELOC ERROR %d: upper 17 bits before shift must all be the same.", -470040); - return false; - } - - *(int32_t *)target = (*(int32_t *)target & 0xFFBF0003) | (distance & 0x0000fffc); - break; - } - case R_PPC_REL24: { - // if (isWeakSymbol && !symbolValue) { - // symbolValue = static_cast(target); - // value = symbolValue + addend; - // } - auto distance = static_cast(value) - static_cast(target); - if (distance > 0x1FFFFFC || distance < -0x1FFFFFC) { - if(trampolin_data == NULL) { - DEBUG_FUNCTION_LINE("***24-bit relative branch cannot hit target. Trampolin isn't provided"); - DEBUG_FUNCTION_LINE("***value %08X - target %08X = distance %08X", value, target, distance); + case R_PPC_NONE: + break; + case R_PPC_ADDR32: + *((uint32_t *) (target)) = value; + break; + case R_PPC_ADDR16_LO: + *((uint16_t *) (target)) = static_cast(value & 0xFFFF); + break; + case R_PPC_ADDR16_HI: + *((uint16_t *) (target)) = static_cast(value >> 16); + break; + case R_PPC_ADDR16_HA: + *((uint16_t *) (target)) = static_cast((value + 0x8000) >> 16); + break; + case R_PPC_DTPMOD32: + DEBUG_FUNCTION_LINE("################IMPLEMENT ME"); + //*((int32_t *)(target)) = tlsModuleIndex; + break; + case R_PPC_DTPREL32: + *((uint32_t *) (target)) = value; + break; + case R_PPC_GHS_REL16_HA: + *((uint16_t *) (target)) = static_cast((relValue + 0x8000) >> 16); + break; + case R_PPC_GHS_REL16_HI: + *((uint16_t *) (target)) = static_cast(relValue >> 16); + break; + case R_PPC_GHS_REL16_LO: + *((uint16_t *) (target)) = static_cast(relValue & 0xFFFF); + break; + case R_PPC_REL14: { + auto distance = static_cast(value) - static_cast(target); + if (distance > 0x7FFC || distance < -0x7FFC) { + DEBUG_FUNCTION_LINE("***14-bit relative branch cannot hit target."); return false; - } else { - relocation_trampolin_entry_t * freeSlot = NULL; - for(uint32_t i = 0; i < trampolin_data_length; i++) { - // We want to override "old" relocations of imports - // Pending relocations have the status RELOC_TRAMP_IMPORT_IN_PROGRESS. - // When all relocations are done successfully, they will be turned into RELOC_TRAMP_IMPORT_DONE - // so they can be overridden/updated/reused on the next application launch. - // - // Relocations that won't change will have the status RELOC_TRAMP_FIXED and are set to free when the module is unloaded. - if(trampolin_data[i].status == RELOC_TRAMP_FREE || - trampolin_data[i].status == RELOC_TRAMP_IMPORT_DONE) { - freeSlot = &(trampolin_data[i]); - break; - } - } - if(freeSlot != NULL) { - DEBUG_FUNCTION_LINE("***24-bit relative branch cannot hit target. Trampolin data list is full"); - DEBUG_FUNCTION_LINE("***value %08X - target %08X = distance %08X", value, target, distance); - return false; - } - if(target - (uint32_t)&(freeSlot->trampolin[0]) > 0x1FFFFFC) { - DEBUG_FUNCTION_LINE("**Cannot link 24-bit jump (too far to tramp buffer)."); - DEBUG_FUNCTION_LINE("***value %08X - target %08X = distance %08X", value, target, distance); - return false; - } - - freeSlot->trampolin[0] = 0x3D600000 | ((((uint32_t) value) >> 16) & 0x0000FFFF); // lis r11, real_addr@h - freeSlot->trampolin[1] = 0x616B0000 | (((uint32_t) value) & 0x0000ffff); // ori r11, r11, real_addr@l - freeSlot->trampolin[2] = 0x7D6903A6; // mtctr r11 - freeSlot->trampolin[3] = 0x4E800420; // bctr - DCFlushRange((void*)freeSlot->trampolin, sizeof(freeSlot->trampolin)); - ICInvalidateRange((unsigned char*)freeSlot->trampolin, sizeof(freeSlot->trampolin)); - - if(reloc_type == RELOC_TYPE_FIXED) { - freeSlot->status = RELOC_TRAMP_FIXED; - } else { - // Relocations for the imports may be overridden - freeSlot->status = RELOC_TRAMP_IMPORT_IN_PROGRESS; - } - uint32_t symbolValue = (uint32_t)&(freeSlot->trampolin[0]); - value = symbolValue + addend; - distance = static_cast(value) - static_cast(target); - DEBUG_FUNCTION_LINE("Created tramp"); } - } - if (distance & 3) { - DEBUG_FUNCTION_LINE("***RELOC ERROR %d: lower 2 bits must be zero before shifting.", -470022); + if (distance & 3) { + DEBUG_FUNCTION_LINE("***RELOC ERROR %d: lower 2 bits must be zero before shifting.", -470040); + return false; + } + + if ((distance >= 0 && (distance & 0xFFFF8000)) || + (distance < 0 && ((distance & 0xFFFF8000) != 0xFFFF8000))) { + DEBUG_FUNCTION_LINE("***RELOC ERROR %d: upper 17 bits before shift must all be the same.", -470040); + return false; + } + + *(int32_t *) target = (*(int32_t *) target & 0xFFBF0003) | (distance & 0x0000fffc); + break; + } + case R_PPC_REL24: { + // if (isWeakSymbol && !symbolValue) { + // symbolValue = static_cast(target); + // value = symbolValue + addend; + // } + auto distance = static_cast(value) - static_cast(target); + if (distance > 0x1FFFFFC || distance < -0x1FFFFFC) { + if (trampolin_data == NULL) { + DEBUG_FUNCTION_LINE("***24-bit relative branch cannot hit target. Trampolin isn't provided"); + DEBUG_FUNCTION_LINE("***value %08X - target %08X = distance %08X", value, target, distance); + return false; + } else { + relocation_trampolin_entry_t *freeSlot = NULL; + for (uint32_t i = 0; i < trampolin_data_length; i++) { + // We want to override "old" relocations of imports + // Pending relocations have the status RELOC_TRAMP_IMPORT_IN_PROGRESS. + // When all relocations are done successfully, they will be turned into RELOC_TRAMP_IMPORT_DONE + // so they can be overridden/updated/reused on the next application launch. + // + // Relocations that won't change will have the status RELOC_TRAMP_FIXED and are set to free when the module is unloaded. + if (trampolin_data[i].status == RELOC_TRAMP_FREE || + trampolin_data[i].status == RELOC_TRAMP_IMPORT_DONE) { + freeSlot = &(trampolin_data[i]); + break; + } + } + if (freeSlot != NULL) { + DEBUG_FUNCTION_LINE("***24-bit relative branch cannot hit target. Trampolin data list is full"); + DEBUG_FUNCTION_LINE("***value %08X - target %08X = distance %08X", value, target, distance); + return false; + } + if (target - (uint32_t) &(freeSlot->trampolin[0]) > 0x1FFFFFC) { + DEBUG_FUNCTION_LINE("**Cannot link 24-bit jump (too far to tramp buffer)."); + DEBUG_FUNCTION_LINE("***value %08X - target %08X = distance %08X", value, target, distance); + return false; + } + + freeSlot->trampolin[0] = 0x3D600000 | ((((uint32_t) value) >> 16) & 0x0000FFFF); // lis r11, real_addr@h + freeSlot->trampolin[1] = 0x616B0000 | (((uint32_t) value) & 0x0000ffff); // ori r11, r11, real_addr@l + freeSlot->trampolin[2] = 0x7D6903A6; // mtctr r11 + freeSlot->trampolin[3] = 0x4E800420; // bctr + DCFlushRange((void *) freeSlot->trampolin, sizeof(freeSlot->trampolin)); + ICInvalidateRange((unsigned char *) freeSlot->trampolin, sizeof(freeSlot->trampolin)); + + if (reloc_type == RELOC_TYPE_FIXED) { + freeSlot->status = RELOC_TRAMP_FIXED; + } else { + // Relocations for the imports may be overridden + freeSlot->status = RELOC_TRAMP_IMPORT_IN_PROGRESS; + } + uint32_t symbolValue = (uint32_t) &(freeSlot->trampolin[0]); + value = symbolValue + addend; + distance = static_cast(value) - static_cast(target); + DEBUG_FUNCTION_LINE("Created tramp"); + } + } + + if (distance & 3) { + DEBUG_FUNCTION_LINE("***RELOC ERROR %d: lower 2 bits must be zero before shifting.", -470022); + return false; + } + + if (distance < 0 && (distance & 0xFE000000) != 0xFE000000) { + DEBUG_FUNCTION_LINE("***RELOC ERROR %d: upper 7 bits before shift must all be the same (1).", -470040); + return false; + } + + if (distance >= 0 && (distance & 0xFE000000)) { + DEBUG_FUNCTION_LINE("***RELOC ERROR %d: upper 7 bits before shift must all be the same (0).", -470040); + return false; + } + + *(int32_t *) target = (*(int32_t *) target & 0xfc000003) | (distance & 0x03fffffc); + break; + } + default: + DEBUG_FUNCTION_LINE("***ERROR: Unsupported Relocation_Add Type (%08X):", type); return false; - } - - if (distance < 0 && (distance & 0xFE000000) != 0xFE000000) { - DEBUG_FUNCTION_LINE("***RELOC ERROR %d: upper 7 bits before shift must all be the same (1).", -470040); - return false; - } - - if (distance >= 0 && (distance & 0xFE000000)) { - DEBUG_FUNCTION_LINE("***RELOC ERROR %d: upper 7 bits before shift must all be the same (0).", -470040); - return false; - } - - *(int32_t *)target = (*(int32_t *)target & 0xfc000003) | (distance & 0x03fffffc); - break; - } - default: - DEBUG_FUNCTION_LINE("***ERROR: Unsupported Relocation_Add Type (%08X):", type); - return false; } return true; } diff --git a/src/ElfUtils.h b/src/ElfUtils.h index c6b011e..bf83f12 100644 --- a/src/ElfUtils.h +++ b/src/ElfUtils.h @@ -7,9 +7,9 @@ extern "C" { #endif -int32_t LoadFileToMem(const char *relativefilepath, char **fileOut, uint32_t * sizeOut); -uint32_t load_loader_elf_from_sd(unsigned char* baseAddress, const char* relativePath); -uint32_t load_loader_elf(unsigned char* baseAddress, char * elf_data, uint32_t fileSize); +int32_t LoadFileToMem(const char *relativefilepath, char **fileOut, uint32_t *sizeOut); +uint32_t load_loader_elf_from_sd(unsigned char *baseAddress, const char *relativePath); +uint32_t load_loader_elf(unsigned char *baseAddress, char *elf_data, uint32_t fileSize); #define R_PPC_NONE 0 #define R_PPC_ADDR32 1 @@ -46,5 +46,5 @@ uint32_t load_loader_elf(unsigned char* baseAddress, char * elf_data, uint32_t f class ElfUtils { public: - static bool elfLinkOne(char type, size_t offset, int32_t addend, uint32_t destination, uint32_t symbol_addr, relocation_trampolin_entry_t * trampolin_data, uint32_t trampolin_data_length, RelocationType reloc_type); + static bool elfLinkOne(char type, size_t offset, int32_t addend, uint32_t destination, uint32_t symbol_addr, relocation_trampolin_entry_t *trampolin_data, uint32_t trampolin_data_length, RelocationType reloc_type); }; diff --git a/src/common/dynamic_linking_defines.h b/src/common/dynamic_linking_defines.h index 2a87d80..716936a 100644 --- a/src/common/dynamic_linking_defines.h +++ b/src/common/dynamic_linking_defines.h @@ -33,19 +33,19 @@ extern "C" { #define DYN_LINK_TRAMPOLIN_LIST_LENGTH DYN_LINK_FUNCTION_LIST_LENGTH typedef struct _dyn_linking_function_t { - char functionName[DYN_LINK_FUNCTION_NAME_LENGTH+1]; - void * address; + char functionName[DYN_LINK_FUNCTION_NAME_LENGTH + 1]; + void *address; } dyn_linking_function_t; typedef struct _dyn_linking_import_t { - char importName[DYN_LINK_IMPORT_NAME_LENGTH+1]; + char importName[DYN_LINK_IMPORT_NAME_LENGTH + 1]; bool isData = false; } dyn_linking_import_t; typedef struct _dyn_linking_relocation_entry_t { - dyn_linking_function_t* functionEntry = NULL; - dyn_linking_import_t* importEntry = NULL; - void * destination = NULL; + dyn_linking_function_t *functionEntry = NULL; + dyn_linking_import_t *importEntry = NULL; + void *destination = NULL; char type; size_t offset; int32_t addend; diff --git a/src/common/module_defines.h b/src/common/module_defines.h index 4a301b9..a1d14d9 100644 --- a/src/common/module_defines.h +++ b/src/common/module_defines.h @@ -27,7 +27,7 @@ extern "C" { #endif struct module_information_t { - relocation_trampolin_entry_t trampolines[DYN_LINK_TRAMPOLIN_LIST_LENGTH]; + relocation_trampolin_entry_t trampolines[DYN_LINK_TRAMPOLIN_LIST_LENGTH]; }; #ifdef __cplusplus diff --git a/src/dynamic.c b/src/dynamic.c index 6cbf618..901352e 100644 --- a/src/dynamic.c +++ b/src/dynamic.c @@ -4,6 +4,7 @@ #define IMPORT(name) void* addr_##name #define IMPORT_BEGIN(lib) #define IMPORT_END() + #include "imports.h" #undef IMPORT @@ -23,21 +24,21 @@ EXPORT_VAR(uint32_t *, MEMFreeToDefaultHeap); void InitFunctionPointers(void) { OSDynLoad_Module handle; - addr_OSDynLoad_Acquire = (void*) 0x0102A3B4; - addr_OSDynLoad_FindExport = (void*) 0x0102B828; + addr_OSDynLoad_Acquire = (void *) 0x0102A3B4; + addr_OSDynLoad_FindExport = (void *) 0x0102B828; OSDynLoad_Acquire("coreinit.rpl", &handle); - uint32_t** value = 0; - OSDynLoad_FindExport(handle, 1, "MEMAllocFromDefaultHeap", (void**) &value); + uint32_t **value = 0; + OSDynLoad_FindExport(handle, 1, "MEMAllocFromDefaultHeap", (void **) &value); MEMAllocFromDefaultHeap = *value; - OSDynLoad_FindExport(handle, 1, "MEMAllocFromDefaultHeapEx", (void**) &value); + OSDynLoad_FindExport(handle, 1, "MEMAllocFromDefaultHeapEx", (void **) &value); MEMAllocFromDefaultHeapEx = *value; - OSDynLoad_FindExport(handle, 1, "MEMFreeToDefaultHeap", (void**) &value); + OSDynLoad_FindExport(handle, 1, "MEMFreeToDefaultHeap", (void **) &value); MEMFreeToDefaultHeap = *value; #include "imports.h" // override failed __rplwrap_exit find export - OSDynLoad_FindExport(handle, 0, "exit", (void**) &addr___rplwrap_exit); + OSDynLoad_FindExport(handle, 0, "exit", (void **) &addr___rplwrap_exit); } diff --git a/src/kernel.cpp b/src/kernel.cpp index 2c2f32a..b3809b5 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -14,25 +14,25 @@ extern "C" void SaveAndResetDataBATs_And_SRs_hook(void); void __attribute__ ((noinline)) kern_write(void *addr, uint32_t value); void doKernelSetup() { - kern_write((void*)(KERN_SYSCALL_TBL_1 + (0x36 * 4)), (unsigned int)KernelPatches); - kern_write((void*)(KERN_SYSCALL_TBL_2 + (0x36 * 4)), (unsigned int)KernelPatches); - kern_write((void*)(KERN_SYSCALL_TBL_3 + (0x36 * 4)), (unsigned int)KernelPatches); - kern_write((void*)(KERN_SYSCALL_TBL_4 + (0x36 * 4)), (unsigned int)KernelPatches); - kern_write((void*)(KERN_SYSCALL_TBL_5 + (0x36 * 4)), (unsigned int)KernelPatches); + kern_write((void *) (KERN_SYSCALL_TBL_1 + (0x36 * 4)), (unsigned int) KernelPatches); + kern_write((void *) (KERN_SYSCALL_TBL_2 + (0x36 * 4)), (unsigned int) KernelPatches); + kern_write((void *) (KERN_SYSCALL_TBL_3 + (0x36 * 4)), (unsigned int) KernelPatches); + kern_write((void *) (KERN_SYSCALL_TBL_4 + (0x36 * 4)), (unsigned int) KernelPatches); + kern_write((void *) (KERN_SYSCALL_TBL_5 + (0x36 * 4)), (unsigned int) KernelPatches); Syscall_0x36(); } void doKernelSetup2() { - memcpy((void*)0x00FFF000, (void*)SaveAndResetDataBATs_And_SRs_hook, 0x1000); - ICInvalidateRange((void*)0x00FFF000, 0x1000); - DCFlushRange((void*)0x00FFF000, 0x1000); + memcpy((void *) 0x00FFF000, (void *) SaveAndResetDataBATs_And_SRs_hook, 0x1000); + ICInvalidateRange((void *) 0x00FFF000, 0x1000); + DCFlushRange((void *) 0x00FFF000, 0x1000); - kern_write((void*)(KERN_SYSCALL_TBL_1 + (0x36 * 4)), (unsigned int)KernelPatchesFinal); - kern_write((void*)(KERN_SYSCALL_TBL_2 + (0x36 * 4)), (unsigned int)KernelPatchesFinal); - kern_write((void*)(KERN_SYSCALL_TBL_3 + (0x36 * 4)), (unsigned int)KernelPatchesFinal); - kern_write((void*)(KERN_SYSCALL_TBL_4 + (0x36 * 4)), (unsigned int)KernelPatchesFinal); - kern_write((void*)(KERN_SYSCALL_TBL_5 + (0x36 * 4)), (unsigned int)KernelPatchesFinal); + kern_write((void *) (KERN_SYSCALL_TBL_1 + (0x36 * 4)), (unsigned int) KernelPatchesFinal); + kern_write((void *) (KERN_SYSCALL_TBL_2 + (0x36 * 4)), (unsigned int) KernelPatchesFinal); + kern_write((void *) (KERN_SYSCALL_TBL_3 + (0x36 * 4)), (unsigned int) KernelPatchesFinal); + kern_write((void *) (KERN_SYSCALL_TBL_4 + (0x36 * 4)), (unsigned int) KernelPatchesFinal); + kern_write((void *) (KERN_SYSCALL_TBL_5 + (0x36 * 4)), (unsigned int) KernelPatchesFinal); Syscall_0x36(); } @@ -40,21 +40,21 @@ void doKernelSetup2() { /* Write a 32-bit word with kernel permissions */ void __attribute__ ((noinline)) kern_write(void *addr, uint32_t value) { asm volatile ( - "li 3,1\n" - "li 4,0\n" - "mr 5,%1\n" - "li 6,0\n" - "li 7,0\n" - "lis 8,1\n" - "mr 9,%0\n" - "mr %1,1\n" - "li 0,0x3500\n" - "sc\n" - "nop\n" - "mr 1,%1\n" - : - : "r"(addr), "r"(value) - : "memory", "ctr", "lr", "0", "3", "4", "5", "6", "7", "8", "9", "10", - "11", "12" + "li 3,1\n" + "li 4,0\n" + "mr 5,%1\n" + "li 6,0\n" + "li 7,0\n" + "lis 8,1\n" + "mr 9,%0\n" + "mr %1,1\n" + "li 0,0x3500\n" + "sc\n" + "nop\n" + "mr 1,%1\n" + : + : "r"(addr), "r"(value) + : "memory", "ctr", "lr", "0", "3", "4", "5", "6", "7", "8", "9", "10", + "11", "12" ); } diff --git a/src/kernel.h b/src/kernel.h index 90a317f..d59f4d3 100644 --- a/src/kernel.h +++ b/src/kernel.h @@ -8,4 +8,5 @@ void doKernelSetup(); + void doKernelSetup2(); diff --git a/src/main.cpp b/src/main.cpp index 1bb12a1..e57d92b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,24 +20,24 @@ #include "utils/logger.h" #include "utils/utils.h" -bool doRelocation(std::vector &relocData, relocation_trampolin_entry_t * tramp_data, uint32_t tramp_length); +bool doRelocation(std::vector &relocData, relocation_trampolin_entry_t *tramp_data, uint32_t tramp_length); bool CheckRunning() { - switch(ProcUIProcessMessages(true)) { - case PROCUI_STATUS_EXITING: { - return false; - } - case PROCUI_STATUS_RELEASE_FOREGROUND: { - ProcUIDrawDoneRelease(); - break; - } - case PROCUI_STATUS_IN_FOREGROUND: { - break; - } - case PROCUI_STATUS_IN_BACKGROUND: - default: - break; + switch (ProcUIProcessMessages(true)) { + case PROCUI_STATUS_EXITING: { + return false; + } + case PROCUI_STATUS_RELEASE_FOREGROUND: { + ProcUIDrawDoneRelease(); + break; + } + case PROCUI_STATUS_IN_FOREGROUND: { + break; + } + case PROCUI_STATUS_IN_BACKGROUND: + default: + break; } return true; } @@ -62,30 +62,30 @@ extern "C" int _start(int argc, char **argv) { ApplicationMemoryEnd = (ApplicationMemoryEnd + 0x100) & 0xFFFFFF00; - module_information_t * gModuleData = (module_information_t *) ApplicationMemoryEnd; + module_information_t *gModuleData = (module_information_t *) ApplicationMemoryEnd; uint32_t moduleDataStartAddress = ((uint32_t) gModuleData + sizeof(module_information_t)); moduleDataStartAddress = (moduleDataStartAddress + 0x10000) & 0xFFFF0000; - ModuleData * moduleData = ModuleDataFactory::load("fs:/vol/external01/wiiu/payload.rpx", 0x00FFF000, 0x00FFF000 - ApplicationMemoryEnd, gModuleData->trampolines, DYN_LINK_TRAMPOLIN_LIST_LENGTH); - if(moduleData != NULL) { + ModuleData *moduleData = ModuleDataFactory::load("fs:/vol/external01/wiiu/payload.rpx", 0x00FFF000, 0x00FFF000 - ApplicationMemoryEnd, gModuleData->trampolines, DYN_LINK_TRAMPOLIN_LIST_LENGTH); + if (moduleData != NULL) { DEBUG_FUNCTION_LINE("Loaded module data"); std::vector relocData = moduleData->getRelocationDataList(); - if(!doRelocation(relocData, gModuleData->trampolines,DYN_LINK_TRAMPOLIN_LIST_LENGTH)) { + if (!doRelocation(relocData, gModuleData->trampolines, DYN_LINK_TRAMPOLIN_LIST_LENGTH)) { DEBUG_FUNCTION_LINE("relocations failed"); } - if(moduleData->getBSSAddr() != 0) { + if (moduleData->getBSSAddr() != 0) { DEBUG_FUNCTION_LINE("memset .bss %08X (%d)", moduleData->getBSSAddr(), moduleData->getBSSSize()); - memset((void*)moduleData->getBSSAddr(), 0, moduleData->getBSSSize()); + memset((void *) moduleData->getBSSAddr(), 0, moduleData->getBSSSize()); } - if(moduleData->getSBSSAddr() != 0) { + if (moduleData->getSBSSAddr() != 0) { DEBUG_FUNCTION_LINE("memset .sbss %08X (%d)", moduleData->getSBSSAddr(), moduleData->getSBSSSize()); - memset((void*)moduleData->getSBSSAddr(), 0, moduleData->getSBSSSize()); + memset((void *) moduleData->getSBSSAddr(), 0, moduleData->getSBSSSize()); } - DCFlushRange((void*)0x00800000, 0x00800000); - ICInvalidateRange((void*)0x00800000, 0x00800000); + DCFlushRange((void *) 0x00800000, 0x00800000); + ICInvalidateRange((void *) 0x00800000, 0x00800000); DEBUG_FUNCTION_LINE("New entrypoint: %08X", moduleData->getEntrypoint()); - ((int (*)(int, char **))moduleData->getEntrypoint())(argc, argv); + ((int (*)(int, char **)) moduleData->getEntrypoint())(argc, argv); delete moduleData; } else { DEBUG_FUNCTION_LINE("Failed to load module"); @@ -95,7 +95,7 @@ extern "C" int _start(int argc, char **argv) { ProcUIInit(OSSavesDone_ReadyToRelease); DEBUG_FUNCTION_LINE("In ProcUI loop"); - while(CheckRunning()) { + while (CheckRunning()) { // wait. OSSleepTicks(OSMillisecondsToTicks(100)); } @@ -105,9 +105,9 @@ extern "C" int _start(int argc, char **argv) { return 0; } -bool doRelocation(std::vector &relocData, relocation_trampolin_entry_t * tramp_data, uint32_t tramp_length) { - for (auto const& curReloc : relocData) { - RelocationData * cur = curReloc; +bool doRelocation(std::vector &relocData, relocation_trampolin_entry_t *tramp_data, uint32_t tramp_length) { + for (auto const &curReloc : relocData) { + RelocationData *cur = curReloc; std::string functionName = cur->getName(); std::string rplName = cur->getImportRPLInformation()->getName(); int32_t isData = cur->getImportRPLInformation()->isData(); @@ -115,11 +115,11 @@ bool doRelocation(std::vector &relocData, relocation_trampolin OSDynLoad_Acquire(rplName.c_str(), &rplHandle); uint32_t functionAddress = 0; - OSDynLoad_FindExport(rplHandle, isData, functionName.c_str(), (void**) &functionAddress); - if(functionAddress == 0) { + OSDynLoad_FindExport(rplHandle, isData, functionName.c_str(), (void **) &functionAddress); + if (functionAddress == 0) { return false; } - if(!ElfUtils::elfLinkOne(cur->getType(), cur->getOffset(), cur->getAddend(), (uint32_t) cur->getDestination(), functionAddress, tramp_data, tramp_length, RELOC_TYPE_IMPORT)) { + if (!ElfUtils::elfLinkOne(cur->getType(), cur->getOffset(), cur->getAddend(), (uint32_t) cur->getDestination(), functionAddress, tramp_data, tramp_length, RELOC_TYPE_IMPORT)) { DEBUG_FUNCTION_LINE("Relocation failed"); return false; } diff --git a/src/module/DynamicLinkingHelper.cpp b/src/module/DynamicLinkingHelper.cpp index efad61f..b30328d 100644 --- a/src/module/DynamicLinkingHelper.cpp +++ b/src/module/DynamicLinkingHelper.cpp @@ -6,26 +6,26 @@ #include "utils/logger.h" #include "common/module_defines.h" -dyn_linking_function_t * DynamicLinkingHelper::getOrAddFunctionEntryByName(dyn_linking_relocation_data_t * data, const char* functionName) { - if(data == NULL) { +dyn_linking_function_t *DynamicLinkingHelper::getOrAddFunctionEntryByName(dyn_linking_relocation_data_t *data, const char *functionName) { + if (data == NULL) { return NULL; } - if(functionName == NULL) { + if (functionName == NULL) { return NULL; } - dyn_linking_function_t * result = NULL; - for(int32_t i = 0; i < DYN_LINK_FUNCTION_LIST_LENGTH; i++) { - dyn_linking_function_t * curEntry = &(data->functions[i]); - if(strlen(curEntry->functionName) == 0) { - if(strlen(functionName) > DYN_LINK_FUNCTION_NAME_LENGTH) { + dyn_linking_function_t *result = NULL; + for (int32_t i = 0; i < DYN_LINK_FUNCTION_LIST_LENGTH; i++) { + dyn_linking_function_t *curEntry = &(data->functions[i]); + if (strlen(curEntry->functionName) == 0) { + if (strlen(functionName) > DYN_LINK_FUNCTION_NAME_LENGTH) { DEBUG_FUNCTION_LINE("Failed to add function name, it's too long."); return NULL; } - strncpy(curEntry->functionName,functionName,DYN_LINK_FUNCTION_NAME_LENGTH); + strncpy(curEntry->functionName, functionName, DYN_LINK_FUNCTION_NAME_LENGTH); result = curEntry; break; } - if(strncmp(curEntry->functionName,functionName,DYN_LINK_FUNCTION_NAME_LENGTH) == 0) { + if (strncmp(curEntry->functionName, functionName, DYN_LINK_FUNCTION_NAME_LENGTH) == 0) { result = curEntry; break; } @@ -33,62 +33,65 @@ dyn_linking_function_t * DynamicLinkingHelper::getOrAddFunctionEntryByName(dyn_l return result; } -dyn_linking_import_t * DynamicLinkingHelper::getOrAddFunctionImportByName(dyn_linking_relocation_data_t * data, const char* importName) { +dyn_linking_import_t *DynamicLinkingHelper::getOrAddFunctionImportByName(dyn_linking_relocation_data_t *data, const char *importName) { return getOrAddImport(data, importName, false); } -dyn_linking_import_t * DynamicLinkingHelper::getOrAddDataImportByName(dyn_linking_relocation_data_t * data, const char* importName) { +dyn_linking_import_t *DynamicLinkingHelper::getOrAddDataImportByName(dyn_linking_relocation_data_t *data, const char *importName) { return getOrAddImport(data, importName, true); } -dyn_linking_import_t * DynamicLinkingHelper::getOrAddImport(dyn_linking_relocation_data_t * data, const char* importName, bool isData) { - if(importName == NULL || data == NULL) { +dyn_linking_import_t *DynamicLinkingHelper::getOrAddImport(dyn_linking_relocation_data_t *data, const char *importName, bool isData) { + if (importName == NULL || data == NULL) { return NULL; } - dyn_linking_import_t * result = NULL; - for(int32_t i = 0; i < DYN_LINK_IMPORT_LIST_LENGTH; i++) { - dyn_linking_import_t * curEntry = &(data->imports[i]); - if(strlen(curEntry->importName) == 0) { - if(strlen(importName) > DYN_LINK_IMPORT_NAME_LENGTH) { + dyn_linking_import_t *result = NULL; + for (int32_t i = 0; i < DYN_LINK_IMPORT_LIST_LENGTH; i++) { + dyn_linking_import_t *curEntry = &(data->imports[i]); + if (strlen(curEntry->importName) == 0) { + if (strlen(importName) > DYN_LINK_IMPORT_NAME_LENGTH) { DEBUG_FUNCTION_LINE("Failed to add Import, it's too long."); return NULL; } - strncpy(curEntry->importName,importName,DYN_LINK_IMPORT_NAME_LENGTH); + strncpy(curEntry->importName, importName, DYN_LINK_IMPORT_NAME_LENGTH); curEntry->isData = isData; result = curEntry; break; } - if(strncmp(curEntry->importName,importName,DYN_LINK_IMPORT_NAME_LENGTH) == 0 && (curEntry->isData == isData)) { + if (strncmp(curEntry->importName, importName, DYN_LINK_IMPORT_NAME_LENGTH) == 0 && (curEntry->isData == isData)) { return curEntry; } } return result; } -bool DynamicLinkingHelper::addReloationEntry(dyn_linking_relocation_data_t * linking_data, dyn_linking_relocation_entry_t * linking_entries, uint32_t linking_entry_length, RelocationData * relocationData) { - return addReloationEntry(linking_data, linking_entries, linking_entry_length, relocationData->getType(), relocationData->getOffset(), relocationData->getAddend(), relocationData->getDestination(), relocationData->getName(), relocationData->getImportRPLInformation()); +bool DynamicLinkingHelper::addReloationEntry(dyn_linking_relocation_data_t *linking_data, dyn_linking_relocation_entry_t *linking_entries, uint32_t linking_entry_length, RelocationData *relocationData) { + return addReloationEntry(linking_data, linking_entries, linking_entry_length, relocationData->getType(), relocationData->getOffset(), relocationData->getAddend(), relocationData->getDestination(), relocationData->getName(), + relocationData->getImportRPLInformation()); } -bool DynamicLinkingHelper::addReloationEntry(dyn_linking_relocation_data_t * linking_data, dyn_linking_relocation_entry_t * linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, std::string name, ImportRPLInformation * rplInfo) { - dyn_linking_import_t * importInfoGbl = DynamicLinkingHelper::getOrAddImport(linking_data, rplInfo->getName().c_str(),rplInfo->isData()); - if(importInfoGbl == NULL) { - DEBUG_FUNCTION_LINE("Getting import info failed. Probably maximum of %d rpl files to import reached.",DYN_LINK_IMPORT_LIST_LENGTH); +bool DynamicLinkingHelper::addReloationEntry(dyn_linking_relocation_data_t *linking_data, dyn_linking_relocation_entry_t *linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, + std::string name, ImportRPLInformation *rplInfo) { + dyn_linking_import_t *importInfoGbl = DynamicLinkingHelper::getOrAddImport(linking_data, rplInfo->getName().c_str(), rplInfo->isData()); + if (importInfoGbl == NULL) { + DEBUG_FUNCTION_LINE("Getting import info failed. Probably maximum of %d rpl files to import reached.", DYN_LINK_IMPORT_LIST_LENGTH); return false; } - dyn_linking_function_t * functionInfo = DynamicLinkingHelper::getOrAddFunctionEntryByName(linking_data, name.c_str()); - if(functionInfo == NULL) { - DEBUG_FUNCTION_LINE("Getting import info failed. Probably maximum of %d function to be relocated reached.",DYN_LINK_FUNCTION_LIST_LENGTH); + dyn_linking_function_t *functionInfo = DynamicLinkingHelper::getOrAddFunctionEntryByName(linking_data, name.c_str()); + if (functionInfo == NULL) { + DEBUG_FUNCTION_LINE("Getting import info failed. Probably maximum of %d function to be relocated reached.", DYN_LINK_FUNCTION_LIST_LENGTH); return false; } return addReloationEntry(linking_entries, linking_entry_length, type, offset, addend, destination, functionInfo, importInfoGbl); } -bool DynamicLinkingHelper::addReloationEntry(dyn_linking_relocation_entry_t * linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, dyn_linking_function_t * functionName, dyn_linking_import_t * importInfo) { - for(uint32_t i = 0; i < linking_entry_length; i++) { - dyn_linking_relocation_entry_t * curEntry = &(linking_entries[i]); - if(curEntry->functionEntry != NULL) { +bool DynamicLinkingHelper::addReloationEntry(dyn_linking_relocation_entry_t *linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, dyn_linking_function_t *functionName, + dyn_linking_import_t *importInfo) { + for (uint32_t i = 0; i < linking_entry_length; i++) { + dyn_linking_relocation_entry_t *curEntry = &(linking_entries[i]); + if (curEntry->functionEntry != NULL) { continue; } curEntry->type = type; diff --git a/src/module/DynamicLinkingHelper.h b/src/module/DynamicLinkingHelper.h index 0e30dc5..0d999f7 100644 --- a/src/module/DynamicLinkingHelper.h +++ b/src/module/DynamicLinkingHelper.h @@ -1,4 +1,5 @@ #pragma once + #include "common/dynamic_linking_defines.h" #include "utils/logger.h" #include @@ -13,7 +14,7 @@ public: \param functionName Name of the function \return Returns a pointer to the entry which contains the functionName. Null on error or if the list full. **/ - static dyn_linking_function_t * getOrAddFunctionEntryByName(dyn_linking_relocation_data_t * data, const char * functionName); + static dyn_linking_function_t *getOrAddFunctionEntryByName(dyn_linking_relocation_data_t *data, const char *functionName); /** Gets the function import entry for a given function name. If the import is not present in the list, it will be added. @@ -22,7 +23,7 @@ public: \param importName Name of the function \return Returns a pointer to the function import entry which contains the importName. Null on error or if the list full. **/ - static dyn_linking_import_t * getOrAddFunctionImportByName(dyn_linking_relocation_data_t * data, const char * importName); + static dyn_linking_import_t *getOrAddFunctionImportByName(dyn_linking_relocation_data_t *data, const char *importName); /** @@ -32,7 +33,7 @@ public: \param importName Name of the data \return Returns a pointer to the data import entry which contains the importName. Null on error or if the list full. **/ - static dyn_linking_import_t * getOrAddDataImportByName(dyn_linking_relocation_data_t * data, const char * importName); + static dyn_linking_import_t *getOrAddDataImportByName(dyn_linking_relocation_data_t *data, const char *importName); /** @@ -44,13 +45,16 @@ public: \return Returns a pointer to the data import entry which contains the importName. Null on error or if the list full. **/ - static dyn_linking_import_t * getOrAddImport(dyn_linking_relocation_data_t * data, const char * importName, bool isData); + static dyn_linking_import_t *getOrAddImport(dyn_linking_relocation_data_t *data, const char *importName, bool isData); - static bool addReloationEntry(dyn_linking_relocation_data_t * linking_data, dyn_linking_relocation_entry_t * linking_entries, uint32_t linking_entry_length, RelocationData * relocationData); + static bool addReloationEntry(dyn_linking_relocation_data_t *linking_data, dyn_linking_relocation_entry_t *linking_entries, uint32_t linking_entry_length, RelocationData *relocationData); - static bool addReloationEntry(dyn_linking_relocation_data_t * linking_data, dyn_linking_relocation_entry_t * linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, std::string name, ImportRPLInformation * rplInfo); + static bool addReloationEntry(dyn_linking_relocation_data_t *linking_data, dyn_linking_relocation_entry_t *linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, std::string name, + ImportRPLInformation *rplInfo); + + static bool + addReloationEntry(dyn_linking_relocation_entry_t *linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, dyn_linking_function_t *functionName, dyn_linking_import_t *importInfo); - static bool addReloationEntry(dyn_linking_relocation_entry_t * linking_entries, uint32_t linking_entry_length, char type, size_t offset, int32_t addend, void *destination, dyn_linking_function_t * functionName, dyn_linking_import_t * importInfo); private: DynamicLinkingHelper() { } diff --git a/src/module/ImportRPLInformation.h b/src/module/ImportRPLInformation.h index ee9a05f..90dc45d 100644 --- a/src/module/ImportRPLInformation.h +++ b/src/module/ImportRPLInformation.h @@ -31,7 +31,7 @@ public: ~ImportRPLInformation() { } - static ImportRPLInformation * createImportRPLInformation(std::string rawSectionName) { + static ImportRPLInformation *createImportRPLInformation(std::string rawSectionName) { std::string fimport = ".fimport_"; std::string dimport = ".dimport_"; @@ -39,7 +39,7 @@ public: std::string rplName = ""; - if(rawSectionName.size() < fimport.size()) { + if (rawSectionName.size() < fimport.size()) { return NULL; } else if (std::equal(fimport.begin(), fimport.end(), rawSectionName.begin())) { rplName = rawSectionName.substr(fimport.size()); diff --git a/src/module/ModuleData.cpp b/src/module/ModuleData.cpp index 5c41dba..7cf16a9 100644 --- a/src/module/ModuleData.cpp +++ b/src/module/ModuleData.cpp @@ -3,8 +3,8 @@ std::string ModuleData::toString() { std::string res = StringTools::strfmt("Entrypoint %08X, bss: %08X (%d), bss: %08X (%d)\n", getEntrypoint(), getBSSAddr(), getBSSSize(), getSBSSAddr(), getSBSSSize()); - for (auto const& reloc : relocation_data_list) { - if(reloc != NULL) { + for (auto const &reloc : relocation_data_list) { + if (reloc != NULL) { res += reloc->toString(); } } diff --git a/src/module/ModuleData.h b/src/module/ModuleData.h index 41b9a77..d24a533 100644 --- a/src/module/ModuleData.h +++ b/src/module/ModuleData.h @@ -27,8 +27,8 @@ public: } ~ModuleData() { - for (auto const& reloc : relocation_data_list) { - if(reloc != NULL) { + for (auto const &reloc : relocation_data_list) { + if (reloc != NULL) { delete reloc; } } @@ -48,7 +48,7 @@ public: this->entrypoint = addr; } - void addRelocationData(RelocationData * relocation_data) { + void addRelocationData(RelocationData *relocation_data) { relocation_data_list.push_back(relocation_data); } @@ -77,6 +77,7 @@ public: } std::string toString(); + private: std::vector relocation_data_list; diff --git a/src/module/ModuleDataFactory.cpp b/src/module/ModuleDataFactory.cpp index ee54716..5b1a842 100644 --- a/src/module/ModuleDataFactory.cpp +++ b/src/module/ModuleDataFactory.cpp @@ -26,10 +26,10 @@ using namespace ELFIO; -ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_address, uint32_t maximum_size, relocation_trampolin_entry_t * trampolin_data, uint32_t trampolin_data_length) { +ModuleData *ModuleDataFactory::load(std::string path, uint32_t destination_address, uint32_t maximum_size, relocation_trampolin_entry_t *trampolin_data, uint32_t trampolin_data_length) { elfio reader; - ModuleData * moduleData = new ModuleData(); - if(moduleData == NULL) { + ModuleData *moduleData = new ModuleData(); + if (moduleData == NULL) { return NULL; } @@ -46,8 +46,8 @@ ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_addr uint32_t sizeOfModule = 0; - for(uint32_t i = 0; i < sec_num; ++i ) { - section* psec = reader.sections[i]; + for (uint32_t i = 0; i < sec_num; ++i) { + section *psec = reader.sections[i]; if (psec->get_type() == 0x80000002) { continue; } @@ -57,12 +57,12 @@ ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_addr } } - if(sizeOfModule > maximum_size){ + if (sizeOfModule > maximum_size) { DEBUG_FUNCTION_LINE("Module is too big."); return NULL; } - uint32_t baseOffset = (destination_address -sizeOfModule) & 0xFFFFFF00; + uint32_t baseOffset = (destination_address - sizeOfModule) & 0xFFFFFF00; uint32_t offset_text = baseOffset; uint32_t offset_data = offset_text; @@ -71,8 +71,8 @@ ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_addr uint32_t totalSize = 0; - for(uint32_t i = 0; i < sec_num; ++i ) { - section* psec = reader.sections[i]; + for (uint32_t i = 0; i < sec_num; ++i) { + section *psec = reader.sections[i]; if (psec->get_type() == 0x80000002) { continue; } @@ -84,15 +84,15 @@ ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_addr destinations[psec->get_index()] = (uint8_t *) baseOffset; uint32_t destination = baseOffset + address; - if((address >= 0x02000000) && address < 0x10000000) { + if ((address >= 0x02000000) && address < 0x10000000) { destination -= 0x02000000; destinations[psec->get_index()] -= 0x02000000; baseOffset += sectionSize; offset_data += sectionSize; - } else if((address >= 0x10000000) && address < 0xC0000000) { + } else if ((address >= 0x10000000) && address < 0xC0000000) { destination -= 0x10000000; destinations[psec->get_index()] -= 0x10000000; - } else if(address >= 0xC0000000) { + } else if (address >= 0xC0000000) { destination -= 0xC0000000; destinations[psec->get_index()] -= 0xC0000000; } else { @@ -102,35 +102,35 @@ ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_addr return NULL; } - const char* p = reader.sections[i]->get_data(); + const char *p = reader.sections[i]->get_data(); - if(psec->get_type() == SHT_NOBITS) { + if (psec->get_type() == SHT_NOBITS) { DEBUG_FUNCTION_LINE("memset section %s %08X [%08X] to 0 (%d bytes)", psec->get_name().c_str(), destination, destination + sectionSize, sectionSize); - memset((void*) destination, 0, sectionSize); - } else if(psec->get_type() == SHT_PROGBITS) { + memset((void *) destination, 0, sectionSize); + } else if (psec->get_type() == SHT_PROGBITS) { DEBUG_FUNCTION_LINE("Copy section %s %08X -> %08X [%08X] (%d bytes)", psec->get_name().c_str(), p, destination, destination + sectionSize, sectionSize); - memcpy((void*) destination, p, sectionSize); + memcpy((void *) destination, p, sectionSize); } //nextAddress = ROUNDUP(destination + sectionSize,0x100); - if(psec->get_name().compare(".bss") == 0) { + if (psec->get_name().compare(".bss") == 0) { moduleData->setBSSLocation(destination, sectionSize); DEBUG_FUNCTION_LINE("Saved %s section info. Location: %08X size: %08X", psec->get_name().c_str(), destination, sectionSize); - } else if(psec->get_name().compare(".sbss") == 0) { + } else if (psec->get_name().compare(".sbss") == 0) { moduleData->setSBSSLocation(destination, sectionSize); DEBUG_FUNCTION_LINE("Saved %s section info. Location: %08X size: %08X", psec->get_name().c_str(), destination, sectionSize); } totalSize += sectionSize; - DCFlushRange((void*)destination, sectionSize); - ICInvalidateRange((void*)destination, sectionSize); + DCFlushRange((void *) destination, sectionSize); + ICInvalidateRange((void *) destination, sectionSize); } } - for(uint32_t i = 0; i < sec_num; ++i ) { - section* psec = reader.sections[i]; + for (uint32_t i = 0; i < sec_num; ++i) { + section *psec = reader.sections[i]; if ((psec->get_type() == SHT_PROGBITS || psec->get_type() == SHT_NOBITS) && (psec->get_flags() & SHF_ALLOC)) { - DEBUG_FUNCTION_LINE("Linking (%d)... %s",i,psec->get_name().c_str()); + DEBUG_FUNCTION_LINE("Linking (%d)... %s", i, psec->get_name().c_str()); if (!linkSection(reader, psec->get_index(), (uint32_t) destinations[psec->get_index()], offset_text, offset_data, trampolin_data, trampolin_data_length)) { DEBUG_FUNCTION_LINE("elfLink failed"); free(destinations); @@ -139,14 +139,14 @@ ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_addr } } } - std::vector relocationData = getImportRelocationData(reader, destinations); + std::vector relocationData = getImportRelocationData(reader, destinations); - for (auto const& reloc : relocationData) { + for (auto const &reloc : relocationData) { moduleData->addRelocationData(reloc); } - DCFlushRange((void*)destination_address, totalSize); - ICInvalidateRange((void*)destination_address, totalSize); + DCFlushRange((void *) destination_address, totalSize); + ICInvalidateRange((void *) destination_address, totalSize); free(destinations); @@ -157,43 +157,43 @@ ModuleData * ModuleDataFactory::load(std::string path, uint32_t destination_addr } -std::vector ModuleDataFactory::getImportRelocationData(elfio& reader, uint8_t ** destinations) { - std::vector result; - std::map infoMap; +std::vector ModuleDataFactory::getImportRelocationData(elfio &reader, uint8_t **destinations) { + std::vector result; + std::map infoMap; uint32_t sec_num = reader.sections.size(); - for ( uint32_t i = 0; i < sec_num; ++i ) { - section* psec = reader.sections[i]; + for (uint32_t i = 0; i < sec_num; ++i) { + section *psec = reader.sections[i]; if (psec->get_type() == 0x80000002) { infoMap[i] = psec->get_name(); } } - for (uint32_t i = 0; i < sec_num; ++i ) { - section* psec = reader.sections[i]; - if(psec->get_type() == SHT_RELA || psec->get_type() == SHT_REL) { - DEBUG_FUNCTION_LINE("Found relocation section %s",psec->get_name().c_str()); + for (uint32_t i = 0; i < sec_num; ++i) { + section *psec = reader.sections[i]; + if (psec->get_type() == SHT_RELA || psec->get_type() == SHT_REL) { + DEBUG_FUNCTION_LINE("Found relocation section %s", psec->get_name().c_str()); relocation_section_accessor rel(reader, psec); - for ( uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j ) { - Elf64_Addr offset; - Elf_Word type; - Elf_Sxword addend; - std::string sym_name; - Elf64_Addr sym_value; - Elf_Half sym_section_index; + for (uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j) { + Elf64_Addr offset; + Elf_Word type; + Elf_Sxword addend; + std::string sym_name; + Elf64_Addr sym_value; + Elf_Half sym_section_index; - if(!rel.get_entry(j, offset, sym_value, sym_name, type, addend, sym_section_index)) { + if (!rel.get_entry(j, offset, sym_value, sym_name, type, addend, sym_section_index)) { DEBUG_FUNCTION_LINE("Failed to get relocation"); break; } uint32_t adjusted_sym_value = (uint32_t) sym_value; - if(adjusted_sym_value < 0xC0000000) { + if (adjusted_sym_value < 0xC0000000) { continue; } - ImportRPLInformation * rplInfo = ImportRPLInformation::createImportRPLInformation(infoMap[sym_section_index]); - if(rplInfo == NULL) { + ImportRPLInformation *rplInfo = ImportRPLInformation::createImportRPLInformation(infoMap[sym_section_index]); + if (rplInfo == NULL) { DEBUG_FUNCTION_LINE("Failed to create import information"); break; } @@ -201,7 +201,7 @@ std::vector ModuleDataFactory::getImportRelocationData(elfio& r uint32_t section_index = psec->get_info(); // When these relocations are performed, we don't need the 0xC0000000 offset anymore. - RelocationData * relocationData = new RelocationData(type, offset - 0x02000000, addend, (void*)(destinations[section_index] + 0x02000000), sym_name, rplInfo); + RelocationData *relocationData = new RelocationData(type, offset - 0x02000000, addend, (void *) (destinations[section_index] + 0x02000000), sym_name, rplInfo); //relocationData->printInformation(); result.push_back(relocationData); } @@ -209,52 +209,53 @@ std::vector ModuleDataFactory::getImportRelocationData(elfio& r } return result; } -bool ModuleDataFactory::linkSection(elfio& reader, uint32_t section_index, uint32_t destination, uint32_t base_text, uint32_t base_data, relocation_trampolin_entry_t * trampolin_data, uint32_t trampolin_data_length) { + +bool ModuleDataFactory::linkSection(elfio &reader, uint32_t section_index, uint32_t destination, uint32_t base_text, uint32_t base_data, relocation_trampolin_entry_t *trampolin_data, uint32_t trampolin_data_length) { uint32_t sec_num = reader.sections.size(); - for (uint32_t i = 0; i < sec_num; ++i ) { - section* psec = reader.sections[i]; - if(psec->get_info() == section_index) { - DEBUG_FUNCTION_LINE("Found relocation section %s",psec->get_name().c_str()); + for (uint32_t i = 0; i < sec_num; ++i) { + section *psec = reader.sections[i]; + if (psec->get_info() == section_index) { + DEBUG_FUNCTION_LINE("Found relocation section %s", psec->get_name().c_str()); relocation_section_accessor rel(reader, psec); - for ( uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j ) { - Elf64_Addr offset; - Elf_Word type; - Elf_Sxword addend; - std::string sym_name; - Elf64_Addr sym_value; - Elf_Half sym_section_index; + for (uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j) { + Elf64_Addr offset; + Elf_Word type; + Elf_Sxword addend; + std::string sym_name; + Elf64_Addr sym_value; + Elf_Half sym_section_index; - if(!rel.get_entry(j, offset, sym_value, sym_name, type, addend, sym_section_index)) { + if (!rel.get_entry(j, offset, sym_value, sym_name, type, addend, sym_section_index)) { DEBUG_FUNCTION_LINE("Failed to get relocation"); break; } uint32_t adjusted_sym_value = (uint32_t) sym_value; - if((adjusted_sym_value >= 0x02000000) && adjusted_sym_value < 0x10000000) { + if ((adjusted_sym_value >= 0x02000000) && adjusted_sym_value < 0x10000000) { adjusted_sym_value -= 0x02000000; adjusted_sym_value += base_text; - } else if((adjusted_sym_value >= 0x10000000) && adjusted_sym_value < 0xC0000000) { + } else if ((adjusted_sym_value >= 0x10000000) && adjusted_sym_value < 0xC0000000) { adjusted_sym_value -= 0x10000000; adjusted_sym_value += base_data; - } else if(adjusted_sym_value >= 0xC0000000) { + } else if (adjusted_sym_value >= 0xC0000000) { // Skip imports continue; - } else if(adjusted_sym_value == 0x0) { + } else if (adjusted_sym_value == 0x0) { // } else { - DEBUG_FUNCTION_LINE("Unhandled case %08X",adjusted_sym_value); + DEBUG_FUNCTION_LINE("Unhandled case %08X", adjusted_sym_value); return false; } - if(sym_section_index == SHN_ABS) { + if (sym_section_index == SHN_ABS) { // - } else if(sym_section_index > SHN_LORESERVE) { + } else if (sym_section_index > SHN_LORESERVE) { DEBUG_FUNCTION_LINE("NOT IMPLEMENTED: %04X", sym_section_index); return false; } - if(!ElfUtils::elfLinkOne(type, offset, addend, destination, adjusted_sym_value, trampolin_data, trampolin_data_length, RELOC_TYPE_FIXED)) { + if (!ElfUtils::elfLinkOne(type, offset, addend, destination, adjusted_sym_value, trampolin_data, trampolin_data_length, RELOC_TYPE_FIXED)) { DEBUG_FUNCTION_LINE("Link failed"); return false; } diff --git a/src/module/ModuleDataFactory.h b/src/module/ModuleDataFactory.h index b0a2525..ea4edad 100644 --- a/src/module/ModuleDataFactory.h +++ b/src/module/ModuleDataFactory.h @@ -26,7 +26,9 @@ class ModuleDataFactory { public: - static ModuleData * load(std::string path, uint32_t destination_address, uint32_t maximum_size, relocation_trampolin_entry_t * trampolin_data, uint32_t trampolin_data_length); - static bool linkSection(ELFIO::elfio& reader, uint32_t section_index, uint32_t destination, uint32_t base_text, uint32_t base_data, relocation_trampolin_entry_t * trampolin_data, uint32_t trampolin_data_length); - static std::vector getImportRelocationData(ELFIO::elfio& reader, uint8_t ** destinations); + static ModuleData *load(std::string path, uint32_t destination_address, uint32_t maximum_size, relocation_trampolin_entry_t *trampolin_data, uint32_t trampolin_data_length); + + static bool linkSection(ELFIO::elfio &reader, uint32_t section_index, uint32_t destination, uint32_t base_text, uint32_t base_data, relocation_trampolin_entry_t *trampolin_data, uint32_t trampolin_data_length); + + static std::vector getImportRelocationData(ELFIO::elfio &reader, uint8_t **destinations); }; diff --git a/src/module/RelocationData.cpp b/src/module/RelocationData.cpp index fb2197b..900fd87 100644 --- a/src/module/RelocationData.cpp +++ b/src/module/RelocationData.cpp @@ -1,6 +1,6 @@ #include "RelocationData.h" #include "utils/StringTools.h" -std::string RelocationData::toString(){ - return StringTools::strfmt("%s destination: %08X offset: %08X type: %02X addend: %d rplName: %s isData: %d" ,name.c_str(), destination, offset, type, addend, rplInfo->getName().c_str(), rplInfo->isData() ); +std::string RelocationData::toString() { + return StringTools::strfmt("%s destination: %08X offset: %08X type: %02X addend: %d rplName: %s isData: %d", name.c_str(), destination, offset, type, addend, rplInfo->getName().c_str(), rplInfo->isData()); } diff --git a/src/module/RelocationData.h b/src/module/RelocationData.h index 5e463b3..476cc90 100644 --- a/src/module/RelocationData.h +++ b/src/module/RelocationData.h @@ -23,7 +23,7 @@ class RelocationData { public: - RelocationData(char type, size_t offset, int32_t addend, void *destination, std::string name, ImportRPLInformation * rplInfo) { + RelocationData(char type, size_t offset, int32_t addend, void *destination, std::string name, ImportRPLInformation *rplInfo) { this->type = type; this->offset = offset; this->addend = addend; @@ -33,7 +33,7 @@ public: } ~RelocationData() { - if(rplInfo != NULL) { + if (rplInfo != NULL) { delete rplInfo; } } @@ -50,7 +50,7 @@ public: return addend; } - void * getDestination() { + void *getDestination() { return destination; } @@ -58,16 +58,17 @@ public: return name; } - ImportRPLInformation * getImportRPLInformation() { + ImportRPLInformation *getImportRPLInformation() { return rplInfo; } std::string toString(); + private: char type; size_t offset; int32_t addend; void *destination; std::string name; - ImportRPLInformation * rplInfo; + ImportRPLInformation *rplInfo; }; diff --git a/src/utils/StringTools.cpp b/src/utils/StringTools.cpp index ec7cf68..2483972 100644 --- a/src/utils/StringTools.cpp +++ b/src/utils/StringTools.cpp @@ -36,13 +36,14 @@ #include -BOOL StringTools::EndsWith(const std::string& a, const std::string& b) { - if (b.size() > a.size()) +BOOL StringTools::EndsWith(const std::string &a, const std::string &b) { + if (b.size() > a.size()) { return false; + } return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin()); } -const char * StringTools::byte_to_binary(int32_t x) { +const char *StringTools::byte_to_binary(int32_t x) { static char b[9]; b[0] = '\0'; @@ -54,25 +55,26 @@ const char * StringTools::byte_to_binary(int32_t x) { return b; } -std::string StringTools::removeCharFromString(std::string& input,char toBeRemoved) { +std::string StringTools::removeCharFromString(std::string &input, char toBeRemoved) { std::string output = input; size_t position; - while(1) { + while (1) { position = output.find(toBeRemoved); - if(position == std::string::npos) + if (position == std::string::npos) { break; + } output.erase(position, 1); } return output; } -const char * StringTools::fmt(const char * format, ...) { +const char *StringTools::fmt(const char *format, ...) { static char strChar[512]; strChar[0] = 0; va_list va; va_start(va, format); - if((vsprintf(strChar, format, va) >= 0)) { + if ((vsprintf(strChar, format, va) >= 0)) { va_end(va); return (const char *) strChar; } @@ -81,26 +83,28 @@ const char * StringTools::fmt(const char * format, ...) { return NULL; } -const wchar_t * StringTools::wfmt(const char * format, ...) { +const wchar_t *StringTools::wfmt(const char *format, ...) { static char tmp[512]; static wchar_t strWChar[512]; strWChar[0] = 0; tmp[0] = 0; - if(!format) + if (!format) { return (const wchar_t *) strWChar; + } - if(strcmp(format, "") == 0) + if (strcmp(format, "") == 0) { return (const wchar_t *) strWChar; + } va_list va; va_start(va, format); - if((vsprintf(tmp, format, va) >= 0)) { - int bt; + if ((vsprintf(tmp, format, va) >= 0)) { + int bt; int32_t strlength = strlen(tmp); - bt = mbstowcs(strWChar, tmp, (strlength < 512) ? strlength : 512 ); + bt = mbstowcs(strWChar, tmp, (strlength < 512) ? strlength : 512); - if(bt > 0) { + if (bt > 0) { strWChar[bt] = 0; return (const wchar_t *) strWChar; } @@ -110,14 +114,14 @@ const wchar_t * StringTools::wfmt(const char * format, ...) { return NULL; } -int32_t StringTools::strprintf(std::string &str, const char * format, ...) { +int32_t StringTools::strprintf(std::string &str, const char *format, ...) { static char tmp[512]; tmp[0] = 0; int32_t result = 0; va_list va; va_start(va, format); - if((vsprintf(tmp, format, va) >= 0)) { + if ((vsprintf(tmp, format, va) >= 0)) { str = tmp; result = str.size(); } @@ -126,14 +130,14 @@ int32_t StringTools::strprintf(std::string &str, const char * format, ...) { return result; } -std::string StringTools::strfmt(const char * format, ...) { +std::string StringTools::strfmt(const char *format, ...) { std::string str; static char tmp[512]; tmp[0] = 0; va_list va; va_start(va, format); - if((vsprintf(tmp, format, va) >= 0)) { + if ((vsprintf(tmp, format, va) >= 0)) { str = tmp; } va_end(va); @@ -141,11 +145,12 @@ std::string StringTools::strfmt(const char * format, ...) { return str; } -BOOL StringTools::char2wchar_t(const char * strChar, wchar_t * dest) { - if(!strChar || !dest) +BOOL StringTools::char2wchar_t(const char *strChar, wchar_t *dest) { + if (!strChar || !dest) { return false; + } - int bt; + int bt; bt = mbstowcs(dest, strChar, strlen(strChar)); if (bt > 0) { dest[bt] = 0; @@ -155,39 +160,42 @@ BOOL StringTools::char2wchar_t(const char * strChar, wchar_t * dest) { return false; } -int32_t StringTools::strtokcmp(const char * string, const char * compare, const char * separator) { - if(!string || !compare) +int32_t StringTools::strtokcmp(const char *string, const char *compare, const char *separator) { + if (!string || !compare) { return -1; + } char TokCopy[512]; strncpy(TokCopy, compare, sizeof(TokCopy)); TokCopy[511] = '\0'; - char * strTok = strtok(TokCopy, separator); + char *strTok = strtok(TokCopy, separator); while (strTok != NULL) { if (strcasecmp(string, strTok) == 0) { return 0; } - strTok = strtok(NULL,separator); + strTok = strtok(NULL, separator); } return -1; } -int32_t StringTools::strextcmp(const char * string, const char * extension, char seperator) { - if(!string || !extension) +int32_t StringTools::strextcmp(const char *string, const char *extension, char seperator) { + if (!string || !extension) { return -1; + } char *ptr = strrchr(string, seperator); - if(!ptr) + if (!ptr) { return -1; + } return strcasecmp(ptr + 1, extension); } -std::vector StringTools::stringSplit(const std::string & inValue, const std::string & splitter) { +std::vector StringTools::stringSplit(const std::string &inValue, const std::string &splitter) { std::string value = inValue; std::vector result; while (true) { @@ -202,7 +210,7 @@ std::vector StringTools::stringSplit(const std::string & inValue, c result.push_back(""); break; } - if(index + splitter.size() > value.length()) { + if (index + splitter.size() > value.length()) { break; } value = value.substr(index + splitter.size(), value.length()); @@ -211,39 +219,41 @@ std::vector StringTools::stringSplit(const std::string & inValue, c } -const char * StringTools::FullpathToFilename(const char *path) { - if(!path) - return path; +const char *StringTools::FullpathToFilename(const char *path) { + if (!path) { + return path; + } - const char * ptr = path; - const char * Filename = ptr; + const char *ptr = path; + const char *Filename = ptr; - while(*ptr != '\0') { - if(ptr[0] == '/' && ptr[1] != '\0') - Filename = ptr+1; - - ++ptr; + while (*ptr != '\0') { + if (ptr[0] == '/' && ptr[1] != '\0') { + Filename = ptr + 1; } - return Filename; + ++ptr; } + return Filename; +} + void StringTools::RemoveDoubleSlashs(std::string &str) { - uint32_t length = str.size(); + uint32_t length = str.size(); - //! clear path of double slashes - for(uint32_t i = 1; i < length; ++i) { - if(str[i-1] == '/' && str[i] == '/') { - str.erase(i, 1); - i--; - length--; - } + //! clear path of double slashes + for (uint32_t i = 1; i < length; ++i) { + if (str[i - 1] == '/' && str[i] == '/') { + str.erase(i, 1); + i--; + length--; } } +} // You must free the result if result is non-NULL. -char * StringTools::str_replace(char *orig, char *rep, char *with) { +char *StringTools::str_replace(char *orig, char *rep, char *with) { char *result; // the return string char *ins; // the next insert point char *tmp; // varies @@ -253,11 +263,13 @@ char * StringTools::str_replace(char *orig, char *rep, char *with) { int count; // number of replacements // sanity checks and initialization - if (!orig || !rep) + if (!orig || !rep) { return NULL; + } len_rep = strlen(rep); - if (len_rep == 0) - return NULL; // empty rep causes infinite loop during count + if (len_rep == 0) { + return NULL; + } // empty rep causes infinite loop during count if (!with) with = ""; len_with = strlen(with); @@ -268,7 +280,7 @@ char * StringTools::str_replace(char *orig, char *rep, char *with) { ins = tmp + len_rep; } - tmp = result = (char*)malloc(strlen(orig) + (len_with - len_rep) * count + 1); + tmp = result = (char *) malloc(strlen(orig) + (len_with - len_rep) * count + 1); if (!result) return NULL; diff --git a/src/utils/StringTools.h b/src/utils/StringTools.h index 8087a70..851aa73 100644 --- a/src/utils/StringTools.h +++ b/src/utils/StringTools.h @@ -32,20 +32,33 @@ class StringTools { public: - static BOOL EndsWith(const std::string& a, const std::string& b); - static const char * byte_to_binary(int32_t x); - static std::string removeCharFromString(std::string& input,char toBeRemoved); - static const char * fmt(const char * format, ...); - static const wchar_t * wfmt(const char * format, ...); - static int32_t strprintf(std::string &str, const char * format, ...); - static std::string strfmt(const char * format, ...); - static BOOL char2wchar_t(const char * src, wchar_t * dest); - static int32_t strtokcmp(const char * string, const char * compare, const char * separator); - static int32_t strextcmp(const char * string, const char * extension, char seperator); + static BOOL EndsWith(const std::string &a, const std::string &b); + + static const char *byte_to_binary(int32_t x); + + static std::string removeCharFromString(std::string &input, char toBeRemoved); + + static const char *fmt(const char *format, ...); + + static const wchar_t *wfmt(const char *format, ...); + + static int32_t strprintf(std::string &str, const char *format, ...); + + static std::string strfmt(const char *format, ...); + + static BOOL char2wchar_t(const char *src, wchar_t *dest); + + static int32_t strtokcmp(const char *string, const char *compare, const char *separator); + + static int32_t strextcmp(const char *string, const char *extension, char seperator); + static char *str_replace(char *orig, char *rep, char *with); - static const char * FullpathToFilename(const char *path); + + static const char *FullpathToFilename(const char *path); + static void RemoveDoubleSlashs(std::string &str); - static std::vector stringSplit(const std::string & value, const std::string & splitter); + + static std::vector stringSplit(const std::string &value, const std::string &splitter); }; #endif /* __STRING_TOOLS_H */ diff --git a/src/utils/logger.c b/src/utils/logger.c index 0922230..69cd856 100644 --- a/src/utils/logger.c +++ b/src/utils/logger.c @@ -10,15 +10,16 @@ #include #include -static int log_socket __attribute__((section(".data")))= -1; +static int log_socket __attribute__((section(".data"))) = -1; static struct sockaddr_in connect_addr __attribute__((section(".data"))); static volatile int log_lock __attribute__((section(".data"))) = 0; void log_init_() { int broadcastEnable = 1; log_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (log_socket < 0) + if (log_socket < 0) { return; + } setsockopt(log_socket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); @@ -30,11 +31,11 @@ void log_init_() { void log_print_(const char *str) { // socket is always 0 initially as it is in the BSS - if(log_socket < 0) { + if (log_socket < 0) { return; } - while(log_lock) + while (log_lock) OSSleepTicks(OSMicrosecondsToTicks(1000)); log_lock = 1; @@ -42,9 +43,10 @@ void log_print_(const char *str) { int ret; while (len > 0) { int block = len < 1400 ? len : 1400; // take max 1400 bytes per UDP packet - ret = sendto(log_socket, str, block, 0, (struct sockaddr *)&connect_addr, sizeof(struct sockaddr_in)); - if(ret < 0) + ret = sendto(log_socket, str, block, 0, (struct sockaddr *) &connect_addr, sizeof(struct sockaddr_in)); + if (ret < 0) { break; + } len -= ret; str += ret; @@ -58,14 +60,14 @@ void OSFatal_printf(const char *format, ...) { tmp[0] = 0; va_list va; va_start(va, format); - if((vsprintf(tmp, format, va) >= 0)) { + if ((vsprintf(tmp, format, va) >= 0)) { OSFatal(tmp); } va_end(va); } void log_printf_(const char *format, ...) { - if(log_socket < 0) { + if (log_socket < 0) { return; } @@ -74,7 +76,7 @@ void log_printf_(const char *format, ...) { va_list va; va_start(va, format); - if((vsprintf(tmp, format, va) >= 0)) { + if ((vsprintf(tmp, format, va) >= 0)) { log_print_(tmp); } va_end(va); diff --git a/src/utils/logger.h b/src/utils/logger.h index 05fe012..0fadbd9 100644 --- a/src/utils/logger.h +++ b/src/utils/logger.h @@ -8,9 +8,12 @@ extern "C" { #include void log_init_(); + //void log_deinit_(void); void log_print_(const char *str); + void log_printf_(const char *format, ...); + void OSFatal_printf(const char *format, ...); #define __FILENAME_X__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) @@ -21,7 +24,6 @@ void OSFatal_printf(const char *format, ...); } while (0) - #define log_init() log_init_() //#define log_deinit() log_deinit_() #define log_print(str) log_print_(str) diff --git a/src/utils/utils.c b/src/utils/utils.c index a8b56ee..d02af35 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -7,31 +7,31 @@ #include "utils/logger.h" // https://gist.github.com/ccbrown/9722406 -void dumpHex(const void* data, size_t size) { +void dumpHex(const void *data, size_t size) { char ascii[17]; size_t i, j; ascii[16] = '\0'; DEBUG_FUNCTION_LINE("0x%08X (0x0000): ", data); for (i = 0; i < size; ++i) { - log_printf("%02X ", ((unsigned char*)data)[i]); - if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') { - ascii[i % 16] = ((unsigned char*)data)[i]; + log_printf("%02X ", ((unsigned char *) data)[i]); + if (((unsigned char *) data)[i] >= ' ' && ((unsigned char *) data)[i] <= '~') { + ascii[i % 16] = ((unsigned char *) data)[i]; } else { ascii[i % 16] = '.'; } - if ((i+1) % 8 == 0 || i+1 == size) { + if ((i + 1) % 8 == 0 || i + 1 == size) { log_print(" "); - if ((i+1) % 16 == 0) { + if ((i + 1) % 16 == 0) { log_printf("| %s \n", ascii); - if(i + 1 < size) { - DEBUG_FUNCTION_LINE("0x%08X (0x%04X); ", data + i + 1,i+1); + if (i + 1 < size) { + DEBUG_FUNCTION_LINE("0x%08X (0x%04X); ", data + i + 1, i + 1); } - } else if (i+1 == size) { - ascii[(i+1) % 16] = '\0'; - if ((i+1) % 16 <= 8) { + } else if (i + 1 == size) { + ascii[(i + 1) % 16] = '\0'; + if ((i + 1) % 16 <= 8) { log_print(" "); } - for (j = (i+1) % 16; j < 16; ++j) { + for (j = (i + 1) % 16; j < 16; ++j) { log_print(" "); } log_printf("| %s \n", ascii); diff --git a/src/utils/utils.h b/src/utils/utils.h index 26caaaf..1d00f98 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -7,12 +7,12 @@ extern "C" { #endif -#define LIMIT(x, min, max) \ - ({ \ - typeof( x ) _x = x; \ - typeof( min ) _min = min; \ - typeof( max ) _max = max; \ - ( ( ( _x ) < ( _min ) ) ? ( _min ) : ( ( _x ) > ( _max ) ) ? ( _max) : ( _x ) ); \ +#define LIMIT(x, min, max) \ + ({ \ + typeof( x ) _x = x; \ + typeof( min ) _min = min; \ + typeof( max ) _max = max; \ + ( ( ( _x ) < ( _min ) ) ? ( _min ) : ( ( _x ) > ( _max ) ) ? ( _max) : ( _x ) ); \ }) #define DegToRad(a) ( (a) * 0.01745329252f ) @@ -26,7 +26,7 @@ extern "C" { #define le64(i) ((((uint64_t)le32((i) & 0xFFFFFFFFLL)) << 32) | ((uint64_t)le32(((i) & 0xFFFFFFFF00000000LL) >> 32))) //Needs to have log_init() called beforehand. -void dumpHex(const void* data, size_t size); +void dumpHex(const void *data, size_t size); #ifdef __cplusplus }