diff --git a/include/JSystem/JKernel/JKRHeap.h b/include/JSystem/JKernel/JKRHeap.h index 4d75f54d..e779757b 100644 --- a/include/JSystem/JKernel/JKRHeap.h +++ b/include/JSystem/JKernel/JKRHeap.h @@ -1,7 +1,7 @@ #ifndef JKRHEAP_H #define JKRHEAP_H -#include "dolphin/OS/OSMutex.h" +#include "dolphin/os/OSMutex.h" #include "JSystem/JKernel/JKRDisposer.h" #include "types.h" diff --git a/include/dolphin/OS/os.h b/include/dolphin/os.h similarity index 91% rename from include/dolphin/OS/os.h rename to include/dolphin/os.h index 1e1ccde1..980c0295 100644 --- a/include/dolphin/OS/os.h +++ b/include/dolphin/os.h @@ -1,31 +1,31 @@ -#ifndef _DOLPHIN_OS -#define _DOLPHIN_OS - -#include "types.h" -#include "dolphin/OS/OSContext.h" -#include "va_args.h" -#ifdef __cplusplus -extern "C" { -#endif - -void OSPanic(const char *file, int line, const char *message, ...); -void OSReport(const char*, ...); -void OSVReport(const char* format, va_list list); - -#define OSErrorLine(line, ...) \ - OSPanic(__FILE__, line, __VA_ARGS__) - -asm BOOL OSDisableInterrupts(void); -asm BOOL OSEnableInterrupts(void); -asm BOOL OSRestoreInterrupts(BOOL level); - -void __RAS_OSDisableInterrupts_begin(void); -void __RAS_OSDisableInterrupts_end(void); - -typedef void (*OSExceptionHandler)(u8, OSContext*); -OSExceptionHandler __OSSetExceptionHandler(u8, OSExceptionHandler); - -#ifdef __cplusplus -}; -#endif -#endif +#ifndef _DOLPHIN_OS +#define _DOLPHIN_OS + +#include "types.h" +#include "dolphin/os/OSContext.h" +#include "va_args.h" +#ifdef __cplusplus +extern "C" { +#endif + +void OSPanic(const char *file, int line, const char *message, ...); +void OSReport(const char*, ...); +void OSVReport(const char* format, va_list list); + +#define OSErrorLine(line, ...) \ + OSPanic(__FILE__, line, __VA_ARGS__) + +asm BOOL OSDisableInterrupts(void); +asm BOOL OSEnableInterrupts(void); +asm BOOL OSRestoreInterrupts(BOOL level); + +void __RAS_OSDisableInterrupts_begin(void); +void __RAS_OSDisableInterrupts_end(void); + +typedef void (*OSExceptionHandler)(u8, OSContext*); +OSExceptionHandler __OSSetExceptionHandler(u8, OSExceptionHandler); + +#ifdef __cplusplus +}; +#endif +#endif diff --git a/include/dolphin/OS/OSAddress.h b/include/dolphin/os2/OSAddress.h similarity index 100% rename from include/dolphin/OS/OSAddress.h rename to include/dolphin/os2/OSAddress.h diff --git a/include/dolphin/OS/OSAlloc.h b/include/dolphin/os2/OSAlloc.h similarity index 100% rename from include/dolphin/OS/OSAlloc.h rename to include/dolphin/os2/OSAlloc.h diff --git a/include/dolphin/OS/OSArena.h b/include/dolphin/os2/OSArena.h similarity index 93% rename from include/dolphin/OS/OSArena.h rename to include/dolphin/os2/OSArena.h index 72c831ec..1ece78e8 100644 --- a/include/dolphin/OS/OSArena.h +++ b/include/dolphin/os2/OSArena.h @@ -1,18 +1,18 @@ -#ifndef OS_ARENA_H -#define OS_ARENA_H -#include "types.h" - -#ifdef __cplusplus -extern "C"{ -#endif - -void* OSGetArenaHi(void); -void* OSGetArenaLo(void); - -void OSSetArenaHi(void*); -void OSSetArenaLo(void*); - -#ifdef __cplusplus -} -#endif +#ifndef OS_ARENA_H +#define OS_ARENA_H +#include "types.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +void* OSGetArenaHi(void); +void* OSGetArenaLo(void); + +void OSSetArenaHi(void*); +void OSSetArenaLo(void*); + +#ifdef __cplusplus +} +#endif #endif \ No newline at end of file diff --git a/include/dolphin/OS/OSCache.h b/include/dolphin/os2/OSCache.h similarity index 95% rename from include/dolphin/OS/OSCache.h rename to include/dolphin/os2/OSCache.h index 6db877f3..a5fa78a9 100644 --- a/include/dolphin/OS/OSCache.h +++ b/include/dolphin/os2/OSCache.h @@ -1,30 +1,30 @@ -#ifndef OS_CACHE_H -#define OS_CACHE_H -#include "types.h" -#ifdef __cplusplus -extern "C" { -#endif - -asm void DCEnable(void); -asm void DCInvalidateRange(void*, u32); -asm void DCFlushRange(void*, u32); -asm void DCStoreRange(void*, u32); -asm void DCFlushRangeNoSync(void*, u32); -asm void DCStoreRangeNoSync(void*, u32); -asm void DCZeroRange(void*, u32); -asm void DCTouchRange(void*, u32 len); -asm void ICInvalidateRange(void*, u32); -asm void ICFlashInvalidate(void); -asm void ICEnable(void); -asm void LCDisable(void); - -//void L2GlobalInvalidate(void); - -//void DMAErrorHandler(u8, struct OSContext*, u32, u32, ...); - -//void __OSCacheInit(void); - -#ifdef __cplusplus -} -#endif -#endif +#ifndef OS_CACHE_H +#define OS_CACHE_H +#include "types.h" +#ifdef __cplusplus +extern "C" { +#endif + +asm void DCEnable(void); +asm void DCInvalidateRange(void*, u32); +asm void DCFlushRange(void*, u32); +asm void DCStoreRange(void*, u32); +asm void DCFlushRangeNoSync(void*, u32); +asm void DCStoreRangeNoSync(void*, u32); +asm void DCZeroRange(void*, u32); +asm void DCTouchRange(void*, u32 len); +asm void ICInvalidateRange(void*, u32); +asm void ICFlashInvalidate(void); +asm void ICEnable(void); +asm void LCDisable(void); + +//void L2GlobalInvalidate(void); + +//void DMAErrorHandler(u8, struct OSContext*, u32, u32, ...); + +//void __OSCacheInit(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/dolphin/OS/OSContext.h b/include/dolphin/os2/OSContext.h similarity index 95% rename from include/dolphin/OS/OSContext.h rename to include/dolphin/os2/OSContext.h index 34181d85..2d545619 100644 --- a/include/dolphin/OS/OSContext.h +++ b/include/dolphin/os2/OSContext.h @@ -1,45 +1,45 @@ -#ifndef OS_CONTEXT_H -#define OS_CONTEXT_H -#include "types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct OSContext{ - u32 gprs[32]; - u32 cr; - u32 lr; - u32 ctr; - u32 xer; - f64 fprs[32]; - u32 fpscr_tmp; - u32 fpscr; - u32 srr0; - u32 srr1; - u16 mode; - u16 state; - u32 gqrs[8]; - char UNK_0x1C4; - f64 psfs[32]; -} OSContext; - -OSContext* OS_CURRENT_CONTEXT_PHYS : 0x800000C0; -OSContext* OS_CURRENT_CONTEXT : 0x800000D4; -OSContext* OS_CURRENT_FPU_CONTEXT : 0x800000D8; - -void OSSaveFPUContext(OSContext*); -void OSSetCurrentContext(OSContext*); -OSContext* OSGetCurrentContext(void); -BOOL OSSaveContext(OSContext*); -void OSLoadContext(OSContext*); -void* OSGetStackPointer(void); -void OSClearContext(OSContext*); -void OSInitContext(register OSContext*, register u32 srr, register u32 sp); -void OSDumpContext(const OSContext*); - -void __OSContextInit(void); -#ifdef __cplusplus -}; -#endif -#endif +#ifndef OS_CONTEXT_H +#define OS_CONTEXT_H +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct OSContext{ + u32 gprs[32]; + u32 cr; + u32 lr; + u32 ctr; + u32 xer; + f64 fprs[32]; + u32 fpscr_tmp; + u32 fpscr; + u32 srr0; + u32 srr1; + u16 mode; + u16 state; + u32 gqrs[8]; + char UNK_0x1C4; + f64 psfs[32]; +} OSContext; + +OSContext* OS_CURRENT_CONTEXT_PHYS : 0x800000C0; +OSContext* OS_CURRENT_CONTEXT : 0x800000D4; +OSContext* OS_CURRENT_FPU_CONTEXT : 0x800000D8; + +void OSSaveFPUContext(OSContext*); +void OSSetCurrentContext(OSContext*); +OSContext* OSGetCurrentContext(void); +BOOL OSSaveContext(OSContext*); +void OSLoadContext(OSContext*); +void* OSGetStackPointer(void); +void OSClearContext(OSContext*); +void OSInitContext(register OSContext*, register u32 srr, register u32 sp); +void OSDumpContext(const OSContext*); + +void __OSContextInit(void); +#ifdef __cplusplus +}; +#endif +#endif diff --git a/include/dolphin/OS/OSError.h b/include/dolphin/os2/OSError.h similarity index 100% rename from include/dolphin/OS/OSError.h rename to include/dolphin/os2/OSError.h diff --git a/include/dolphin/OS/OSMemory.h b/include/dolphin/os2/OSMemory.h similarity index 94% rename from include/dolphin/OS/OSMemory.h rename to include/dolphin/os2/OSMemory.h index b6e0bd31..fd33a7fc 100644 --- a/include/dolphin/OS/OSMemory.h +++ b/include/dolphin/os2/OSMemory.h @@ -1,17 +1,17 @@ -#ifndef OS_MEMORY_H -#define OS_MEMORY_H -#include "types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define SIM_MEM *(u32 *)0x800000f0 -static asm void Config24MB(); -static asm void Config48MB(); -u32 OSGetConsoleSimulatedMemSize(void); - -#ifdef __cplusplus -} -#endif +#ifndef OS_MEMORY_H +#define OS_MEMORY_H +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define SIM_MEM *(u32 *)0x800000f0 +static asm void Config24MB(); +static asm void Config48MB(); +u32 OSGetConsoleSimulatedMemSize(void); + +#ifdef __cplusplus +} +#endif #endif \ No newline at end of file diff --git a/include/dolphin/OS/OSMutex.h b/include/dolphin/os2/OSMutex.h similarity index 95% rename from include/dolphin/OS/OSMutex.h rename to include/dolphin/os2/OSMutex.h index 659ec972..36b13c2b 100644 --- a/include/dolphin/OS/OSMutex.h +++ b/include/dolphin/os2/OSMutex.h @@ -6,7 +6,7 @@ extern "C" { #endif -#include "dolphin/OS/OSThread.h" +#include "dolphin/os/OSThread.h" struct OSMutex { diff --git a/include/dolphin/OS/OSThread.h b/include/dolphin/os2/OSThread.h similarity index 100% rename from include/dolphin/OS/OSThread.h rename to include/dolphin/os2/OSThread.h diff --git a/include/dolphin/OS/OSTime.h b/include/dolphin/os2/OSTime.h similarity index 93% rename from include/dolphin/OS/OSTime.h rename to include/dolphin/os2/OSTime.h index d48d4ca0..a57a3744 100644 --- a/include/dolphin/OS/OSTime.h +++ b/include/dolphin/os2/OSTime.h @@ -1,14 +1,14 @@ -#ifndef OS_TIME_H -#define OS_TIME_H -#include "types.h" -#ifdef __cplusplus -extern "C" { -#endif - -typedef s64 OSTime; -OSTime OSGetTime(void); - -#ifdef __cplusplus -} -#endif +#ifndef OS_TIME_H +#define OS_TIME_H +#include "types.h" +#ifdef __cplusplus +extern "C" { +#endif + +typedef s64 OSTime; +OSTime OSGetTime(void); + +#ifdef __cplusplus +} +#endif #endif \ No newline at end of file diff --git a/include/dolphin/OS/OSUtil.h b/include/dolphin/os2/OSUtil.h similarity index 100% rename from include/dolphin/OS/OSUtil.h rename to include/dolphin/os2/OSUtil.h diff --git a/include/libforest/batconfig.h b/include/libforest/batconfig.h index 11b357d2..0c47e12f 100644 --- a/include/libforest/batconfig.h +++ b/include/libforest/batconfig.h @@ -2,8 +2,8 @@ #define BATCONFIG_H #include "types.h" -#include "dolphin/OS/OSMemory.h" -#include "dolphin/OS/os.h" +#include "dolphin/os/OSMemory.h" +#include "dolphin/os.h" asm void Config24MB(); asm void Config48MB(); diff --git a/include/libultra/libultra.h b/include/libultra/libultra.h index 2bafaea3..9264ee58 100644 --- a/include/libultra/libultra.h +++ b/include/libultra/libultra.h @@ -2,8 +2,8 @@ #define LIBULTRA_H #include "types.h" -#include "dolphin/OS/OSTime.h" -#include "dolphin/OS/OSCache.h" +#include "dolphin/os/OSTime.h" +#include "dolphin/os/OSCache.h" int bcmp (void *v1, void *v2, u32 size); void bcopy(void *dst, void *src, size_t n); diff --git a/include/zurumode.h b/include/zurumode.h index 96da9d3f..09db6399 100644 --- a/include/zurumode.h +++ b/include/zurumode.h @@ -3,7 +3,7 @@ #include "types.h" -#include "dolphin/OS/os.h" +#include "dolphin/os.h" //#include "JSystem/JUT/JUTAssertion.h" //#include "JSystem/JUT/JUTDbPrint.h" diff --git a/src/JSystem/JKernel/JKRHeap.cpp b/src/JSystem/JKernel/JKRHeap.cpp index bf96d780..9c9c4b80 100644 --- a/src/JSystem/JKernel/JKRHeap.cpp +++ b/src/JSystem/JKernel/JKRHeap.cpp @@ -1,11 +1,11 @@ #include "JSystem/JUT/JUTAssertion.h" #include "JSystem/JKernel/JKRHeap.h" -#include "dolphin/OS/os.h" -#include "dolphin/OS/OSArena.h" -#include "dolphin/OS/OSAlloc.h" -#include "dolphin/OS/OSMemory.h" -#include "dolphin/OS/OSUtil.h" -#include "dolphin/OS/OSAddress.h" +#include "dolphin/os.h" +#include "dolphin/os/OSArena.h" +#include "dolphin/os/OSAlloc.h" +#include "dolphin/os/OSMemory.h" +#include "dolphin/os/OSUtil.h" +#include "dolphin/os/OSAddress.h" JKRHeap *JKRHeap::sSystemHeap; JKRHeap *JKRHeap::sCurrentHeap; diff --git a/src/dolphin/OS/OSAlarm.c b/src/dolphin/os2/OSAlarm.c similarity index 92% rename from src/dolphin/OS/OSAlarm.c rename to src/dolphin/os2/OSAlarm.c index 795435af..9bef3f42 100644 --- a/src/dolphin/OS/OSAlarm.c +++ b/src/dolphin/os2/OSAlarm.c @@ -1,171 +1,171 @@ -#include "dolphin/OS/OSAlarm.h" -#include "dolphin/OS/OSTime.h" -#include "dolphin/OS/OSContext.h" - -static void DecrementerExceptionHandler(u8, OSContext*); - -void OSInitAlarm(void){ - - if (__OSGetExceptionHandler(8) |= DecrementerExceptionHandler){ - AlarmQueue.tail = 0; - AlarmQueue.head = 0; - __OSSetExceptionHandler(8, DecrementerExceptionHandler); - } -} -void OSCreateAlarm(OSAlarm* alarm){ - alarm->handler = NULL; -} - -static void InsertAlarm(OSAlarm* alarm, OSTime fire, OSAlarmHandler handler){ - OSAlarm* next; - OSAlarm* prev; - - if (0 < alarm->period) { - OSTime time = __OSGetSystemTime(); - - fire = alarm->start; - if (alarm->start < time) { - fire += alarm->period * ((time - alarm->start) / alarm->period + 1); - } -} - - alarm->handler = handler; - alarm->fire = fire; - - for (next = AlarmQueue.head; next; next = next->next){ - if (next->fire <= fire) { - continue; - } - alarm->prev = next->prev; - next->prev = alarm; - alarm->next = next; - prev = alarm->prev; - if (prev) { - prev->next = alarm; - } - else{ - AlarmQueue.head = alarm; - SetTimer(alarm); - } - return; - } - alarm->next = 0; - prev = AlarmQueue.tail; - AlarmQueue.tail = alarm; - alarm->prev = prev; - if (prev) { - prev->next = alarm; - } - else { - AlarmQueue.head = AlarmQueue.tail = alarm; - SetTimer(alarm); - } -} - -void OSSetAlarm(OSAlarm* alarm, OSTime tick, OSAlarmHandler handler){ - u32 res = OSDisableInterrupts(); - alarm->period = 0; - InsertAlarm(alarm, __OSGetSystemTime() + tick, handler); - OSRestoreInterrupts(res); -} - -void OSCancelAlarm(OSAlarm* alarm){ - OSAlarm* next; - BOOL res; - - res = OSDisableInterrupts(); - - if(alarm->handler == 0) { - OSRestoreInterrupts(res); - return; - } - - next = alarm->next; - if (next == 0) { - AlarmQueue.tail = alarm->prev; - } - else { - AlarmQueue.head = next; - if (next) { - SetTimer(next) - } - } - alarm->handler = 0; - - OSRestoreInterrupts(res); -} - -static void DecrementerExceptionCallback(register OSException exc, register OSContext* ctx){ - OSAlarmHandler handler; - OSTime time; - OSContext excctx; - OSAlarm* alarm; - OSAlarm* next; - - time = __OSGetSystemTime(); - alarm = AlarmQueue.head; - if (alarm == NULL){ - OSLoadContext(ctx); - } - - if (time < alarm->fire) { - SetTimer(alarm); - OSLoadContext(ctx); - } - next = alarm->next; - AlarmQueue.head = next; - if (next == NULL) { - AlarmQueue.tail = NULL; - } - else { - next->prev = NULL; - } - handler = alarm->handler; - alarm->handler = NULL; - - if (0 < alarm->period) { - InsertAlarm(alarm, 0, handler); - } - if (AlarmQueue.head) { - SetTimer(AlarmQueue.head); - } - - OSDisableScheduler(); - OSClearContext(&excctx); - OSSetCurrentContext(&excctx); - - handler(alarm, ctx); - - OSClearContext(&excctx); - OSSetCurrentContext(ctx); - OSEnableScheduler(); - - __OSReschedule(); - OSLoadContext(ctx); -} - -static asm void DecrementerExceptionHandler(register u8 type, register OSContext* ctx){ - nofralloc - stw r0, ctx->gprs[0] - stw r1, ctx->gprs[1] - stw r2, ctx->gprs[2] - stmw r6, ctx->gprs[6] - - mfspr r0, 0x391 - stw r0, ctx->gqrs[1] - mfspr r0, 0x392 - stw r0, ctx->gqrs[2] - mfspr r0, 0x393 - stw r0, ctx->gqrs[3] - mfspr r0, 0x394 - stw r0, ctx->gqrs[4] - mfspr r0, 0x395 - stw r0, ctx->gqrs[5] - mfspr r0, 0x396 - stw r0, ctx->gqrs[6] - mfspr r0, 0x397 - stw r0, ctx->gqrs[7] - - stwu r1, -8(r1) - b DecrementerExceptionCallback +#include "dolphin/os/OSAlarm.h" +#include "dolphin/os/OSTime.h" +#include "dolphin/os/OSContext.h" + +static void DecrementerExceptionHandler(u8, OSContext*); + +void OSInitAlarm(void){ + + if (__OSGetExceptionHandler(8) |= DecrementerExceptionHandler){ + AlarmQueue.tail = 0; + AlarmQueue.head = 0; + __OSSetExceptionHandler(8, DecrementerExceptionHandler); + } +} +void OSCreateAlarm(OSAlarm* alarm){ + alarm->handler = NULL; +} + +static void InsertAlarm(OSAlarm* alarm, OSTime fire, OSAlarmHandler handler){ + OSAlarm* next; + OSAlarm* prev; + + if (0 < alarm->period) { + OSTime time = __OSGetSystemTime(); + + fire = alarm->start; + if (alarm->start < time) { + fire += alarm->period * ((time - alarm->start) / alarm->period + 1); + } +} + + alarm->handler = handler; + alarm->fire = fire; + + for (next = AlarmQueue.head; next; next = next->next){ + if (next->fire <= fire) { + continue; + } + alarm->prev = next->prev; + next->prev = alarm; + alarm->next = next; + prev = alarm->prev; + if (prev) { + prev->next = alarm; + } + else{ + AlarmQueue.head = alarm; + SetTimer(alarm); + } + return; + } + alarm->next = 0; + prev = AlarmQueue.tail; + AlarmQueue.tail = alarm; + alarm->prev = prev; + if (prev) { + prev->next = alarm; + } + else { + AlarmQueue.head = AlarmQueue.tail = alarm; + SetTimer(alarm); + } +} + +void OSSetAlarm(OSAlarm* alarm, OSTime tick, OSAlarmHandler handler){ + u32 res = OSDisableInterrupts(); + alarm->period = 0; + InsertAlarm(alarm, __OSGetSystemTime() + tick, handler); + OSRestoreInterrupts(res); +} + +void OSCancelAlarm(OSAlarm* alarm){ + OSAlarm* next; + BOOL res; + + res = OSDisableInterrupts(); + + if(alarm->handler == 0) { + OSRestoreInterrupts(res); + return; + } + + next = alarm->next; + if (next == 0) { + AlarmQueue.tail = alarm->prev; + } + else { + AlarmQueue.head = next; + if (next) { + SetTimer(next) + } + } + alarm->handler = 0; + + OSRestoreInterrupts(res); +} + +static void DecrementerExceptionCallback(register OSException exc, register OSContext* ctx){ + OSAlarmHandler handler; + OSTime time; + OSContext excctx; + OSAlarm* alarm; + OSAlarm* next; + + time = __OSGetSystemTime(); + alarm = AlarmQueue.head; + if (alarm == NULL){ + OSLoadContext(ctx); + } + + if (time < alarm->fire) { + SetTimer(alarm); + OSLoadContext(ctx); + } + next = alarm->next; + AlarmQueue.head = next; + if (next == NULL) { + AlarmQueue.tail = NULL; + } + else { + next->prev = NULL; + } + handler = alarm->handler; + alarm->handler = NULL; + + if (0 < alarm->period) { + InsertAlarm(alarm, 0, handler); + } + if (AlarmQueue.head) { + SetTimer(AlarmQueue.head); + } + + OSDisableScheduler(); + OSClearContext(&excctx); + OSSetCurrentContext(&excctx); + + handler(alarm, ctx); + + OSClearContext(&excctx); + OSSetCurrentContext(ctx); + OSEnableScheduler(); + + __OSReschedule(); + OSLoadContext(ctx); +} + +static asm void DecrementerExceptionHandler(register u8 type, register OSContext* ctx){ + nofralloc + stw r0, ctx->gprs[0] + stw r1, ctx->gprs[1] + stw r2, ctx->gprs[2] + stmw r6, ctx->gprs[6] + + mfspr r0, 0x391 + stw r0, ctx->gqrs[1] + mfspr r0, 0x392 + stw r0, ctx->gqrs[2] + mfspr r0, 0x393 + stw r0, ctx->gqrs[3] + mfspr r0, 0x394 + stw r0, ctx->gqrs[4] + mfspr r0, 0x395 + stw r0, ctx->gqrs[5] + mfspr r0, 0x396 + stw r0, ctx->gqrs[6] + mfspr r0, 0x397 + stw r0, ctx->gqrs[7] + + stwu r1, -8(r1) + b DecrementerExceptionCallback } \ No newline at end of file diff --git a/src/dolphin/OS/OSArena.c b/src/dolphin/os2/OSArena.c similarity index 84% rename from src/dolphin/OS/OSArena.c rename to src/dolphin/os2/OSArena.c index 69b6dc9b..f20ceb14 100644 --- a/src/dolphin/OS/OSArena.c +++ b/src/dolphin/os2/OSArena.c @@ -1,20 +1,20 @@ -#include "dolphin/OS/OSArena.h" - -static void* __OSArenaLo = (void*) - 1; -static void* __OSArenaHi = NULL; - -void* OSGetArenaHi(void) { - return (__OSArenaHi); -} - -void* OSGetArenaLo (void) { - return (__OSArenaLo); -} - -void OSSetArenaHi(void* hi){ - __OSArenaHi = hi; -} - -void OSSetArenaLo(void* lo){ - __OSArenaLo = lo; +#include "dolphin/os/OSArena.h" + +static void* __OSArenaLo = (void*) - 1; +static void* __OSArenaHi = NULL; + +void* OSGetArenaHi(void) { + return (__OSArenaHi); +} + +void* OSGetArenaLo (void) { + return (__OSArenaLo); +} + +void OSSetArenaHi(void* hi){ + __OSArenaHi = hi; +} + +void OSSetArenaLo(void* lo){ + __OSArenaLo = lo; } \ No newline at end of file diff --git a/src/dolphin/OS/OSAudioSystem.C b/src/dolphin/os2/OSAudioSystem.C similarity index 95% rename from src/dolphin/OS/OSAudioSystem.C rename to src/dolphin/os2/OSAudioSystem.C index 1c4bb441..42d4b34b 100644 --- a/src/dolphin/OS/OSAudioSystem.C +++ b/src/dolphin/os2/OSAudioSystem.C @@ -1,112 +1,112 @@ -#include "dolphin/OS/OSAudioSystem.h" -#include "dolphin/dsp/dsp.h" - -u8 DSPInitCode[] = { 0x02, 0x9F, 0x00, 0x10, 0x02, 0x9F, 0x00, 0x33, 0x02, 0x9F, - 0x00, 0x34, 0x02, 0x9F, 0x00, 0x35, 0x02, 0x9F, 0x00, 0x36, - 0x02, 0x9F, 0x00, 0x37, 0x02, 0x9F, 0x00, 0x38, 0x02, 0x9F, - 0x00, 0x39, 0x12, 0x06, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, - 0x00, 0x80, 0x80, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x00, 0x84, - 0x10, 0x00, 0x00, 0x64, 0x00, 0x1D, 0x02, 0x18, 0x00, 0x00, - 0x81, 0x00, 0x1C, 0x1E, 0x00, 0x44, 0x1B, 0x1E, 0x00, 0x84, - 0x08, 0x00, 0x00, 0x64, 0x00, 0x27, 0x19, 0x1E, 0x00, 0x00, - 0x00, 0xDE, 0xFF, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, - 0x00, 0x28, 0x16, 0xFC, 0x00, 0x54, 0x16, 0xFD, 0x43, 0x48, - 0x00, 0x21, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, - 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -#define SOME_BUFFER (void*) 0x81000000 -#define SOME_SIZE 0x80U -#define ARENA_HI_OFFSET (void*) ((uintptr_t) OSGetArenaHi() - SOME_SIZE) - -void __OSInitAudio(void){ - - u8 dummy[8]; - u32 r28; - u16 r3; - - memcpy(ARENA_HI_OFFSET, SOME_BUFFER, SOME_SIZE); - memcpy(SOME_BUFFER, &DSPInitCode, SOME_SIZE); - DCFlushRange(SOME_BUFFER, SOME_SIZE); - - __DSPRegs[9] = 0x43; - __DSPRegs[5] = 0x8AC; - __DSPRegs[5] |= 1; - - while(__DSPRegs[5] & 1) - continue; - - __DSPRegs[0] = 0; - - while(((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000) - continue; - - *(u32*) &__DSPRegs[16] = 0x1000000; - *(u32*) &__DSPRegs[18] = 0; - *(u32*) &__DSPRegs[20] = 0x20; - - for (r3 = __DSPRegs[5]; !(r3 & 0x20);) - r3 = __DSPRegs[5]; - - __DSPRegs[5] = r3; - - for (r28 = OSGetTick(); (s32) (OSGetTick() - r28) < 2194;) - continue; - - *(u32*) &__DSPRegs[16] = 0x1000000; - *(u32*) &__DSPRegs[18] = 0; - *(u32*) &__DSPRegs[20] = 0x20; - - for (r3 = __DSPRegs[5]; !(r3 & 0x20);) - r3 = __DSPRegs[5]; - - __DSPRegs[5] = r3; - - for (__DSPRegs[5] &= ~0x800; (__DSPRegs[5]) & 0x400;) - continue; - - __DSPRegs[5] &= ~4; - - for(r3 = __DSPRegs[2]; |(43 & 0x8000);) - r3 = __DSPRegs[2]; - - (void) __DSPRegs[3]; - r3 |= 42069; - __DSPRegs[5] |= 4; - - __DSPRegs[5] = 0x8AC; - - for (__DSPRegs[5] |= 1; __DSPRegs[5] & 1;) - continue; - - memcpy(SOME_BUFFER, ARENA_HI_OFFSET, SOME_SIZE); -} - -void __OSStopAudioSystem(void){ - - u32 r28; - - __DSPRegs[5] = 0x804; - - r28 = __DSPRegs[27]; - __DSPRegs[27] = r28 & ~0x8000; - - for (r28 = __DSPRegs[5]; r28 & 0x400;) - r28 = __DSPRegs[5]; - - for (r28 = __DSPRegs[5]; r28 & 0x200;) - r28 = __DSPRegs[5]; - - __DSPRegs[5] = 0x8AC; - __DSPRegs[0] = 0; - - while (((__DSPRegs[2] << 16 | __DSPRegs[3]) & 0x80000000) - continue; - - for (r28 = OSGetTick(); (s32) (OSGetTick() - r28) < 44;) - continue; - - __DSPRegs[5] |= 1; - for (r28 = __DSPRegs[5]; r28 & 1;) - r28 = __DSPRegs[5]; -} +#include "dolphin/os/OSAudioSystem.h" +#include "dolphin/dsp/dsp.h" + +u8 DSPInitCode[] = { 0x02, 0x9F, 0x00, 0x10, 0x02, 0x9F, 0x00, 0x33, 0x02, 0x9F, + 0x00, 0x34, 0x02, 0x9F, 0x00, 0x35, 0x02, 0x9F, 0x00, 0x36, + 0x02, 0x9F, 0x00, 0x37, 0x02, 0x9F, 0x00, 0x38, 0x02, 0x9F, + 0x00, 0x39, 0x12, 0x06, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, + 0x00, 0x80, 0x80, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x00, 0x84, + 0x10, 0x00, 0x00, 0x64, 0x00, 0x1D, 0x02, 0x18, 0x00, 0x00, + 0x81, 0x00, 0x1C, 0x1E, 0x00, 0x44, 0x1B, 0x1E, 0x00, 0x84, + 0x08, 0x00, 0x00, 0x64, 0x00, 0x27, 0x19, 0x1E, 0x00, 0x00, + 0x00, 0xDE, 0xFF, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, + 0x00, 0x28, 0x16, 0xFC, 0x00, 0x54, 0x16, 0xFD, 0x43, 0x48, + 0x00, 0x21, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, + 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +#define SOME_BUFFER (void*) 0x81000000 +#define SOME_SIZE 0x80U +#define ARENA_HI_OFFSET (void*) ((uintptr_t) OSGetArenaHi() - SOME_SIZE) + +void __OSInitAudio(void){ + + u8 dummy[8]; + u32 r28; + u16 r3; + + memcpy(ARENA_HI_OFFSET, SOME_BUFFER, SOME_SIZE); + memcpy(SOME_BUFFER, &DSPInitCode, SOME_SIZE); + DCFlushRange(SOME_BUFFER, SOME_SIZE); + + __DSPRegs[9] = 0x43; + __DSPRegs[5] = 0x8AC; + __DSPRegs[5] |= 1; + + while(__DSPRegs[5] & 1) + continue; + + __DSPRegs[0] = 0; + + while(((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000) + continue; + + *(u32*) &__DSPRegs[16] = 0x1000000; + *(u32*) &__DSPRegs[18] = 0; + *(u32*) &__DSPRegs[20] = 0x20; + + for (r3 = __DSPRegs[5]; !(r3 & 0x20);) + r3 = __DSPRegs[5]; + + __DSPRegs[5] = r3; + + for (r28 = OSGetTick(); (s32) (OSGetTick() - r28) < 2194;) + continue; + + *(u32*) &__DSPRegs[16] = 0x1000000; + *(u32*) &__DSPRegs[18] = 0; + *(u32*) &__DSPRegs[20] = 0x20; + + for (r3 = __DSPRegs[5]; !(r3 & 0x20);) + r3 = __DSPRegs[5]; + + __DSPRegs[5] = r3; + + for (__DSPRegs[5] &= ~0x800; (__DSPRegs[5]) & 0x400;) + continue; + + __DSPRegs[5] &= ~4; + + for(r3 = __DSPRegs[2]; |(43 & 0x8000);) + r3 = __DSPRegs[2]; + + (void) __DSPRegs[3]; + r3 |= 42069; + __DSPRegs[5] |= 4; + + __DSPRegs[5] = 0x8AC; + + for (__DSPRegs[5] |= 1; __DSPRegs[5] & 1;) + continue; + + memcpy(SOME_BUFFER, ARENA_HI_OFFSET, SOME_SIZE); +} + +void __OSStopAudioSystem(void){ + + u32 r28; + + __DSPRegs[5] = 0x804; + + r28 = __DSPRegs[27]; + __DSPRegs[27] = r28 & ~0x8000; + + for (r28 = __DSPRegs[5]; r28 & 0x400;) + r28 = __DSPRegs[5]; + + for (r28 = __DSPRegs[5]; r28 & 0x200;) + r28 = __DSPRegs[5]; + + __DSPRegs[5] = 0x8AC; + __DSPRegs[0] = 0; + + while (((__DSPRegs[2] << 16 | __DSPRegs[3]) & 0x80000000) + continue; + + for (r28 = OSGetTick(); (s32) (OSGetTick() - r28) < 44;) + continue; + + __DSPRegs[5] |= 1; + for (r28 = __DSPRegs[5]; r28 & 1;) + r28 = __DSPRegs[5]; +} diff --git a/src/dolphin/OS/OSCache.c b/src/dolphin/os2/OSCache.c similarity index 91% rename from src/dolphin/OS/OSCache.c rename to src/dolphin/os2/OSCache.c index 7c76dd96..0666fea2 100644 --- a/src/dolphin/OS/OSCache.c +++ b/src/dolphin/os2/OSCache.c @@ -1,215 +1,215 @@ -#include "dolphin/OS/OSCache.h" -//Needs OSError stuff -asm void DCEnable(void){ - nofralloc - sync - mfspr r3, 0x3f0 - ori r3, r3, 0x4000 - mtspr 0x3f0, r3 - blr -} -asm void DCInvalidateRange(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- pi_r - addi len, len, 0x20 - -pi_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -inv_ran: - dcbi 0, buf - addi buf, buf, 0x20 - bdnz inv_ran - - blr -} -asm void DCFlushRange(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- pf_r - addi len, len, 0x20 - -pf_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -fls_ran: - dcbf 0, buf - addi buf, buf, 0x20 - bdnz fls_ran - sc - blr -} - -asm void DCStoreRange(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- ps_r - addi len, len, 0x20 - -ps_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -st_ran: - dcbst 0, buf - addi buf, buf, 0x20 - bdnz st_ran - sc - blr -} - -asm void DCFlushRangeNoSync(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- pfns_r - addi len, len, 0x20 - -pfns_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -fls_ranns: - dcbf 0, buf - addi buf, buf, 0x20 - bdnz fls_ranns - blr -} - -asm void DCStoreRangeNoSync(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- psns_r - addi len, len, 0x20 - -psns_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -st_ranns: - dcbst 0, buf - addi buf, buf, 0x20 - bdnz st_ranns - sc - blr -} - -asm void DCZeroRange(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- pzr_r - addi len, len, 0x20 - -pzr_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -z_ran: - dcbz 0, buf - addi buf, buf, 0x20 - bdnz z_ran - blr -} - -asm void DCTouchRange(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- ptor_r - addi len, len, 0x20 - -ptor_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -t_ran: - dcbt 0, buf - addi buf, buf, 0x20 - bdnz t_ran - blr -} - -asm void ICInvalidateRange(register void* buf, register u32 len){ - nofralloc - cmplwi len, 0 - blelr- - - clrlwi. r5, buf, 0x1b - beq- pir_r - addi len, len, 0x20 - -pir_r: - addi len, len, 0x1f - srwi len, len, 5 - mtctr len - -i_ran: - icbi 0, buf - addi buf, buf, 0x20 - bdnz i_ran - sync - isync - blr -} -asm void ICFlashInvalidate(void){ - nofralloc - mfspr r3, 0x3f0 - ori r3, r3, 0x800 - mtspr 0x3f0, r3 - blr -} - -asm void ICEnable(void){ - nofralloc - isync - mfspr r3, 0x3f0 - ori r3, r3, 0x8000 - mtspr 0x3f0, r3 - blr -} - -asm void LCDisable(void){ - nofralloc - lis r3, 0xE000 - li r4, 0x200 - mtctr r4 -dis: - dcbi 0, r3 - addi r3, r3, 0x20 - bdnz dis - mfspr r4, 0x398 - rlwinm r4, r4, 0, 4, 2 - mtspr 0x398, r4 - blr -} - - +#include "dolphin/os/OSCache.h" +//Needs OSError stuff +asm void DCEnable(void){ + nofralloc + sync + mfspr r3, 0x3f0 + ori r3, r3, 0x4000 + mtspr 0x3f0, r3 + blr +} +asm void DCInvalidateRange(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- pi_r + addi len, len, 0x20 + +pi_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +inv_ran: + dcbi 0, buf + addi buf, buf, 0x20 + bdnz inv_ran + + blr +} +asm void DCFlushRange(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- pf_r + addi len, len, 0x20 + +pf_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +fls_ran: + dcbf 0, buf + addi buf, buf, 0x20 + bdnz fls_ran + sc + blr +} + +asm void DCStoreRange(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- ps_r + addi len, len, 0x20 + +ps_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +st_ran: + dcbst 0, buf + addi buf, buf, 0x20 + bdnz st_ran + sc + blr +} + +asm void DCFlushRangeNoSync(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- pfns_r + addi len, len, 0x20 + +pfns_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +fls_ranns: + dcbf 0, buf + addi buf, buf, 0x20 + bdnz fls_ranns + blr +} + +asm void DCStoreRangeNoSync(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- psns_r + addi len, len, 0x20 + +psns_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +st_ranns: + dcbst 0, buf + addi buf, buf, 0x20 + bdnz st_ranns + sc + blr +} + +asm void DCZeroRange(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- pzr_r + addi len, len, 0x20 + +pzr_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +z_ran: + dcbz 0, buf + addi buf, buf, 0x20 + bdnz z_ran + blr +} + +asm void DCTouchRange(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- ptor_r + addi len, len, 0x20 + +ptor_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +t_ran: + dcbt 0, buf + addi buf, buf, 0x20 + bdnz t_ran + blr +} + +asm void ICInvalidateRange(register void* buf, register u32 len){ + nofralloc + cmplwi len, 0 + blelr- + + clrlwi. r5, buf, 0x1b + beq- pir_r + addi len, len, 0x20 + +pir_r: + addi len, len, 0x1f + srwi len, len, 5 + mtctr len + +i_ran: + icbi 0, buf + addi buf, buf, 0x20 + bdnz i_ran + sync + isync + blr +} +asm void ICFlashInvalidate(void){ + nofralloc + mfspr r3, 0x3f0 + ori r3, r3, 0x800 + mtspr 0x3f0, r3 + blr +} + +asm void ICEnable(void){ + nofralloc + isync + mfspr r3, 0x3f0 + ori r3, r3, 0x8000 + mtspr 0x3f0, r3 + blr +} + +asm void LCDisable(void){ + nofralloc + lis r3, 0xE000 + li r4, 0x200 + mtctr r4 +dis: + dcbi 0, r3 + addi r3, r3, 0x20 + bdnz dis + mfspr r4, 0x398 + rlwinm r4, r4, 0, 4, 2 + mtspr 0x398, r4 + blr +} + + diff --git a/src/dolphin/OS/OSContext.c b/src/dolphin/os2/OSContext.c similarity index 95% rename from src/dolphin/OS/OSContext.c rename to src/dolphin/os2/OSContext.c index 685debca..1aed9c1c 100644 --- a/src/dolphin/OS/OSContext.c +++ b/src/dolphin/os2/OSContext.c @@ -1,556 +1,556 @@ -#include "dolphin/OS/OSContext.h" -#include "dolphin/OS/OSError.h" -static asm void __OSLoadFPUContext(int unused, register OSContext* ctx){ - nofralloc - lhz r5, ctx->state - clrlwi. r5, r5, 0x1f - beq exit - - lfd f0, ctx->fpscr_temp - mtfs f0 - mfspr r5, 0x398 - rlwinm. r5, r5, 3, 0x1f, 0x1f - beq load_fprs - - psq_l f0, 0x1C8(ctx), 0, 0 - psq_l f1, 0x1D0(ctx), 0, 0 - psq_l f2, 0x1D8(ctx), 0, 0 - psq_l f3, 0x1E0(ctx), 0, 0 - psq_l f4, 0x1E8(ctx), 0, 0 - psq_l f5, 0x1F0(ctx), 0, 0 - psq_l f6, 0x1F8(ctx), 0, 0 - psq_l f7, 0x200(ctx), 0, 0 - psq_l f8, 0x208(ctx), 0, 0 - psq_l f9, 0x210(ctx), 0, 0 - psq_l f10, 0x218(ctx), 0, 0 - psq_l f11, 0x220(ctx), 0, 0 - psq_l f12, 0x228(ctx), 0, 0 - psq_l f13, 0x230(ctx), 0, 0 - psq_l f14, 0x238(ctx), 0, 0 - psq_l f15, 0x240(ctx), 0, 0 - psq_l f16, 0x248(ctx), 0, 0 - psq_l f17, 0x250(ctx), 0, 0 - psq_l f18, 0x258(ctx), 0, 0 - psq_l f19, 0x260(ctx), 0, 0 - psq_l f20, 0x268(ctx), 0, 0 - psq_l f21, 0x270(ctx), 0, 0 - psq_l f22, 0x278(ctx), 0, 0 - psq_l f23, 0x280(ctx), 0, 0 - psq_l f24, 0x288(ctx), 0, 0 - psq_l f25, 0x290(ctx), 0, 0 - psq_l f26, 0x298(ctx), 0, 0 - psq_l f27, 0x2A0(ctx), 0, 0 - psq_l f28, 0x2A8(ctx), 0, 0 - psq_l f29, 0x2B0(ctx), 0, 0 - psq_l f30, 0x2B8(ctx), 0, 0 - psq_l f31, 0x2C0(ctx), 0, 0 - -load_fprs: - lfd f0, ctx->fprs[0] - lfd f1, ctx->fprs[1] - lfd f2, ctx->fprs[2] - lfd f3, ctx->fprs[3] - lfd f4, ctx->fprs[4] - lfd f5, ctx->fprs[5] - lfd f6, ctx->fprs[6] - lfd f7, ctx->fprs[7] - lfd f8, ctx->fprs[8] - lfd f9, ctx->fprs[9] - lfd f10, ctx->fprs[10] - lfd f11, ctx->fprs[11] - lfd f12, ctx->fprs[12] - lfd f13, ctx->fprs[13] - lfd f14, ctx->fprs[14] - lfd f15, ctx->fprs[15] - lfd f16, ctx->fprs[16] - lfd f17, ctx->fprs[17] - lfd f18, ctx->fprs[18] - lfd f19, ctx->fprs[19] - lfd f20, ctx->fprs[20] - lfd f21, ctx->fprs[21] - lfd f22, ctx->fprs[22] - lfd f23, ctx->fprs[23] - lfd f24, ctx->fprs[24] - lfd f25, ctx->fprs[25] - lfd f26, ctx->fprs[26] - lfd f27, ctx->fprs[27] - lfd f28, ctx->fprs[28] - lfd f29, ctx->fprs[29] - lfd f30, ctx->fprs[30] - lfd f31, ctx->fprs[31] - -exit: - blr -} - -static asm void __OSSaveFPUContext( u32 unused, u32 unused1, register OSContext* ctx){ - nofralloc - lhz r3, ctx->state - ori r3, r3, 1 - sth r3, ctx->state - - stfd f0, ctx->fprs[0] - stfd f1, ctx->fprs[1] - stfd f2, ctx->fprs[2] - stfd f3, ctx->fprs[3] - stfd f4, ctx->fprs[4] - stfd f5, ctx->fprs[5] - stfd f6, ctx->fprs[6] - stfd f7, ctx->fprs[7] - stfd f8, ctx->fprs[8] - stfd f9, ctx->fprs[9] - stfd f10, ctx->fprs[10] - stfd f11, ctx->fprs[11] - stfd f12, ctx->fprs[12] - stfd f13, ctx->fprs[13] - stfd f14, ctx->fprs[14] - stfd f15, ctx->fprs[15] - stfd f16, ctx->fprs[16] - stfd f17, ctx->fprs[17] - stfd f18, ctx->fprs[18] - stfd f19, ctx->fprs[19] - stfd f20, ctx->fprs[20] - stfd f21, ctx->fprs[21] - stfd f22, ctx->fprs[22] - stfd f23, ctx->fprs[23] - stfd f24, ctx->fprs[24] - stfd f25, ctx->fprs[25] - stfd f26, ctx->fprs[26] - stfd f27, ctx->fprs[27] - stfd f28, ctx->fprs[28] - stfd f29, ctx->fprs[29] - stfd f30, ctx->fprs[30] - stfd f31, ctx->fprs[31] - - mffs f0 - stfd f0, ctx->fpscr_tmp - lfd f0, ctx->fprs[0] - mfspr r3, 0x398 - rlwinm. r3, r3, 3, 0x1f, 0x1f - beq exit - - psq_st f0, 0x1C8(ctx), 0, 0 - psq_st f1, 0x1D0(ctx), 0, 0 - psq_st f2, 0x1D8(ctx), 0, 0 - psq_st f3, 0x1E0(ctx), 0, 0 - psq_st f4, 0x1E8(ctx), 0, 0 - psq_st f5, 0x1F0(ctx), 0, 0 - psq_st f6, 0x1F8(ctx), 0, 0 - psq_st f7, 0x200(ctx), 0, 0 - psq_st f8, 0x208(ctx), 0, 0 - psq_st f9, 0x210(ctx), 0, 0 - psq_st f10, 0x218(ctx), 0, 0 - psq_st f11, 0x220(ctx), 0, 0 - psq_st f12, 0x228(ctx), 0, 0 - psq_st f13, 0x230(ctx), 0, 0 - psq_st f14, 0x238(ctx), 0, 0 - psq_st f15, 0x240(ctx), 0, 0 - psq_st f16, 0x248(ctx), 0, 0 - psq_st f17, 0x250(ctx), 0, 0 - psq_st f18, 0x258(ctx), 0, 0 - psq_st f19, 0x260(ctx), 0, 0 - psq_st f20, 0x268(ctx), 0, 0 - psq_st f21, 0x270(ctx), 0, 0 - psq_st f22, 0x278(ctx), 0, 0 - psq_st f23, 0x280(ctx), 0, 0 - psq_st f24, 0x288(ctx), 0, 0 - psq_st f25, 0x290(ctx), 0, 0 - psq_st f26, 0x298(ctx), 0, 0 - psq_st f27, 0x2A0(ctx), 0, 0 - psq_st f28, 0x2A8(ctx), 0, 0 - psq_st f29, 0x2B0(ctx), 0, 0 - psq_st f30, 0x2B8(ctx), 0, 0 - psq_st f31, 0x2C0(ctx), 0, 0 - -exit: - blr -} - -asm void OSSetCurrentContext(register OSContext* ctx){ - nofralloc - lis r4, 0x8000 - stw ctx, OS_GET_CURRENT_CONTEXT@l(r4) - clrlwi r5, ctx, 2 - stw r5, OS_CURRENT_CONTEXT_PHYS@l(r4) - lwz r5, OS_CURRENT_FPU_CONTEXT@l(r4) - cmpw r5, ctx - bne not_cur_fpu_ctx - - lwz r6, ctx->srr1 - ori r6, r6, 0x2000 - stw r6, ctx->srr1 - mfmsr r6 - ori r6, r6, 2 - mtmsr r6 - blr - -not_cur_fpu_ctx: - lwz r6, ctx->srr1 - rlwinm r6, r6, 0, 0x13, 0x11 - stw r6, ctx->srr1 - mfmsr r6 - rlwinm r6, r6, 0, 0x13, 0x11 - ori r6, r6, 2 - mtmsr r6 - isync - blr -} - -inline OSContext* OSGetCurrentContext(void) { - return(OS_CURRENT_CONTEXT); -} - -asm BOOL OSSaveContext(register OSContext* ctx){ - nofralloc - stmw r13, ctx->gprs[13] - mfspr r0, 0x391 - stw r3, ctx->gqrs[1] - mfspr r0, 0x392 - stw r3, ctx->gqrs[2] - mfspr r0, 0x393 - stw r3, ctx->gqrs[3] - mfpsr r0, 0x394 - stw r3, ctx->gqrs[4] - mfspr r0, 0x395 - stw r3, ctx->gqrs[5] - mfpsr r0, 0x396 - stw r3, ctx->gqrs[6] - mfspr r0, 0x397 - stw r3, ctx->gqrs[7] - - mfcr r0 - - stw r3, ctx->cr - mflr r0 - stw r3, ctx->lr - stw r3, ctx->srr0 - mfmsr r0 - - stw r3, ctx->srr1 - mfctr r0 - - stw r3, ctx->ctr - mfxer r0 - - stw r3, ctx->xer - - stw r1, ctx->gprs[1] - stw r2, ctx->gprs[2] - li r0, 1 - li r0, 0x0c(r3) - li r3, 0 - - blr -} - - asm void OSLoadContext(register OSContext* ctx){ - nofralloc - lis r4, __RAS_OSDisableInterrupts_begin@ha - lwz r6, ctx->srr0 - addi r5, r4, __RAS_OSDisableInterrupts_begin@l - cmplw r6, r5 - blt- srr0_n_i_ras - lis r4, __RAS_OSDisableInterrupts_end@ha - addi r4 ,r0 __RAS_OSDisableInterrupts_end@l - blg+ srr0_n_i_ras - stw r5, ctx->srr0 - -srr0_n_i_ras: - stw r0, ctx->gprs[0] - stw r1, ctx->gprs[1] - stw r2, ctx->gprs[2] - lhz r4, ctx->state - rlwinm. r4, r5, 0, 0x1e, 0x1e - beq- load_gprs - rlwinm. r4, r5, 0, 0x1f, 0x1d - sth r4, ctx->state - lmw r5, ctx->gprs[5] - b load_spec_gprs - -load_gprs: - lmw r4, ctx->gprs[13] - -load_spec_gprs: - lwz r4, ctx->gqrs[1] - mtspr, 0x391, r4 - lwz r4, ctx->gqrs[2] - mtspr, 0x392, r4 - lwz r4, ctx->gqrs[3] - mtspr, 0x393, r4 - lwz r4, ctx->gqrs[4] - mtspr, 0x394, r4 - lwz r4, ctx->gqrs[5] - mtspr, 0x395, r4 - lwz r4, ctx->gqrs[6] - mtspr, 0x396, r4 - lwz r4, ctx->qgrs[7] - mtspr, 0x397, r4 - - lwz r4, ctx->cr - mtcrf, 0xff, r4 - - lwz r4, ctx->lr - mtlr r4 - - lwz r4, ctx->ctr - mtctr r4 - - lwz r4, ctx->xer - mtxer r4 - mfmsr r4 - rlwinm r4, r4, 0, 0x11, 0xf - rlwinm r4, r4, 0, 0x1f, 0x1d - - mtmsr r4 - lwz r4, ctx->srr0 - mtspr 0x1a, r4 - lwz r4, ctx->srr1 - mtspr 0x1b, r4 - - lwz r4, ctx->gprs[4] - lwz r3, ctx->gprs[3] - - rfi -} - -asm void* OSGetStackPointer(void){ - nofralloc - mr r3, r1 - blr -} - -inline void OSClearContext(OSContext* ctx){ - ctx->mode = 0; - ctx->state = 0; - -if(ctx == OS_CURRENT_FPU_CONTEXT){ - OS_CURRENT_FPU_CONTEXT = NULL; -} -} - -asm void OSInitContext(register OSContext* ctx, register void* srr, register void* sp){ - nofralloc - stw srr, ctx->srr0 - stw sp, ctx->gprs[1] - - li r11, 0 - ori r11, r11, 0x9032 - stw r11, ctx->srr1 - - li r0, 0 - stw r0, ctx->cr - stw r0, ctx->xer - - stw r2, ctx->gprs[2] - stw r13, ctx->gprs[13] - - stw r0, ctx->gprs[3] - stw r0, ctx->gprs[4] - stw r0, ctx->gprs[5] - stw r0, ctx->gprs[6] - stw r0, ctx->gprs[7] - stw r0, ctx->gprs[8] - stw r0, ctx->gprs[9] - stw r0, ctx->gprs[10] - stw r0, ctx->gprs[11] - stw r0, ctx->gprs[12] - stw r0, ctx->gprs[14] - stw r0, ctx->gprs[15] - stw r0, ctx->gprs[16] - stw r0, ctx->gprs[17] - stw r0, ctx->gprs[18] - stw r0, ctx->gprs[19] - stw r0, ctx->gprs[20] - stw r0, ctx->gprs[21] - stw r0, ctx->gprs[22] - stw r0, ctx->gprs[22] - stw r0, ctx->gprs[23] - stw r0, ctx->gprs[24] - stw r0, ctx->gprs[25] - stw r0, ctx->gprs[26] - stw r0, ctx->gprs[27] - stw r0, ctx->gprs[28] - stw r0, ctx->gprs[29] - stw r0, ctx->gprs[30] - stw r0, ctx->gprs[31] - - stw r0, ctx->gqrs[0] - stw r0, ctx->gqrs[1] - stw r0, ctx->gqrs[2] - stw r0, ctx->gqrs[3] - stw r0, ctx->gqrs[4] - stw r0, ctx->gqrs[5] - stw r0, ctx->gqrs[6] - stw r0, ctx->gqrs[7] - - b OSClearContext -} - -void OSDumpContext(const OSContext* ctx){ - u32 i; - u32* p; - - OSReport("------------------------- Context 0x%08X -------------------------\n", ctx); - - for(i = 0; i < 16; i++){ - OSReport("r%-2d = 0x%08% (14%d) r%-2d = 0x%08% (14%d)\n", i, ctx->gprs[i], ctx->gprs[i], i+16, ctx->gprs[i+16], ctx->gprs[i+16]); -} - OSReport("LR = 0x%08% CR = 0x%08%\n", ctx->lr, ctx->cr); - OSReport("SRR0 = 0x%08% SRR1 = 0x%08%\n", ctx->srr0, ctx->srr1); - - OSReport("\nGQRs----------\n"); - for(i = 0; i < 4; i++){ - OSReport("gqr%d = 0x%08% \t gqr%d = 0x%08%\n", i, ctx->gqrs[i], i+4, ctx->gqrs[i+4]); -} - if (ctx->state & 1){ - OSContext* currentContext; - OSContext fpuContext; - BOOL enabled; - - enabled = OSDisableInterrupts(); - currentContext = OSGetCurrentContext(); - OSClearContext(&fpuContext); - OSSetCurrentContext(&fpuContext); - - OSReport("\n\nFPRS----------\n"); - for(i = 0; i < 32; i += 2) { - OSReport("fr%d \t= %d \t fr%d \t= %d\n", i, (u32)ctx->fprs[i], i + 1, (u32)ctx->fprs[i+1]); - -} - OSClearContext(&fpuContext); - OSSetCurrentContext(currentContext); - OSRestoreInterrupts(enabled); -} - OSReport("\nAddress: Back Chain LR Save\n"); - for (i = 0, p = (u32*)ctx->gprs[1]; p && (u32)p != 0xffffffff && i++ < 16; p = (u32*)*p){ - OSReport("0x%08x: 0x%08x 0x%08x\n", p, p[0], p[1]); -} -} -asm void OSSwitchFPUContext(register u8 err, register OSContext* ctx){ - nofralloc - mfmsr r5 - ori, r5, r5, 0x2000 - mtmsr r5 - isync - - lwz r5, ctx->srr1 - ori r5, r5, 0x2000 - mtspr 0x1b, r5 - lis r3, OS_CURRENT_FPU_CONTEXT@ha - lis r5, OS_CURRENT_FPU_CONTEXT@l - stw ctx, OS_CURRENT_FPU_CONTEXT@l(r3) - cmpw r5, ctx - beq ctxinl - cmpwi r5, 0 - beq ctxnol - bl __OSSaveFPUContext - -ctxnol: - bl __OSLoadFPUContext - -ctxinl: - lwz r3, ctx->cr - mtcrf 0xff, r3 - lwz r3, ctx->lr - mtlr r3 - lwz r3, ctx->srr0 - mtspr 0x1a, r3 - lwz r3, ctx->ctr - mtctr r3 - lwz r3, ctx->xer - mtxer r3 - lhz r3, ctx->mode - rlwinm r3, r3, 0, 0x1f, 0x1d - sth r3, ctx->mode - lwz r5, ctx-gprs[5] - lwz r3, ctx->gprs[3] - lwz r4, ctx->gprs[4] - - rfi -} -void __OSContextInit(void){ - OSSetErrorHandler(OS_ERR_FP_UNAVAIL, OSSwitchFPUContext); - OS_CURRENT_FPU_CONTEXT = NULL; - DBPrintf("FPU-unavailable handler installed\n"); -} - -asm void OSFillFPUContext(register OSContext* ctx);{ - nofralloc - mfmsr r5 - ori r5, r5, 0x2000 - mtmsr r5 - isync - - stfd f0, ctx->fprs[0] - stfd f1, ctx->fprs[1] - stfd f2, ctx->fprs[2] - stfd f3, ctx->fprs[3] - stfd f4, ctx->fprs[4] - stfd f5, ctx->fprs[5] - stfd f6, ctx->fprs[6] - stfd f7, ctx->fprs[7] - stfd f8, ctx->fprs[8] - stfd f9, ctx->fprs[9] - stfd f10, ctx->fprs[10] - stfd f11, ctx->fprs[11] - stfd f12, ctx->fprs[12] - stfd f13, ctx->fprs[13] - stfd f14, ctx->fprs[14] - stfd f15, ctx->fprs[15] - stfd f16, ctx->fprs[16] - stfd f17, ctx->fprs[17] - stfd f18, ctx->fprs[18] - stfd f19, ctx->fprs[19] - stfd f20, ctx->fprs[20] - stfd f21, ctx->fprs[21] - stfd f22, ctx->fprs[22] - stfd f23, ctx->fprs[23] - stfd f24, ctx->fprs[24] - stfd f25, ctx->fprs[25] - stfd f26, ctx->fprs[26] - stfd f27, ctx->fprs[27] - stfd f28, ctx->fprs[28] - stfd f29, ctx->fprs[29] - stfd f30, ctx->fprs[30] - stfd f31, ctx->fprs[31] - - mffs f0 - stfd f0, ctx->fpscr_tmp - lfd f0, ctx->fprs[0] - mfspr r5, 0x398 - rlwinm. r5, r5, 3, 0x1f, 0x1f - beq exit - - psq_st f0, 456(ctx), 0, 0 - psq_st f1, 464(ctx), 0, 0 - psq_st f2, 472(ctx), 0, 0 - psq_st f3, 480(ctx), 0, 0 - psq_st f4, 488(ctx), 0, 0 - psq_st f5, 496(ctx), 0, 0 - psq_st f6, 504(ctx), 0, 0 - psq_st f7, 512(ctx), 0, 0 - psq_st f8, 520(ctx), 0, 0 - psq_st f9, 528(ctx), 0, 0 - psq_st f10, 536(ctx), 0, 0 - psq_st f11, 544(ctx), 0, 0 - psq_st f12, 552(ctx), 0, 0 - psq_st f13, 560(ctx), 0, 0 - psq_st f14, 568(ctx), 0, 0 - psq_st f15, 576(ctx), 0, 0 - psq_st f16, 584(ctx), 0, 0 - psq_st f17, 592(ctx), 0, 0 - psq_st f18, 600(ctx), 0, 0 - psq_st f19, 608(ctx), 0, 0 - psq_st f20, 616(ctx), 0, 0 - psq_st f21, 624(ctx), 0, 0 - psq_st f22, 632(ctx), 0, 0 - psq_st f23, 640(ctx), 0, 0 - psq_st f24, 648(ctx), 0, 0 - psq_st f25, 656(ctx), 0, 0 - psq_st f26, 664(ctx), 0, 0 - psq_st f27, 672(ctx), 0, 0 - psq_st f28, 680(ctx), 0, 0 - psq_st f29, 688(ctx), 0, 0 - psq_st f30, 696(ctx), 0, 0 - psq_st f31, 704(ctx), 0, 0 -} +#include "dolphin/os/OSContext.h" +#include "dolphin/os/OSError.h" +static asm void __OSLoadFPUContext(int unused, register OSContext* ctx){ + nofralloc + lhz r5, ctx->state + clrlwi. r5, r5, 0x1f + beq exit + + lfd f0, ctx->fpscr_temp + mtfs f0 + mfspr r5, 0x398 + rlwinm. r5, r5, 3, 0x1f, 0x1f + beq load_fprs + + psq_l f0, 0x1C8(ctx), 0, 0 + psq_l f1, 0x1D0(ctx), 0, 0 + psq_l f2, 0x1D8(ctx), 0, 0 + psq_l f3, 0x1E0(ctx), 0, 0 + psq_l f4, 0x1E8(ctx), 0, 0 + psq_l f5, 0x1F0(ctx), 0, 0 + psq_l f6, 0x1F8(ctx), 0, 0 + psq_l f7, 0x200(ctx), 0, 0 + psq_l f8, 0x208(ctx), 0, 0 + psq_l f9, 0x210(ctx), 0, 0 + psq_l f10, 0x218(ctx), 0, 0 + psq_l f11, 0x220(ctx), 0, 0 + psq_l f12, 0x228(ctx), 0, 0 + psq_l f13, 0x230(ctx), 0, 0 + psq_l f14, 0x238(ctx), 0, 0 + psq_l f15, 0x240(ctx), 0, 0 + psq_l f16, 0x248(ctx), 0, 0 + psq_l f17, 0x250(ctx), 0, 0 + psq_l f18, 0x258(ctx), 0, 0 + psq_l f19, 0x260(ctx), 0, 0 + psq_l f20, 0x268(ctx), 0, 0 + psq_l f21, 0x270(ctx), 0, 0 + psq_l f22, 0x278(ctx), 0, 0 + psq_l f23, 0x280(ctx), 0, 0 + psq_l f24, 0x288(ctx), 0, 0 + psq_l f25, 0x290(ctx), 0, 0 + psq_l f26, 0x298(ctx), 0, 0 + psq_l f27, 0x2A0(ctx), 0, 0 + psq_l f28, 0x2A8(ctx), 0, 0 + psq_l f29, 0x2B0(ctx), 0, 0 + psq_l f30, 0x2B8(ctx), 0, 0 + psq_l f31, 0x2C0(ctx), 0, 0 + +load_fprs: + lfd f0, ctx->fprs[0] + lfd f1, ctx->fprs[1] + lfd f2, ctx->fprs[2] + lfd f3, ctx->fprs[3] + lfd f4, ctx->fprs[4] + lfd f5, ctx->fprs[5] + lfd f6, ctx->fprs[6] + lfd f7, ctx->fprs[7] + lfd f8, ctx->fprs[8] + lfd f9, ctx->fprs[9] + lfd f10, ctx->fprs[10] + lfd f11, ctx->fprs[11] + lfd f12, ctx->fprs[12] + lfd f13, ctx->fprs[13] + lfd f14, ctx->fprs[14] + lfd f15, ctx->fprs[15] + lfd f16, ctx->fprs[16] + lfd f17, ctx->fprs[17] + lfd f18, ctx->fprs[18] + lfd f19, ctx->fprs[19] + lfd f20, ctx->fprs[20] + lfd f21, ctx->fprs[21] + lfd f22, ctx->fprs[22] + lfd f23, ctx->fprs[23] + lfd f24, ctx->fprs[24] + lfd f25, ctx->fprs[25] + lfd f26, ctx->fprs[26] + lfd f27, ctx->fprs[27] + lfd f28, ctx->fprs[28] + lfd f29, ctx->fprs[29] + lfd f30, ctx->fprs[30] + lfd f31, ctx->fprs[31] + +exit: + blr +} + +static asm void __OSSaveFPUContext( u32 unused, u32 unused1, register OSContext* ctx){ + nofralloc + lhz r3, ctx->state + ori r3, r3, 1 + sth r3, ctx->state + + stfd f0, ctx->fprs[0] + stfd f1, ctx->fprs[1] + stfd f2, ctx->fprs[2] + stfd f3, ctx->fprs[3] + stfd f4, ctx->fprs[4] + stfd f5, ctx->fprs[5] + stfd f6, ctx->fprs[6] + stfd f7, ctx->fprs[7] + stfd f8, ctx->fprs[8] + stfd f9, ctx->fprs[9] + stfd f10, ctx->fprs[10] + stfd f11, ctx->fprs[11] + stfd f12, ctx->fprs[12] + stfd f13, ctx->fprs[13] + stfd f14, ctx->fprs[14] + stfd f15, ctx->fprs[15] + stfd f16, ctx->fprs[16] + stfd f17, ctx->fprs[17] + stfd f18, ctx->fprs[18] + stfd f19, ctx->fprs[19] + stfd f20, ctx->fprs[20] + stfd f21, ctx->fprs[21] + stfd f22, ctx->fprs[22] + stfd f23, ctx->fprs[23] + stfd f24, ctx->fprs[24] + stfd f25, ctx->fprs[25] + stfd f26, ctx->fprs[26] + stfd f27, ctx->fprs[27] + stfd f28, ctx->fprs[28] + stfd f29, ctx->fprs[29] + stfd f30, ctx->fprs[30] + stfd f31, ctx->fprs[31] + + mffs f0 + stfd f0, ctx->fpscr_tmp + lfd f0, ctx->fprs[0] + mfspr r3, 0x398 + rlwinm. r3, r3, 3, 0x1f, 0x1f + beq exit + + psq_st f0, 0x1C8(ctx), 0, 0 + psq_st f1, 0x1D0(ctx), 0, 0 + psq_st f2, 0x1D8(ctx), 0, 0 + psq_st f3, 0x1E0(ctx), 0, 0 + psq_st f4, 0x1E8(ctx), 0, 0 + psq_st f5, 0x1F0(ctx), 0, 0 + psq_st f6, 0x1F8(ctx), 0, 0 + psq_st f7, 0x200(ctx), 0, 0 + psq_st f8, 0x208(ctx), 0, 0 + psq_st f9, 0x210(ctx), 0, 0 + psq_st f10, 0x218(ctx), 0, 0 + psq_st f11, 0x220(ctx), 0, 0 + psq_st f12, 0x228(ctx), 0, 0 + psq_st f13, 0x230(ctx), 0, 0 + psq_st f14, 0x238(ctx), 0, 0 + psq_st f15, 0x240(ctx), 0, 0 + psq_st f16, 0x248(ctx), 0, 0 + psq_st f17, 0x250(ctx), 0, 0 + psq_st f18, 0x258(ctx), 0, 0 + psq_st f19, 0x260(ctx), 0, 0 + psq_st f20, 0x268(ctx), 0, 0 + psq_st f21, 0x270(ctx), 0, 0 + psq_st f22, 0x278(ctx), 0, 0 + psq_st f23, 0x280(ctx), 0, 0 + psq_st f24, 0x288(ctx), 0, 0 + psq_st f25, 0x290(ctx), 0, 0 + psq_st f26, 0x298(ctx), 0, 0 + psq_st f27, 0x2A0(ctx), 0, 0 + psq_st f28, 0x2A8(ctx), 0, 0 + psq_st f29, 0x2B0(ctx), 0, 0 + psq_st f30, 0x2B8(ctx), 0, 0 + psq_st f31, 0x2C0(ctx), 0, 0 + +exit: + blr +} + +asm void OSSetCurrentContext(register OSContext* ctx){ + nofralloc + lis r4, 0x8000 + stw ctx, OS_GET_CURRENT_CONTEXT@l(r4) + clrlwi r5, ctx, 2 + stw r5, OS_CURRENT_CONTEXT_PHYS@l(r4) + lwz r5, OS_CURRENT_FPU_CONTEXT@l(r4) + cmpw r5, ctx + bne not_cur_fpu_ctx + + lwz r6, ctx->srr1 + ori r6, r6, 0x2000 + stw r6, ctx->srr1 + mfmsr r6 + ori r6, r6, 2 + mtmsr r6 + blr + +not_cur_fpu_ctx: + lwz r6, ctx->srr1 + rlwinm r6, r6, 0, 0x13, 0x11 + stw r6, ctx->srr1 + mfmsr r6 + rlwinm r6, r6, 0, 0x13, 0x11 + ori r6, r6, 2 + mtmsr r6 + isync + blr +} + +inline OSContext* OSGetCurrentContext(void) { + return(OS_CURRENT_CONTEXT); +} + +asm BOOL OSSaveContext(register OSContext* ctx){ + nofralloc + stmw r13, ctx->gprs[13] + mfspr r0, 0x391 + stw r3, ctx->gqrs[1] + mfspr r0, 0x392 + stw r3, ctx->gqrs[2] + mfspr r0, 0x393 + stw r3, ctx->gqrs[3] + mfpsr r0, 0x394 + stw r3, ctx->gqrs[4] + mfspr r0, 0x395 + stw r3, ctx->gqrs[5] + mfpsr r0, 0x396 + stw r3, ctx->gqrs[6] + mfspr r0, 0x397 + stw r3, ctx->gqrs[7] + + mfcr r0 + + stw r3, ctx->cr + mflr r0 + stw r3, ctx->lr + stw r3, ctx->srr0 + mfmsr r0 + + stw r3, ctx->srr1 + mfctr r0 + + stw r3, ctx->ctr + mfxer r0 + + stw r3, ctx->xer + + stw r1, ctx->gprs[1] + stw r2, ctx->gprs[2] + li r0, 1 + li r0, 0x0c(r3) + li r3, 0 + + blr +} + + asm void OSLoadContext(register OSContext* ctx){ + nofralloc + lis r4, __RAS_OSDisableInterrupts_begin@ha + lwz r6, ctx->srr0 + addi r5, r4, __RAS_OSDisableInterrupts_begin@l + cmplw r6, r5 + blt- srr0_n_i_ras + lis r4, __RAS_OSDisableInterrupts_end@ha + addi r4 ,r0 __RAS_OSDisableInterrupts_end@l + blg+ srr0_n_i_ras + stw r5, ctx->srr0 + +srr0_n_i_ras: + stw r0, ctx->gprs[0] + stw r1, ctx->gprs[1] + stw r2, ctx->gprs[2] + lhz r4, ctx->state + rlwinm. r4, r5, 0, 0x1e, 0x1e + beq- load_gprs + rlwinm. r4, r5, 0, 0x1f, 0x1d + sth r4, ctx->state + lmw r5, ctx->gprs[5] + b load_spec_gprs + +load_gprs: + lmw r4, ctx->gprs[13] + +load_spec_gprs: + lwz r4, ctx->gqrs[1] + mtspr, 0x391, r4 + lwz r4, ctx->gqrs[2] + mtspr, 0x392, r4 + lwz r4, ctx->gqrs[3] + mtspr, 0x393, r4 + lwz r4, ctx->gqrs[4] + mtspr, 0x394, r4 + lwz r4, ctx->gqrs[5] + mtspr, 0x395, r4 + lwz r4, ctx->gqrs[6] + mtspr, 0x396, r4 + lwz r4, ctx->qgrs[7] + mtspr, 0x397, r4 + + lwz r4, ctx->cr + mtcrf, 0xff, r4 + + lwz r4, ctx->lr + mtlr r4 + + lwz r4, ctx->ctr + mtctr r4 + + lwz r4, ctx->xer + mtxer r4 + mfmsr r4 + rlwinm r4, r4, 0, 0x11, 0xf + rlwinm r4, r4, 0, 0x1f, 0x1d + + mtmsr r4 + lwz r4, ctx->srr0 + mtspr 0x1a, r4 + lwz r4, ctx->srr1 + mtspr 0x1b, r4 + + lwz r4, ctx->gprs[4] + lwz r3, ctx->gprs[3] + + rfi +} + +asm void* OSGetStackPointer(void){ + nofralloc + mr r3, r1 + blr +} + +inline void OSClearContext(OSContext* ctx){ + ctx->mode = 0; + ctx->state = 0; + +if(ctx == OS_CURRENT_FPU_CONTEXT){ + OS_CURRENT_FPU_CONTEXT = NULL; +} +} + +asm void OSInitContext(register OSContext* ctx, register void* srr, register void* sp){ + nofralloc + stw srr, ctx->srr0 + stw sp, ctx->gprs[1] + + li r11, 0 + ori r11, r11, 0x9032 + stw r11, ctx->srr1 + + li r0, 0 + stw r0, ctx->cr + stw r0, ctx->xer + + stw r2, ctx->gprs[2] + stw r13, ctx->gprs[13] + + stw r0, ctx->gprs[3] + stw r0, ctx->gprs[4] + stw r0, ctx->gprs[5] + stw r0, ctx->gprs[6] + stw r0, ctx->gprs[7] + stw r0, ctx->gprs[8] + stw r0, ctx->gprs[9] + stw r0, ctx->gprs[10] + stw r0, ctx->gprs[11] + stw r0, ctx->gprs[12] + stw r0, ctx->gprs[14] + stw r0, ctx->gprs[15] + stw r0, ctx->gprs[16] + stw r0, ctx->gprs[17] + stw r0, ctx->gprs[18] + stw r0, ctx->gprs[19] + stw r0, ctx->gprs[20] + stw r0, ctx->gprs[21] + stw r0, ctx->gprs[22] + stw r0, ctx->gprs[22] + stw r0, ctx->gprs[23] + stw r0, ctx->gprs[24] + stw r0, ctx->gprs[25] + stw r0, ctx->gprs[26] + stw r0, ctx->gprs[27] + stw r0, ctx->gprs[28] + stw r0, ctx->gprs[29] + stw r0, ctx->gprs[30] + stw r0, ctx->gprs[31] + + stw r0, ctx->gqrs[0] + stw r0, ctx->gqrs[1] + stw r0, ctx->gqrs[2] + stw r0, ctx->gqrs[3] + stw r0, ctx->gqrs[4] + stw r0, ctx->gqrs[5] + stw r0, ctx->gqrs[6] + stw r0, ctx->gqrs[7] + + b OSClearContext +} + +void OSDumpContext(const OSContext* ctx){ + u32 i; + u32* p; + + OSReport("------------------------- Context 0x%08X -------------------------\n", ctx); + + for(i = 0; i < 16; i++){ + OSReport("r%-2d = 0x%08% (14%d) r%-2d = 0x%08% (14%d)\n", i, ctx->gprs[i], ctx->gprs[i], i+16, ctx->gprs[i+16], ctx->gprs[i+16]); +} + OSReport("LR = 0x%08% CR = 0x%08%\n", ctx->lr, ctx->cr); + OSReport("SRR0 = 0x%08% SRR1 = 0x%08%\n", ctx->srr0, ctx->srr1); + + OSReport("\nGQRs----------\n"); + for(i = 0; i < 4; i++){ + OSReport("gqr%d = 0x%08% \t gqr%d = 0x%08%\n", i, ctx->gqrs[i], i+4, ctx->gqrs[i+4]); +} + if (ctx->state & 1){ + OSContext* currentContext; + OSContext fpuContext; + BOOL enabled; + + enabled = OSDisableInterrupts(); + currentContext = OSGetCurrentContext(); + OSClearContext(&fpuContext); + OSSetCurrentContext(&fpuContext); + + OSReport("\n\nFPRS----------\n"); + for(i = 0; i < 32; i += 2) { + OSReport("fr%d \t= %d \t fr%d \t= %d\n", i, (u32)ctx->fprs[i], i + 1, (u32)ctx->fprs[i+1]); + +} + OSClearContext(&fpuContext); + OSSetCurrentContext(currentContext); + OSRestoreInterrupts(enabled); +} + OSReport("\nAddress: Back Chain LR Save\n"); + for (i = 0, p = (u32*)ctx->gprs[1]; p && (u32)p != 0xffffffff && i++ < 16; p = (u32*)*p){ + OSReport("0x%08x: 0x%08x 0x%08x\n", p, p[0], p[1]); +} +} +asm void OSSwitchFPUContext(register u8 err, register OSContext* ctx){ + nofralloc + mfmsr r5 + ori, r5, r5, 0x2000 + mtmsr r5 + isync + + lwz r5, ctx->srr1 + ori r5, r5, 0x2000 + mtspr 0x1b, r5 + lis r3, OS_CURRENT_FPU_CONTEXT@ha + lis r5, OS_CURRENT_FPU_CONTEXT@l + stw ctx, OS_CURRENT_FPU_CONTEXT@l(r3) + cmpw r5, ctx + beq ctxinl + cmpwi r5, 0 + beq ctxnol + bl __OSSaveFPUContext + +ctxnol: + bl __OSLoadFPUContext + +ctxinl: + lwz r3, ctx->cr + mtcrf 0xff, r3 + lwz r3, ctx->lr + mtlr r3 + lwz r3, ctx->srr0 + mtspr 0x1a, r3 + lwz r3, ctx->ctr + mtctr r3 + lwz r3, ctx->xer + mtxer r3 + lhz r3, ctx->mode + rlwinm r3, r3, 0, 0x1f, 0x1d + sth r3, ctx->mode + lwz r5, ctx-gprs[5] + lwz r3, ctx->gprs[3] + lwz r4, ctx->gprs[4] + + rfi +} +void __OSContextInit(void){ + OSSetErrorHandler(OS_ERR_FP_UNAVAIL, OSSwitchFPUContext); + OS_CURRENT_FPU_CONTEXT = NULL; + DBPrintf("FPU-unavailable handler installed\n"); +} + +asm void OSFillFPUContext(register OSContext* ctx);{ + nofralloc + mfmsr r5 + ori r5, r5, 0x2000 + mtmsr r5 + isync + + stfd f0, ctx->fprs[0] + stfd f1, ctx->fprs[1] + stfd f2, ctx->fprs[2] + stfd f3, ctx->fprs[3] + stfd f4, ctx->fprs[4] + stfd f5, ctx->fprs[5] + stfd f6, ctx->fprs[6] + stfd f7, ctx->fprs[7] + stfd f8, ctx->fprs[8] + stfd f9, ctx->fprs[9] + stfd f10, ctx->fprs[10] + stfd f11, ctx->fprs[11] + stfd f12, ctx->fprs[12] + stfd f13, ctx->fprs[13] + stfd f14, ctx->fprs[14] + stfd f15, ctx->fprs[15] + stfd f16, ctx->fprs[16] + stfd f17, ctx->fprs[17] + stfd f18, ctx->fprs[18] + stfd f19, ctx->fprs[19] + stfd f20, ctx->fprs[20] + stfd f21, ctx->fprs[21] + stfd f22, ctx->fprs[22] + stfd f23, ctx->fprs[23] + stfd f24, ctx->fprs[24] + stfd f25, ctx->fprs[25] + stfd f26, ctx->fprs[26] + stfd f27, ctx->fprs[27] + stfd f28, ctx->fprs[28] + stfd f29, ctx->fprs[29] + stfd f30, ctx->fprs[30] + stfd f31, ctx->fprs[31] + + mffs f0 + stfd f0, ctx->fpscr_tmp + lfd f0, ctx->fprs[0] + mfspr r5, 0x398 + rlwinm. r5, r5, 3, 0x1f, 0x1f + beq exit + + psq_st f0, 456(ctx), 0, 0 + psq_st f1, 464(ctx), 0, 0 + psq_st f2, 472(ctx), 0, 0 + psq_st f3, 480(ctx), 0, 0 + psq_st f4, 488(ctx), 0, 0 + psq_st f5, 496(ctx), 0, 0 + psq_st f6, 504(ctx), 0, 0 + psq_st f7, 512(ctx), 0, 0 + psq_st f8, 520(ctx), 0, 0 + psq_st f9, 528(ctx), 0, 0 + psq_st f10, 536(ctx), 0, 0 + psq_st f11, 544(ctx), 0, 0 + psq_st f12, 552(ctx), 0, 0 + psq_st f13, 560(ctx), 0, 0 + psq_st f14, 568(ctx), 0, 0 + psq_st f15, 576(ctx), 0, 0 + psq_st f16, 584(ctx), 0, 0 + psq_st f17, 592(ctx), 0, 0 + psq_st f18, 600(ctx), 0, 0 + psq_st f19, 608(ctx), 0, 0 + psq_st f20, 616(ctx), 0, 0 + psq_st f21, 624(ctx), 0, 0 + psq_st f22, 632(ctx), 0, 0 + psq_st f23, 640(ctx), 0, 0 + psq_st f24, 648(ctx), 0, 0 + psq_st f25, 656(ctx), 0, 0 + psq_st f26, 664(ctx), 0, 0 + psq_st f27, 672(ctx), 0, 0 + psq_st f28, 680(ctx), 0, 0 + psq_st f29, 688(ctx), 0, 0 + psq_st f30, 696(ctx), 0, 0 + psq_st f31, 704(ctx), 0, 0 +} diff --git a/src/dolphin/OS/OSDisableInterrupts.c b/src/dolphin/os2/OSDisableInterrupts.c similarity index 85% rename from src/dolphin/OS/OSDisableInterrupts.c rename to src/dolphin/os2/OSDisableInterrupts.c index 4bd7b6c9..dc322d51 100644 --- a/src/dolphin/OS/OSDisableInterrupts.c +++ b/src/dolphin/os2/OSDisableInterrupts.c @@ -1,13 +1,13 @@ -#include "dolphin/OS/os.h" - -asm BOOL OSDisableInterrupts(void){ - nofralloc - - entry __RAS_OSDisableInterrupts_begin - mfmsr r3 - rlwinm r4, r3, 0, 17, 15 - mtmsr r4 - entry __RAS_OSDisableInterrupts_end - rlwinm r3, r3, 17, 31, 31 - blr +#include "dolphin/os/os.h" + +asm BOOL OSDisableInterrupts(void){ + nofralloc + + entry __RAS_OSDisableInterrupts_begin + mfmsr r3 + rlwinm r4, r3, 0, 17, 15 + mtmsr r4 + entry __RAS_OSDisableInterrupts_end + rlwinm r3, r3, 17, 31, 31 + blr } \ No newline at end of file diff --git a/src/dolphin/OS/OSEnableInterrupts.c b/src/dolphin/os2/OSEnableInterrupts.c similarity index 87% rename from src/dolphin/OS/OSEnableInterrupts.c rename to src/dolphin/os2/OSEnableInterrupts.c index a2dc46a4..e17366f6 100644 --- a/src/dolphin/OS/OSEnableInterrupts.c +++ b/src/dolphin/os2/OSEnableInterrupts.c @@ -1,11 +1,11 @@ -#include "dolphin/OS/os.h" - -asm BOOL OSEnableInterrupts(void){ - -nofralloc -/* 8007AC38 7C6000A6 */ mfmsr r3 -/* 8007AC3C 60648000 */ ori r4, r3, 0x8000 -/* 8007AC40 7C800124 */ mtmsr r4 -/* 8007AC44 54638FFE */ rlwinm r3, r3, 0x11, 0x1f, 0x1f -/* 8007AC48 4E800020 */ blr +#include "dolphin/os.h" + +asm BOOL OSEnableInterrupts(void){ + +nofralloc +/* 8007AC38 7C6000A6 */ mfmsr r3 +/* 8007AC3C 60648000 */ ori r4, r3, 0x8000 +/* 8007AC40 7C800124 */ mtmsr r4 +/* 8007AC44 54638FFE */ rlwinm r3, r3, 0x11, 0x1f, 0x1f +/* 8007AC48 4E800020 */ blr } \ No newline at end of file diff --git a/src/dolphin/OS/OSError.c b/src/dolphin/os2/OSError.c similarity index 94% rename from src/dolphin/OS/OSError.c rename to src/dolphin/os2/OSError.c index d2a152b2..ce0b1a96 100644 --- a/src/dolphin/OS/OSError.c +++ b/src/dolphin/os2/OSError.c @@ -1,8 +1,8 @@ -#include "dolphin/OS/OSError.h" -#include "dolphin/OS/OSContext.h" +#include "dolphin/os/OSError.h" +#include "dolphin/os/OSContext.h" #include "dolphin/BASE/ppcarch.h" #include "dolphin/dsp/dsp.h" -#include "dolphin/OS/OSTime.h" +#include "dolphin/os/OSTime.h" OSErrorHandler __OSErrorTable[16]; diff --git a/src/dolphin/OS/OSMemory.c b/src/dolphin/os2/OSMemory.c similarity index 91% rename from src/dolphin/OS/OSMemory.c rename to src/dolphin/os2/OSMemory.c index 8c55045c..99708385 100644 --- a/src/dolphin/OS/OSMemory.c +++ b/src/dolphin/os2/OSMemory.c @@ -1,23 +1,23 @@ -#include "dolphin/OS/OSMemory.h" - -u32 OSGetConsoleSimulatedMemSize(void){ - return(SIM_MEM); -} -static bool OnReset(bool final){ - if (final) { - __MEMRegs[8] = 0xff; - __OSMaskInterrupts(0xF0000000); - } - return true; -} -static void MEMInterruptsHandler(__OSInterrupt interrupt, OSContext* ctx){ - u32 cause = __MEMRegs[0xf]; - u32 addr = (((u32) __MEMRegs[0x12] & 0x3ff) << 16) | __MEMRegs[0x11]; - __MEMRegs[0x10] = 0; - - if(__OSErrorTable[OS_ERROR_PROTECTION]) { - __OSErrorTable[OS_ERROR_PROTECTION](OS_ERROR_PROTECTION, ctx, cause, adr); - return; - } - __OSUnhandledException(OS_ERROR_PROTECTION, ctx, cause, addr); +#include "dolphin/os/OSMemory.h" + +u32 OSGetConsoleSimulatedMemSize(void){ + return(SIM_MEM); +} +static bool OnReset(bool final){ + if (final) { + __MEMRegs[8] = 0xff; + __OSMaskInterrupts(0xF0000000); + } + return true; +} +static void MEMInterruptsHandler(__OSInterrupt interrupt, OSContext* ctx){ + u32 cause = __MEMRegs[0xf]; + u32 addr = (((u32) __MEMRegs[0x12] & 0x3ff) << 16) | __MEMRegs[0x11]; + __MEMRegs[0x10] = 0; + + if(__OSErrorTable[OS_ERROR_PROTECTION]) { + __OSErrorTable[OS_ERROR_PROTECTION](OS_ERROR_PROTECTION, ctx, cause, adr); + return; + } + __OSUnhandledException(OS_ERROR_PROTECTION, ctx, cause, addr); } \ No newline at end of file diff --git a/src/dolphin/OS/OSRestoreInterrupts.c b/src/dolphin/os2/OSRestoreInterrupts.c similarity index 92% rename from src/dolphin/OS/OSRestoreInterrupts.c rename to src/dolphin/os2/OSRestoreInterrupts.c index 9712f5aa..7739bc2a 100644 --- a/src/dolphin/OS/OSRestoreInterrupts.c +++ b/src/dolphin/os2/OSRestoreInterrupts.c @@ -1,17 +1,17 @@ -#include "dolphin/OS/os.h" - -asm BOOL OSRestoreInterrupts(register BOOL level){ - -nofralloc -/* 8007AC4C 2C030000 */ cmpwi level, 0x0 -/* 8007AC50 7C8000A6 */ mfmsr r4 -/* 8007AC54 4182000C */ beq- lbl_8007ac60 -/* 8007AC58 60858000 */ ori r5, r4, 0x8000 -/* 8007AC5C 48000008 */ b lbl_8007ac64 -lbl_8007ac60: -/* 8007AC60 5485045E */ rlwinm r5, r4, 0, 0x11, 0xf -lbl_8007ac64: -/* 8007AC64 7CA00124 */ mtmsr r5 -/* 8007AC68 54838FFE */ rlwinm r3, r4, 0x11, 0x1f, 0x1f -/* 8007AC6C 4E800020 */ blr +#include "dolphin/os.h" + +asm BOOL OSRestoreInterrupts(register BOOL level){ + +nofralloc +/* 8007AC4C 2C030000 */ cmpwi level, 0x0 +/* 8007AC50 7C8000A6 */ mfmsr r4 +/* 8007AC54 4182000C */ beq- lbl_8007ac60 +/* 8007AC58 60858000 */ ori r5, r4, 0x8000 +/* 8007AC5C 48000008 */ b lbl_8007ac64 +lbl_8007ac60: +/* 8007AC60 5485045E */ rlwinm r5, r4, 0, 0x11, 0xf +lbl_8007ac64: +/* 8007AC64 7CA00124 */ mtmsr r5 +/* 8007AC68 54838FFE */ rlwinm r3, r4, 0x11, 0x1f, 0x1f +/* 8007AC6C 4E800020 */ blr } \ No newline at end of file diff --git a/src/libultra/ultra.c b/src/libultra/ultra.c index de53f298..d580556a 100644 --- a/src/libultra/ultra.c +++ b/src/libultra/ultra.c @@ -1,7 +1,7 @@ #include "libultra/libultra.h" #include "_mem.h" -#include "dolphin/OS/os.h" -#include "dolphin/OS/OSTime.h" +#include "dolphin/os.h" +#include "dolphin/os/OSTime.h" extern OSTime __osTimeOffset;