Match JUTException

This commit is contained in:
SwareJonge
2025-06-17 22:09:34 +02:00
parent 22e1bfab3a
commit 06da04110e
9 changed files with 409 additions and 148 deletions
+1 -1
View File
@@ -670,7 +670,7 @@ config.libs = [
Object(Matching, "JSystem/JUtility/JUTDbPrint.cpp"),
Object(Matching, "JSystem/JUtility/JUTDirectFile.cpp"),
Object(Matching, "JSystem/JUtility/JUTDirectPrint.cpp"),
Object(NonMatching, "JSystem/JUtility/JUTException.cpp"),
Object(Matching, "JSystem/JUtility/JUTException.cpp"),
Object(Matching, "JSystem/JUtility/JUTFader.cpp"),
Object(Matching, "JSystem/JUtility/JUTFont.cpp"),
Object(Matching, "JSystem/JUtility/JUTFontData_Ascfont_fix12.s"),
+6 -6
View File
@@ -128,8 +128,9 @@ public:
};
JKRArchive(s32, EMountMode);
virtual ~JKRArchive(); // _08
private:
~JKRArchive();
public: // _08
virtual bool becomeCurrent(const char*); // _10
virtual void* getResource(const char* path); // _14
virtual void* getResource(u32 type, const char* name); // _18
@@ -161,12 +162,11 @@ public:
static JKRArchive* mount(void*, JKRHeap*, EMountDirection);
static JKRArchive* mount(s32, EMountMode, JKRHeap*, EMountDirection);
static void* getGlbResource(u32 type, const char* name, JKRArchive* archive);
// Unused/inlined:
JKRArchive();
JKRArchive(const char* p1, EMountMode mountMode);
static JKRArchive* check_mount_already(s32);
static JKRArchive* check_mount_already(s32, JKRHeap*);
JKRArchive();
JKRArchive(const char* p1, EMountMode mountMode);
SDIDirEntry* findResType(u32) const;
SDIFileEntry* findTypeResource(u32, u32) const;
+6 -9
View File
@@ -17,11 +17,9 @@ enum ExPrintFlags
{
EXPRINTFLAG_GPR = 0x1,
EXPRINTFLAG_GPRMap = 0x2,
EXPRINTFLAG_SRR0Map = 0x4,
EXPRINTFLAG_Float = 0x8,
EXPRINTFLAG_Stack = 0x10,
EXPRINTFLAG_All = 0x1F,
EXPRINTFLAG_Float = 0x4,
EXPRINTFLAG_Stack = 0x8,
EXPRINTFLAG_All = 0xF,
};
/**
@@ -35,7 +33,7 @@ struct JUTException : public JKRThread
INFOPAGE_Float = 2,
INFOPAGE_Stack = 3,
INFOPAGE_GPRMap = 4,
INFOPAGE_SRR0Map = 5,
};
// size: 0x14
@@ -102,7 +100,7 @@ struct JUTException : public JKRThread
void showGPR(OSContext *);
void showSRR0Map(OSContext *);
bool isEnablePad() const;
u32 getFpscr();
static u32 getFpscr();
void setFpscr(u32);
void enableFpuException();
void disableFpuException();
@@ -129,7 +127,7 @@ struct JUTException : public JKRThread
static JUTErrorHandler sPostUserCallback;
static u32 msr;
static u32 fpscr;
static const char *sCpuExpName[32];
static const char *sCpuExpName[16];
static JSUList<JUTExMapFile> sMapFileList;
// _00 = VTBL
@@ -143,7 +141,6 @@ struct JUTException : public JKRThread
u32 mTraceSuppress; // _94
u32 _98; // _98
u32 mPrintFlags; // _9C, see ExPrintFlags enum
u32 mStackPointer; // _A0
};
#endif
+1 -1
View File
@@ -93,7 +93,7 @@ public:
void clearForReset();
static void init();
void initList();
void read();
static void read();
static bool recalibrate(u32);
void setButtonRepeat(u32, u32, u32);
void update();
+92
View File
@@ -0,0 +1,92 @@
#ifndef _MSL_COMMON_FLOAT_H
#define _MSL_COMMON_FLOAT_H
#include "MSL_C/MSL_Common_Embedded/Math/fdlibm.h"
#define FP_SNAN 0
#define FP_QNAN 1
#define FP_INFINITE 2
#define FP_ZERO 3
#define FP_NORMAL 4
#define FP_SUBNORMAL 5
#define FP_NAN FP_QNAN
#define fpclassify(x) \
((sizeof(x) == sizeof(float)) ? __fpclassifyf(x) : __fpclassifyd(x))
#define signbit(x) \
((sizeof(x) == sizeof(float)) ? __signbitf(x) : __signbitd(x))
#define isfinite(x) ((fpclassify(x) > 2))
#define isnan(x) ((fpclassify(x) == FP_NAN))
#define isinf(x) ((fpclassify(x) == FP_INFINITE))
#define __signbitf(x) ((int)(__HI(x) & 0x80000000))
// TODO: OK?
#define __signbitd(x) ((int)(__HI(x) & 0x80000000))
extern unsigned long __float_nan[];
extern unsigned long __float_huge[];
extern unsigned long __float_max[];
extern unsigned long __float_epsilon[];
inline int __fpclassifyf(float __value)
{
unsigned long integer = *(unsigned long*)&__value;
switch (integer & 0x7f800000) {
case 0x7f800000:
if ((integer & 0x7fffff) != 0) {
return FP_QNAN;
}
return FP_INFINITE;
case 0:
if ((integer & 0x7fffff) != 0) {
return FP_SUBNORMAL;
}
return FP_ZERO;
}
return FP_NORMAL;
}
inline int __fpclassifyd(double __value)
{
switch (__HI(__value) & 0x7ff00000) {
case 0x7ff00000: {
if ((__HI(__value) & 0x000fffff) || (__LO(__value) & 0xffffffff))
return FP_QNAN;
else
return FP_INFINITE;
break;
}
case 0: {
if ((__HI(__value) & 0x000fffff) || (__LO(__value) & 0xffffffff))
return FP_SUBNORMAL;
else
return FP_ZERO;
break;
}
}
return FP_NORMAL;
}
#define FLT_MANT_DIG 24
#define FLT_DIG 6
#define FLT_MIN_EXP (-125)
#define FLT_MIN_10_EXP (-37)
#define FLT_MAX_EXP 128
#define FLT_MAX_10_EXP 38
//#define FLT_MAX 3.40282346638528860e+38f
#define FLT_EPSILON 1.1920928955078125e-07f
#define DBL_MANT_DIG 53
#define DBL_DIG 15
#define DBL_MIN_EXP (-1021)
#define DBL_MIN_10_EXP (-308)
#define DBL_MAX_EXP 1024
#define DBL_MAX_10_EXP 308
#endif /* _MSL_COMMON_FLOAT_H */
@@ -0,0 +1,234 @@
#ifndef _FDLIBM_H
#define _FDLIBM_H
/* @(#)fdlibm.h 1.5 04/04/22 */
/**
* ====================================================
* Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#ifdef __cplusplus
extern "C" {
#endif // ifdef __cplusplus
/* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly
but these catch some common cases. */
#if defined(i386) || defined(i486) || defined(intel) || defined(x86) \
|| defined(i86pc) || defined(__alpha) || defined(__osf__)
#define __LITTLE_ENDIAN
#endif
#ifdef __LITTLE_ENDIAN
#define __HI(x) *(1 + (int*)&x)
#define __LO(x) *(int*)&x
#define __HIp(x) *(1 + (int*)x)
#define __LOp(x) *(int*)x
#else
#define __HI(x) *(int*)&x
#define __LO(x) *(1 + (int*)&x)
#define __HIp(x) *(int*)x
#define __LOp(x) *(1 + (int*)x)
#endif
// NOTE: should be enabled according to w_atan2.c
#define _IEEE_LIBM
// TODO: should __STDC__ actually be defined?
// #ifdef __STDC__
#define __P(p) p
// #else
// #define __P(p) ()
// #endif
/**
* ANSI/POSIX
*/
extern int signgam;
#define MAXFLOAT ((f32)3.40282346638528860e+38)
enum fdversion { fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix };
#define _LIB_VERSION_TYPE enum fdversion
#define _LIB_VERSION _fdlib_version
/* if global variable _LIB_VERSION is not desirable, one may
* change the following to be a constant by:
* #define _LIB_VERSION_TYPE const enum version
* In that case, after one initializes the value _LIB_VERSION (see
* s_lib_version.c) during compile time, it cannot be modified
* in the middle of a program
*/
extern _LIB_VERSION_TYPE _LIB_VERSION;
#define _IEEE_ fdlibm_ieee
#define _SVID_ fdlibm_svid
#define _XOPEN_ fdlibm_xopen
#define _POSIX_ fdlibm_posix
struct exception {
int type;
char* name;
double arg1;
double arg2;
double retval;
};
#define HUGE MAXFLOAT
/**
* set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
* (one may replace the following line by "#include <values.h>")
*/
#define X_TLOSS 1.41484755040568800000e+16
#define DOMAIN 1
#define SING 2
#define OVERFLOW 3
#define UNDERFLOW 4
#define TLOSS 5
#define PLOSS 6
/**
* ANSI/POSIX
*/
extern double acos __P((double));
extern double asin __P((double));
extern double atan __P((double));
extern double atan2 __P((double, double));
extern double cos __P((double));
extern double sin __P((double));
extern double tan __P((double));
extern double cosh __P((double));
extern double sinh __P((double));
extern double tanh __P((double));
extern double exp __P((double));
extern double frexp __P((double, int*));
extern double ldexp __P((double, int));
extern double scalbn __P((double, int));
extern double log __P((double));
extern double log10 __P((double));
extern double modf __P((double, double*));
extern double pow __P((double, double));
extern double sqrt __P((double));
extern double ceil __P((double));
extern double fabs __P((double));
// NOTE: I have no idea how they got it to mangle like this
extern double fabs__Fd(double);
extern double floor __P((double));
extern double fmod __P((double, double));
extern double erf __P((double));
extern double erfc __P((double));
extern double gamma __P((double));
extern double hypot __P((double, double));
extern int isnan __P((double));
extern int finite __P((double));
extern double j0 __P((double));
extern double j1 __P((double));
extern double jn __P((int, double));
extern double lgamma __P((double));
extern double y0 __P((double));
extern double y1 __P((double));
extern double yn __P((int, double));
extern double acosh __P((double));
extern double asinh __P((double));
extern double atanh __P((double));
extern double cbrt __P((double));
extern double logb __P((double));
extern double nextafter __P((double, double));
extern double remainder __P((double, double));
#ifdef _SCALB_INT
extern double scalb __P((double, int));
#else
extern double scalb __P((double, double));
#endif
extern int matherr __P((struct exception*));
/**
* IEEE Test Vector
*/
extern double significand __P((double));
/**
* Functions callable from C, intended to support IEEE arithmetic.
*/
extern double copysign __P((double, double));
extern int ilogb __P((double));
extern double rint __P((double));
extern double scalbn __P((double, int));
/**
* BSD math library entry points
*/
extern double expm1 __P((double));
extern double log1p __P((double));
/**
* Reentrant version of gamma & lgamma; passes signgam back by reference
* as the second argument; user must allocate space for signgam.
*/
#ifdef _REENTRANT
extern double gamma_r __P((double, int*));
extern double lgamma_r __P((double, int*));
#endif /* _REENTRANT */
/* ieee style elementary functions */
extern double __ieee754_sqrt __P((double));
extern double __ieee754_acos __P((double));
extern double __ieee754_acosh __P((double));
extern double __ieee754_log __P((double));
extern double __ieee754_atanh __P((double));
extern double __ieee754_asin __P((double));
extern double __ieee754_atan2 __P((double, double));
extern double __ieee754_exp __P((double));
extern double __ieee754_cosh __P((double));
extern double __ieee754_fmod __P((double, double));
extern double __ieee754_pow __P((double, double));
extern double __ieee754_lgamma_r __P((double, int*));
extern double __ieee754_gamma_r __P((double, int*));
extern double __ieee754_lgamma __P((double));
extern double __ieee754_gamma __P((double));
extern double __ieee754_log10 __P((double));
extern double __ieee754_sinh __P((double));
extern double __ieee754_hypot __P((double, double));
extern double __ieee754_j0 __P((double));
extern double __ieee754_j1 __P((double));
extern double __ieee754_y0 __P((double));
extern double __ieee754_y1 __P((double));
extern double __ieee754_jn __P((int, double));
extern double __ieee754_yn __P((int, double));
extern double __ieee754_remainder __P((double, double));
extern int __ieee754_rem_pio2 __P((double, double*));
#ifdef _SCALB_INT
extern double __ieee754_scalb __P((double, int));
#else
extern double __ieee754_scalb __P((double, double));
#endif
/* fdlibm kernel function */
extern double __kernel_standard __P((double, double, int));
extern double __kernel_sin __P((double, double, int));
extern double __kernel_cos __P((double, double));
extern double __kernel_tan __P((double, double, int));
extern int __kernel_rem_pio2 __P((double*, double*, int, int, int, const int*));
#ifdef __cplusplus
};
#endif // ifdef __cplusplus
#endif
+4 -7
View File
@@ -1,6 +1,8 @@
#ifndef W_MATH_H
#define W_MATH_H
#include "MSL_C/MSL_Common/float.h"
#ifndef BUGFIXES
#define SQRTF_LINKAGE extern
#else
@@ -47,11 +49,6 @@ inline float fabsf(float x) {
return (float)fabs((double)x);
}
int __float_huge[];
int __float_nan[];
int __double_huge[];
int __extended_huge[];
#define INFINITY (*(float*)__float_huge)
#define NAN (*(float*)__float_nan)
#define HUGE_VALF (*(float*)__float_huge)
@@ -76,8 +73,8 @@ extern inline double sqrt(double x) {
extern "C" {
#endif
double atan2(double, double);
double acos(float);
//double atan2(double, double);
//double acos(float);
#ifdef __cplusplus
}
@@ -33,11 +33,6 @@ JKRArchive::JKRArchive(s32 entryNum, JKRArchive::EMountMode mountMode)
}
}
JKRArchive::JKRArchive(const char* p1, JKRArchive::EMountMode mountMode)
{
// UNUSED FUNCTION
}
JKRArchive::~JKRArchive() {}
bool JKRArchive::isSameName(JKRArchive::CArcName& archiveName,
+65 -119
View File
@@ -1,7 +1,9 @@
#include "MSL_C/MSL_Common/float.h"
#include <dolphin/base/PPCArch.h>
#include <dolphin/gx.h>
#include <dolphin/os.h>
#include "MSL_C/w_math.h"
#include "MSL_C/printf.h"
#include "libc/string.h"
@@ -9,25 +11,19 @@
#include "JSystem/JUtility/JUTDirectPrint.h"
#include "JSystem/JUtility/JUTDirectFile.h"
extern long __fpclassifyf(float x);
long __fpclassifyd(double x);
#define fpclassify(x) (sizeof(x) == sizeof(float) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x)))
#define isinf(x) ((fpclassify(x) == 2))
#define isnan(x) ((fpclassify(x) == 1))
#define isfinite(x) ((fpclassify(x) > 2))
struct CallbackObject
{
JUTErrorHandler callback;
u16 error;
OSContext *context;
OSContext* context;
u32 dsisr;
u32 dar;
};
void search_name_part(u8 *, u8 *, int);
void *JUTException::sMessageBuffer[1] = { nullptr};
OSMessageQueue JUTException::sMessageQueue = {};
static OSTime c3bcnt[4] = {0, 0, 0, 0};
const char *JUTException::sCpuExpName[] = {
@@ -46,8 +42,7 @@ const char *JUTException::sCpuExpName[] = {
"BREAK POINT",
"SYSTEM INTERRUPT",
"THERMAL INTERRUPT",
"PROTECTION",
"FLOATING POINT"
"PROTECTION"
};
JUTException *JUTException::sErrorManager;
@@ -59,31 +54,10 @@ u32 JUTException::sConsoleBufferSize;
JUTConsole *JUTException::sConsole;
u32 JUTException::msr;
u32 JUTException::fpscr;
void *JUTException::sMessageBuffer[1] = { nullptr};
JSUList<JUTException::JUTExMapFile> JUTException::sMapFileList(false);
JUTException::JUTException(JUTDirectPrint *directPrint) :JKRThread(0x4000, 0x10, 0) {
mDirectPrint = directPrint;
OSSetErrorHandler(OS_ERROR_DSI, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_ISI, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_PROGRAM, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_ALIGNMENT, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_PROTECTION, (OSErrorHandler)errorHandler);
setFPException(0);
sPreUserCallback = nullptr;
sPostUserCallback = nullptr;
mGamePad = nullptr;
mPadPort = JUTGamePad::Port_Invalid;
mPrintWaitTime0 = 10;
mPrintWaitTime1 = 10;
mTraceSuppress = 0xffffffff;
_98 = 0;
mPrintFlags = EXPRINTFLAG_All;
}
JUTException *JUTException::create(JUTDirectPrint *directPrint) {
if(sErrorManager == nullptr) {
sErrorManager = new (JKRGetSystemHeap(), 0) JUTException(directPrint);
@@ -107,11 +81,8 @@ void *JUTException::run()
u32 dsisr = cb->dsisr;
u32 dar = cb->dar;
if (error < OS_ERROR_MAX)
mStackPointer = context->gpr[1];
if (mFrameMemory == nullptr)
mFrameMemory = (JUTExternalFB*)sErrorManager->mDirectPrint->getFrameBuffer();
if (!sErrorManager->mDirectPrint->getFrameBuffer())
sErrorManager->createFB();
if (callback)
@@ -123,10 +94,30 @@ void *JUTException::run()
}
}
JUTException::JUTException(JUTDirectPrint *directPrint) : JKRThread(0x4000, 0x10, 0) {
mDirectPrint = directPrint;
OSSetErrorHandler(OS_ERROR_DSI, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_ISI, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_PROGRAM, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_ALIGNMENT, (OSErrorHandler)errorHandler);
OSSetErrorHandler(OS_ERROR_PROTECTION, (OSErrorHandler)errorHandler);
sPreUserCallback = nullptr;
sPostUserCallback = nullptr;
mGamePad = nullptr;
mPadPort = JUTGamePad::Port_Invalid;
mPrintWaitTime0 = 10;
mPrintWaitTime1 = 10;
mTraceSuppress = 0xffffffff;
_98 = 0;
mPrintFlags = 0xff;
}
void JUTException::errorHandler(OSError error, OSContext *context, u32 dsisr, u32 dar)
{
msr = PPCMfmsr();
fpscr = context->fpscr;
fpscr = getFpscr();
OSFillFPUContext(context);
OSSetErrorHandler(error, nullptr);
if (error == OS_ERROR_PROTECTION)
@@ -148,19 +139,6 @@ void JUTException::errorHandler(OSError error, OSContext *context, u32 dsisr, u3
OSYieldThread();
}
void JUTException::setFPException(u32 fpscr_enable_bits)
{
__OSFpscrEnableBits = fpscr_enable_bits;
if (fpscr_enable_bits)
{
OSSetErrorHandler(OS_ERROR_FPE, (OSErrorHandler)errorHandler);
}
else
{
OSSetErrorHandler(OS_ERROR_FPE, nullptr);
}
}
void JUTException::showFloatSub(int index, f32 value)
{
if (isnan(value))
@@ -280,25 +258,26 @@ void JUTException::showStack(OSContext *context)
}
u32 i;
u32* stackPointer;
sConsole->print("-------------------------------- TRACE\n");
u32 *stackPointer = (u32 *)mStackPointer;
sConsole->print_f("Address: BackChain LR save\n");
for (i = 0; (stackPointer != nullptr) && (stackPointer != (u32 *)0xFFFFFFFF) && (i++ < 0x10);)
{
if (i > mTraceSuppress)
{
sConsole->print("Suppress trace.\n");
return;
}
for (i = 0, stackPointer = (u32*)context->gpr[1];
(stackPointer != nullptr) && (stackPointer != (u32*)0xFFFFFFFF)
&& (i++ < 0x10);) {
if (i > mTraceSuppress) {
sConsole->print("Suppress trace.\n");
return;
}
sConsole->print_f("%08X: %08X %08X\n", stackPointer, stackPointer[0], stackPointer[1]);
showMapInfo_subroutine(stackPointer[1], false);
JUTConsoleManager::getManager()->drawDirect(true);
waitTime(mPrintWaitTime1);
stackPointer = (u32 *)stackPointer[0];
}
sConsole->print_f("%08X: %08X %08X\n", stackPointer,
stackPointer[0], stackPointer[1]);
showMapInfo_subroutine(stackPointer[1], false);
JUTConsoleManager* manager = JUTConsoleManager::sManager;
manager->drawDirect(true);
waitTime(mPrintWaitTime1);
stackPointer = (u32*)stackPointer[0];
}
}
void JUTException::showMainInfo(u16 error, OSContext *context, u32 dsisr, u32 dar)
@@ -420,26 +399,6 @@ void JUTException::showGPRMap(OSContext *context)
}
}
void JUTException::showSRR0Map(OSContext *context)
{
if (!sConsole)
{
return;
}
sConsole->print("-------------------------------- SRR0MAP\n");
u32 address = context->srr0;
if (address >= 0x80000000 && 0x83000000 - 1 >= address)
{
sConsole->print_f("SRR0: %08XH", address);
if (showMapInfo_subroutine(address, true) == false)
{
sConsole->print(" no information\n");
}
JUTConsoleManager::getManager()->drawDirect(true);
}
}
void JUTException::printDebugInfo(JUTException::EInfoPage page, OSError error, OSContext *context, u32 param_3, u32 param_4)
{
switch (page)
@@ -457,8 +416,6 @@ void JUTException::printDebugInfo(JUTException::EInfoPage page, OSError error, O
return showStack(context);
case INFOPAGE_GPRMap:
return showGPRMap(context);
case INFOPAGE_SRR0Map:
return showSRR0Map(context);
}
}
@@ -494,7 +451,7 @@ bool JUTException::readPad(u32 *out_trigger, u32 *out_button)
JUTGamePad gamePad1(JUTGamePad::Port2);
JUTGamePad gamePad2(JUTGamePad::Port3);
JUTGamePad gamePad3(JUTGamePad::Port4);
//JUTGamePad::read();
JUTGamePad::read();
c3bcnt[0] =
(gamePad0.isPushing3ButtonReset() ? (c3bcnt[0] != 0 ? c3bcnt[0] : OSGetTime()) : 0);
@@ -538,7 +495,7 @@ bool JUTException::readPad(u32 *out_trigger, u32 *out_button)
OSTime resetTime = (gamePadTime != 0) ? (OSGetTime() - gamePadTime) : 0;
gamePad.checkResetCallback(resetTime);
//JUTGamePad::read();
JUTGamePad::read();
if (out_trigger)
{
*out_trigger = gamePad.getTrigger();
@@ -552,7 +509,7 @@ bool JUTException::readPad(u32 *out_trigger, u32 *out_button)
}
else if (mGamePad)
{
//JUTGamePad::read();
JUTGamePad::read();
if (out_trigger)
{
*out_trigger = mGamePad->getTrigger();
@@ -575,20 +532,14 @@ void JUTException::printContext(OSError error, OSContext *context, u32 dsisr, u3
{
return;
}
VISetPreRetraceCallback(nullptr);
VISetPostRetraceCallback(nullptr);
VISetBlack(FALSE);
VIFlush();
if (!sConsole)
{
return;
}
if(error < OS_ERROR_MAX)
sConsole->print_f("******** EXCEPTION OCCURRED! ********\nFrameMemory:%XH\n", getFrameMemory());
else
sConsole->print_f("******** USER HALT ********\nFrameMemory:%XH\n", getFrameMemory());
sConsole->print_f("******** EXCEPTION OCCURRED! ********\nFrameMemory:%XH\n",
getFrameMemory());
int post_callback_executed = false;
while (true)
@@ -604,12 +555,6 @@ void JUTException::printContext(OSError error, OSContext *context, u32 dsisr, u3
JUTConsoleManager::sManager->drawDirect(true);
waitTime(mPrintWaitTime0);
}
if ((mPrintFlags & EXPRINTFLAG_SRR0Map) != 0)
{
printDebugInfo(INFOPAGE_SRR0Map, error, context, dsisr, dar);
JUTConsoleManager::sManager->drawDirect(true);
waitTime(mPrintWaitTime0);
}
if ((mPrintFlags & EXPRINTFLAG_GPRMap) != 0)
{
printDebugInfo(INFOPAGE_GPRMap, error, context, dsisr, dar);
@@ -786,19 +731,20 @@ void JUTException::createFB()
mFrameMemory = (JUTExternalFB *)object;
}
u32 JUTException::getFpscr() {
// TODO: misses stack frame
register u32 ret;
asm {
mfmsr r5
ori r5, r5, 0x2000
mtmsr r5
isync
mffs f1
stfd f1, 8(r1)
lwz ret, 12(r1)
}
return ret;
asm u32 JUTException::getFpscr() { // TODO: figure out if this is possible with asm
// clang-format off
fralloc
mfmsr r5
ori r5, r5, 0x2000
mtmsr r5
isync
mffs f1
stfd f1, 8(r1)
lwz r3, 12(r1)
frfree
blr
// clang-format on
}
JUTErrorHandler JUTException::setPreUserCallback(JUTErrorHandler callback)