Fix issue with hleLogDebugOrError where the return value argument got repeated.

Not good when the argument is a function call..
This commit is contained in:
Henrik Rydgård 2025-03-05 10:27:04 +01:00
parent 5712cf93e9
commit 1f5cfe82ed
4 changed files with 28 additions and 20 deletions

View file

@ -174,7 +174,7 @@ void *GetQuickSyscallFunc(MIPSOpcode op);
void hleDoLogInternal(Log t, LogLevel level, u64 res, const char *file, int line, const char *reportTag, const char *reason, const char *formatted_reason);
template <bool leave, typename T>
template <bool leave, bool convert_code, typename T>
[[nodiscard]]
#ifdef __GNUC__
__attribute__((format(printf, 7, 8)))
@ -188,6 +188,10 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char
return res;
}
if (convert_code && (int)res >= 0) {
level = LogLevel::LDEBUG;
}
char formatted_reason[4096] = {0};
if (reasonFmt != nullptr) {
va_list args;
@ -213,7 +217,7 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char
return res;
}
template <bool leave, typename T>
template <bool leave, bool convert_code, typename T>
[[nodiscard]]
NO_INLINE
T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char *reportTag) {
@ -224,6 +228,10 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char
return res;
}
if (convert_code && (int)res >= 0) {
level = LogLevel::LDEBUG;
}
u64 fmtRes = res;
if (std::is_floating_point<T>::value) {
// We reinterpret as the bits for now, so we can have a common helper.
@ -283,18 +291,17 @@ inline R hleCallImpl(std::string_view module, std::string_view funcName, F func,
// IMPORTANT: These *must* only be used directly in HLE functions. They cannot be used by utility functions
// called by them. Use regular ERROR_LOG etc for those.
#define hleLogReturnHelper(t, level, res, ...) \
(((int)level <= MAX_LOGLEVEL) ? hleDoLog<true>(t, level, (res), __FILE__, __LINE__, nullptr, ##__VA_ARGS__) : (res))
#define hleLogReturnHelper(convert, t, level, res, ...) \
(((int)level <= MAX_LOGLEVEL) ? hleDoLog<true, convert>(t, level, (res), __FILE__, __LINE__, nullptr, ##__VA_ARGS__) : (res))
#define hleLogError(t, res, ...) hleLogReturnHelper(t, LogLevel::LERROR, res, ##__VA_ARGS__)
#define hleLogWarning(t, res, ...) hleLogReturnHelper(t, LogLevel::LWARNING, res, ##__VA_ARGS__)
#define hleLogDebug(t, res, ...) hleLogReturnHelper(t, HLE_LOG_LDEBUG, res, ##__VA_ARGS__)
#define hleLogInfo(t, res, ...) hleLogReturnHelper(t, LogLevel::LINFO, res, ##__VA_ARGS__)
#define hleLogVerbose(t, res, ...) hleLogReturnHelper(t, HLE_LOG_LVERBOSE, res, ##__VA_ARGS__)
#define hleLogError(t, res, ...) hleLogReturnHelper(false, t, LogLevel::LERROR, res, ##__VA_ARGS__)
#define hleLogWarning(t, res, ...) hleLogReturnHelper(false, t, LogLevel::LWARNING, res, ##__VA_ARGS__)
#define hleLogDebug(t, res, ...) hleLogReturnHelper(false, t, HLE_LOG_LDEBUG, res, ##__VA_ARGS__)
#define hleLogInfo(t, res, ...) hleLogReturnHelper(false, t, LogLevel::LINFO, res, ##__VA_ARGS__)
#define hleLogVerbose(t, res, ...) hleLogReturnHelper(false, t, HLE_LOG_LVERBOSE, res, ##__VA_ARGS__)
// If res is negative, log warn/error, otherwise log debug.
#define hleLogDebugOrWarn(t, res, ...) hleLogReturnHelper(t, ((int)res < 0 ? LogLevel::LWARNING : HLE_LOG_LDEBUG), res, ##__VA_ARGS__)
#define hleLogDebugOrError(t, res, ...) hleLogReturnHelper(t, ((int)res < 0 ? LogLevel::LERROR : HLE_LOG_LDEBUG), res, ##__VA_ARGS__)
#define hleLogDebugOrWarn(t, res, ...) hleLogReturnHelper(true, t, LogLevel::LWARNING, res, ##__VA_ARGS__)
#define hleLogDebugOrError(t, res, ...) hleLogReturnHelper(true, t, LogLevel::LERROR, res, ##__VA_ARGS__)
#define hleReportError(t, res, ...) hleDoLog<true>(t, LogLevel::LERROR, res, __FILE__, __LINE__, "", ##__VA_ARGS__)
#define hleReportWarning(t, res, ...) hleDoLog<true>(t, LogLevel::LWARNING, res, __FILE__, __LINE__, "", ##__VA_ARGS__)
#define hleReportError(t, res, ...) hleDoLog<true, false>(t, LogLevel::LERROR, res, __FILE__, __LINE__, "", ##__VA_ARGS__)
#define hleReportWarning(t, res, ...) hleDoLog<true, false>(t, LogLevel::LWARNING, res, __FILE__, __LINE__, "", ##__VA_ARGS__)

View file

@ -75,8 +75,9 @@ static int sceKernelCreateHeap(int partitionId, int size, int flags, const char
static int sceKernelAllocHeapMemory(int heapId, int size) {
u32 error;
KernelHeap *heap = kernelObjects.Get<KernelHeap>(heapId, error);
if (!heap)
if (!heap) {
return hleLogError(Log::sceKernel, error, "invalid heapId");
}
// There's 8 bytes at the end of every block, reserved.
u32 memSize = KERNEL_HEAP_BLOCK_HEADER_SIZE + size;

View file

@ -2173,10 +2173,9 @@ u32 sceKernelLoadModule(const char *name, u32 flags, u32 optionAddr) {
return hleDelayResult(hleNoLog(module->GetUID()), "module loaded", 500);
}
static u32 sceKernelLoadModuleNpDrm(const char *name, u32 flags, u32 optionAddr)
{
// TODO: Handle recursive syscall properly
return hleLogDebugOrError(Log::Loader, sceKernelLoadModule(name, flags, optionAddr));
static u32 sceKernelLoadModuleNpDrm(const char *name, u32 flags, u32 optionAddr) {
// Just forward it, same parameters so the logging will make sense.
return sceKernelLoadModule(name, flags, optionAddr);
}
int __KernelStartModule(SceUID moduleId, u32 argsize, u32 argAddr, u32 returnValueAddr, SceKernelSMOption *smoption, bool *needsWait) {

View file

@ -358,7 +358,8 @@ u32 GPUCommon::EnqueueList(u32 listpc, u32 stall, int subIntrBase, PSPPointer<Ps
// If args->size is below 16, it's the old struct without stack info.
if (args.IsValid() && args->size >= 16 && args->numStacks >= 256) {
return hleLogError(Log::G3D, SCE_KERNEL_ERROR_INVALID_SIZE, "invalid stack depth %d", args->numStacks);
ERROR_LOG(Log::G3D, "invalid stack depth %d", args->numStacks);
return SCE_KERNEL_ERROR_INVALID_SIZE;
}
int id = -1;