diff --git a/wumsloader/src/crt.c b/wumsloader/src/crt.c index 954c654..61717a5 100644 --- a/wumsloader/src/crt.c +++ b/wumsloader/src/crt.c @@ -1,3 +1,6 @@ +#include +#include + void __init_wut_malloc(); void __init_wut_newlib(); @@ -34,3 +37,51 @@ fini_wut() { __fini_wut_newlib(); __fini_wut_malloc(); } + +typedef enum __wut_thread_specific_id { + WUT_THREAD_SPECIFIC_0 = 0, + WUT_THREAD_SPECIFIC_1 = 1, +} __wut_thread_specific_id; + +extern void __attribute__((weak)) wut_set_thread_specific(__wut_thread_specific_id id, void *value); + +void wut_set_thread_specific(__wut_thread_specific_id id, void *value) { + OSThread *thread; + asm volatile("lwz %0, -0x20(0)" + : "=r"(thread)); // OSGetCurrentThread() + if (thread != NULL) { + if (id == WUT_THREAD_SPECIFIC_0) { + thread->reserved[3] = (uint32_t) value; + } else if (id == WUT_THREAD_SPECIFIC_1) { + thread->reserved[4] = (uint32_t) value; + } else { + OSReport("[WUMSLOADER] wut_set_thread_specific: invalid id\n"); + OSFatal("[WUMSLOADER] wut_set_thread_specific: invalid id"); + } + } else { + OSReport("[WUMSLOADER] wut_set_thread_specific: invalid thread\n"); + OSFatal("[WUMSLOADER] wut_set_thread_specific: invalid thread"); + } +} + +extern void *__attribute__((weak)) wut_get_thread_specific(__wut_thread_specific_id id); + +void *wut_get_thread_specific(__wut_thread_specific_id id) { + OSThread *thread; + asm volatile("lwz %0, -0x20(0)" + : "=r"(thread)); // OSGetCurrentThread() + if (thread != NULL) { + if (id == WUT_THREAD_SPECIFIC_0) { + return (void *) thread->reserved[3]; + } else if (id == WUT_THREAD_SPECIFIC_1) { + return (void *) thread->reserved[4]; + } else { + OSReport("[WUMSLOADER] wut_get_thread_specific: invalid id\n"); + OSFatal("[WUMSLOADER] wut_get_thread_specific: invalid id"); + } + } else { + OSReport("[WUMSLOADER] wut_get_thread_specific: invalid thread\n"); + OSFatal("[WUMSLOADER] wut_get_thread_specific: invalid thread"); + } + return NULL; +} \ No newline at end of file diff --git a/wumsloader/src/utils/RelocationUtils.cpp b/wumsloader/src/utils/RelocationUtils.cpp index d48a788..fa43a3f 100644 --- a/wumsloader/src/utils/RelocationUtils.cpp +++ b/wumsloader/src/utils/RelocationUtils.cpp @@ -117,7 +117,7 @@ bool doRelocation(const std::vector> &moduleList, // They will be released on exit (See: AromaBaseModule) usedRPls[rplName] = rplHandle; } else { - DEBUG_FUNCTION_LINE_VERBOSE("Use from usedRPLs cache! %s", rplName.c_str()); + //DEBUG_FUNCTION_LINE_VERBOSE("Use from usedRPLs cache! %s", rplName.c_str()); } rplHandle = usedRPls[rplName];