summaryrefslogtreecommitdiff
path: root/lib/ultralib/src/error
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ultralib/src/error')
-rw-r--r--lib/ultralib/src/error/commonerror.c6
-rw-r--r--lib/ultralib/src/error/error.c6
-rw-r--r--lib/ultralib/src/error/errorasm.s20
-rw-r--r--lib/ultralib/src/error/kmcprintf.c250
4 files changed, 266 insertions, 16 deletions
diff --git a/lib/ultralib/src/error/commonerror.c b/lib/ultralib/src/error/commonerror.c
index 5a6f1c9..c44a774 100644
--- a/lib/ultralib/src/error/commonerror.c
+++ b/lib/ultralib/src/error/commonerror.c
@@ -3,14 +3,14 @@
#include "PR/sptask.h"
#include "PR/ultraerror.h"
#include "PR/ultralog.h"
-#include "macros.h"
+#include "PRinternal/macros.h"
#include "stdarg.h"
#ifndef _FINALROM
void __osSyncVPrintf(const char* fmt, va_list args);
-static u32 errorLogData[19] ALIGNED(8);
+static u32 errorLogData[19] ALIGNED(0x8);
static OSLog errorLog = {
OS_ERROR_MAGIC, // magic
sizeof(errorLogData), // len
@@ -22,7 +22,7 @@ static OSLog errorLog = {
static void __commonErrorHandler(s16 code, s16 numArgs, ...);
OSErrorHandler __osCommonHandler = __commonErrorHandler;
-char NULSTR[] = { '\0' };
+char NULSTR[] = "";
const char* __os_error_message[] = {
NULSTR,
diff --git a/lib/ultralib/src/error/error.c b/lib/ultralib/src/error/error.c
index 3f9ae2d..ae75840 100644
--- a/lib/ultralib/src/error/error.c
+++ b/lib/ultralib/src/error/error.c
@@ -3,13 +3,13 @@
#include "PR/os_internal.h"
#include "PR/ultralog.h"
#include "PR/ultraerror.h"
-#include "macros.h"
+#include "PRinternal/macros.h"
void __osLogWrite(OSLog* log, s16 code, s16 numArgs, va_list argPtr);
static void __osDefaultHandler(s16 code, s16 numArgs, ...);
-static u32 errorLogData[19] ALIGNED(8);
-static OSLog errorLog ALIGNED(8) = {
+static u32 errorLogData[19] ALIGNED(0x8);
+static OSLog errorLog ALIGNED(0x8) = {
OS_ERROR_MAGIC, // magic
sizeof(errorLogData), // len
errorLogData, // base
diff --git a/lib/ultralib/src/error/errorasm.s b/lib/ultralib/src/error/errorasm.s
index 10f3561..c41cf6d 100644
--- a/lib/ultralib/src/error/errorasm.s
+++ b/lib/ultralib/src/error/errorasm.s
@@ -7,23 +7,23 @@
LEAF(__osError)
#if BUILD_VERSION < VERSION_J
- lw t0,__osErrorHandler
- beqz t0,1f
+ lw t0, __osErrorHandler
+ beqz t0, 1f
jr t0
#elif BUILD_VERSION < VERSION_K
- lw t0,__kmc_pt_mode
- bnez t0,_kmc_mode
+ lw t0, __kmc_pt_mode
+ bnez t0, _kmc_mode
- lw t0,__osErrorHandler
- beqz t0,1f
+ lw t0, __osErrorHandler
+ beqz t0, 1f
jr t0
_kmc_mode:
- lw t0,__kmcErrorHandler
- beqz t0,1f
+ lw t0, __kmcErrorHandler
+ beqz t0, 1f
jr t0
#else
- lw t0,__osCommonHandler
- beqz t0,1f
+ lw t0, __osCommonHandler
+ beqz t0, 1f
jr t0
#endif
1:
diff --git a/lib/ultralib/src/error/kmcprintf.c b/lib/ultralib/src/error/kmcprintf.c
new file mode 100644
index 0000000..830ac72
--- /dev/null
+++ b/lib/ultralib/src/error/kmcprintf.c
@@ -0,0 +1,250 @@
+// This file was added in 2.0J and removed in 2.0K
+#include "stdarg.h"
+#include "PR/os.h"
+#include "PR/rcp.h"
+#include "PR/rdb.h"
+#include "ultraerror.h"
+#include "../libc/xstdio.h"
+
+#ifndef _FINALROM
+
+extern u32 __kmc_pt_mode;
+
+static void* proutSyncPrintf(void* str, const char* buf, size_t n) {
+ size_t sent = 0;
+
+ while (sent < n) {
+ sent += __osRdbSend(buf + sent, n - sent, RDB_TYPE_GtoH_PRINT);
+ }
+ return 1;
+}
+
+static volatile unsigned int* stat = (unsigned*)0xbff08004;
+static volatile unsigned int* wport = (unsigned*)0xbff08000;
+static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG);
+
+static void rmonPutchar(char c) {
+ while (*piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
+ }
+
+ while (!(*stat & 4)) {
+ }
+
+ *wport = c;
+}
+
+static void* kmc_proutSyncPrintf(void* str, const char* buf, int n) {
+ int i;
+ char c;
+ char* p;
+ char* q;
+ char xbuf[128];
+ static int column = 0;
+
+ p = &xbuf;
+
+ for (i = 0; i < n; i++) {
+ c = *buf++;
+
+ switch (c) {
+ case '\n':
+ *p++ = '\n';
+ column = 0;
+ break;
+ case '\t':
+ do {
+ *p++ = ' ';
+ } while (++column % 8);
+ break;
+ default:
+ column++;
+ *p++ = c;
+ break;
+ }
+
+ if (c == '\n' || (p - xbuf) > 100) {
+ rmonPutchar((p - xbuf) - 1);
+
+ q = xbuf;
+ while (q != p) {
+ rmonPutchar(*q++);
+ }
+ p = xbuf;
+ }
+ }
+ if (p != xbuf) {
+ rmonPutchar((p - xbuf) - 1);
+
+ q = xbuf;
+ while (q != p) {
+ rmonPutchar(*q++);
+ }
+ }
+ return (void*)1;
+}
+
+char NULSTR[] = "";
+
+const char* __os_error_message[] = {
+ NULSTR,
+ "osCreateThread: stack pointer not aligned to 8 bytes (0x%x)",
+ "osCreateThread: priority not in range [0-255] (%d)",
+ "osStartThread: thread has bad state (running/runnable/other)",
+ "osSetThreadPri: priority not in range [0-255] (%d)",
+ "osCreateMesgQueue: message count not > 0 (%d)",
+ "osSendMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)",
+ "osJamMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)",
+ "osRecvMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)",
+ "osSetEventMesg: unknown event type (%d)",
+ "osMapTLB: index not in range [0-30] (%d)",
+ "osMapTLB: asid argument not -1 or in range [0-255] (%d)",
+ "osUnmapTLB: index not in range [0-30] (%d)",
+ "osSetTLBASID: asid not in range [0-255] (%d)",
+ "osAiSetFrequency: freq not in range [%d-%d] (%d)",
+ "osAiSetNextBuffer: address not aligned to 8 bytes (0x%x)",
+ "osAiSetNextBuffer: size not aligned to 8 bytes (0x%x)",
+ "osDpSetNextBuffer: address not aligned to 8 bytes (0x%x)",
+ "osDpSetNextBuffer: size not aligned to 8 bytes (0x%x)",
+ "osPiRawReadIo: address not aligned to 4 bytes (0x%x)",
+ "osPiRawWriteIo: address not aligned to 4 bytes (0x%x)",
+ "osPiRawStartDma: direction not OS_READ or OS_WRITE (%d)",
+ "osPiRawStartDma: device address not aligned to 2 bytes (0x%x)",
+ "osPiRawStartDma: DRAM address not aligned to 8 bytes (0x%x)",
+ "osPiRawStartDma: size not aligned to 2 bytes (%d)",
+ "osPiRawStartDma: size not in range [0,16777216] (%d)",
+ "osPiReadIo: address not aligned to 4 bytes (0x%x)",
+ "osPiWriteIo: address not aligned to 4 bytes (0x%x)",
+ "osPiStartDma: PI Manager not yet begun by osCreatePiManager",
+ "osPiStartDma: priority not OS_MESG_PRI_[NORMAL|HIGH] (%d)",
+ "osPiStartDma: direction not OS_READ or OS_WRITE (%d)",
+ "osPiStartDma: device address not aligned to 2 bytes (0x%x)",
+ "osPiStartDma: DRAM address not aligned to 8 bytes (0x%x)",
+ "osPiStartDma: size not aligned to 2 bytes (%d)",
+ "osPiStartDma: size not in range [0,16777216] (%d)",
+ "osCreatePiManager: priority not in range [0-255] (%d)",
+ "osViGetCurrentMode: VI Manager not yet begun",
+ "osViGetCurrentFramebuffer: VI Manager not yet begun",
+ "osViGetNextFramebuffer: VI Manager not yet begun",
+ "osViSetXScale: value not in range [0.25,1.0] (%f)",
+ "osViSetXScale: VI Manager not yet begun by osCreateViManager",
+ "osViSetYScale: value not in range [0.05,1.0] (%f)",
+ "osViSetYScale: VI Manager not yet begun by osCreateViManager",
+ "osViSetSpecialFeatures: not a known feature value (%d)",
+ "osViSetSpecialFeatures: VI Manager not yet begun",
+ "osViSetMode: VI Manager not yet begun by osCreateViManager",
+ "osViSetEvent: VI Manager not yet begun by osCreateViManager",
+ "osViSwapBuffer: frame buffer not aligned to 64 bytes (0x%x)",
+ "osViSwapBuffer: VI Manager not yet begun",
+ "osCreateViManager: priority not in range [0-255] (%d)",
+ "osCreateRegion: not a known alignment (%d)",
+ "osCreateRegion: length (%d) too small for buffer size (%d)",
+ "osMalloc: invalid or corrupt region (0x%x)",
+ "osFree: invalid or corrupt region (0x%x)",
+ "osFree: invalid address (0x%x) or\n corrupt region (0x%x)",
+ "osGetRegionBufCount: invalid or corrupt region (0x%x)",
+ "osGetRegionBufSize: invalid or corrupt region (0x%x)",
+ "osSpTaskLoad: dram_stack not aligned to 16 bytes (0x%x)",
+ "osSpTaskLoad: output_buff not aligned to 16 bytes (0x%x)",
+ "osSpTaskLoad: output_buff_size not aligned to 16 bytes (0x%x)",
+ "osSpTaskLoad: yield_data_ptr not aligned to 16 bytes (0x%x)",
+ "osProfileInit: profile counter is running, call osProfileStop before init",
+ "osProfileInit: profcnt is %d",
+ "osProfileInit: histo_base pointer must be 32-bit aligned (%x)",
+ "osProfileInit: text_start (%x) >= text_end (%x)",
+ "osProfileInit: histo_size is an illegal size (%d)",
+ "osProfileStart: microseconds is < PROF_MIN_INTERVAL (%d)",
+ "osProfileStart: profiling has already been started",
+ "osProfileStop: profiling has already been stopped",
+ "osProfileStop: no profile timer to stop",
+ "osReadHost: address not aligned to 8 bytes (0x%x)",
+ "osReadHost: size either 0 or not aligned to 4 bytes (0x%x)",
+ "osWriteHost: address not aligned to 8 bytes (0x%x)",
+ "osWriteHost: size either 0 or not aligned to 4 bytes (0x%x)",
+ "osGetTime: VI manager not yet begun by osCreateViManager",
+ "osSetTime: VI manager not yet begun by osCreateViManager",
+ "osSetTimer: VI manager not yet begun by osCreateViManager",
+ "osStopTimer: VI manager not yet begun by osCreateViManager",
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ NULSTR,
+ "_handleMIDIMsg: no sound mapped",
+ "_handleMIDIMsg: no free voices",
+ "_handleMIDIMsg: couldn't map voice",
+ "_handleMIDIMsg: note off - couldn't find voice",
+ "_handleMIDIMsg: poly pressure - couldn't find voice",
+ "_handleEvent: no free voices",
+ "Synthesizer: no free updates",
+ "alSndPDeallocate: attempt to deallocate a sound which is playing",
+ "alSndpDelete: attempt to delete player with playing sounds",
+ "alSndpPlay: attempt to play a sound which is playing",
+ "alSndpSetSound: sound id (%d) out of range (0 - %d)",
+ "alSndpSetPriority: sound id (%d) out of range (0 - %d)",
+ "alSndpSet Parameter: target (%d) out of range (0 - %d)",
+ "alBnkfNew: bank file out of date",
+ "alSeqNew: 0x%x is not a midi file",
+ "alSeqNew: 0x%x is not a type 0 midi file",
+ "alSeqNew: 0x%x has more than 1 track",
+ "alSeqNew: SMPTE delta times not supported",
+ "alSeqNew: Error parsing file 0x%x (no track header)",
+ "alSeqNextEvent: Unsupported system exclusive",
+ "alSeqNextEvent: Unsupported midi meta event 0x%x",
+ "_handleMIDIMsg: Invalid program change to %d, max instruments %d",
+ "_handleMIDIMsg: Unknown midi message 0x%x",
+ "_unmapVoice: Couldn't unmap voice 0x%x",
+ "alEvtqPostEvent: Out of free events",
+ "alHeapAlloc: Can't allocate %d bytes",
+ "alHeapCheck: Heap corrupt",
+ "alHeapCheck: Heap corrupt - first block is bad",
+ "alCSeqGetTrackEvent: Running status of zero on track %d",
+ "alCSeqGetTrackEvent: Note on velocity of zero on track %d",
+ "alCSPVoiceHandler: Stopping sequence but voice not free chan %d, key %d",
+ "alSeqNextEvent: Read past end of sequence",
+ "osAiSetNextBuffer: DMA buffer location may cause audio clicks (0x%x)",
+ "_loadOutputBuffer: Modulated delay greater than total delay by %d samples",
+ "osViExtendVStart: VI Manager not yet begun by osCreateViManager",
+ "osViExtendVStart: value not in range [0-48] %d",
+ NULSTR,
+};
+
+static void kmcErrorHandler(s16 code, s16 numArgs, ...);
+OSErrorHandler __kmcErrorHandler = kmcErrorHandler;
+
+static void kmcErrorHandler(s16 code, s16 numArgs, ...) {
+ int ans;
+ va_list ap;
+ char* fmt;
+
+ fmt = __os_error_message[code];
+ va_start(ap, numArgs);
+
+ if (__kmc_pt_mode) {
+ ans = _Printf(kmc_proutSyncPrintf, NULL, fmt, ap);
+ } else {
+ ans = _Printf(proutSyncPrintf, NULL, fmt, ap);
+ }
+
+ osSyncPrintf("\n");
+
+ va_end(ap);
+}
+
+#endif