Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HLE: Convert a lot more logging to the "automatic" parameter logging system #19890

Merged
merged 10 commits into from
Jan 19, 2025
2 changes: 1 addition & 1 deletion Common/UI/PopupScreens.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,7 @@ std::string ChoiceWithValueDisplay::ValueText() const {
}

FileChooserChoice::FileChooserChoice(RequesterToken token, std::string *value, std::string_view text, BrowseFileType fileType, LayoutParams *layoutParams)
: AbstractChoiceWithValueDisplay(text, layoutParams), value_(value), fileType_(fileType), token_(token) {
: AbstractChoiceWithValueDisplay(text, layoutParams), value_(value) {
OnClick.Add([=](UI::EventParams &) {
System_BrowseForFile(token, text_, fileType, [=](const std::string &returnValue, int) {
if (*value_ != returnValue) {
Expand Down
2 changes: 0 additions & 2 deletions Common/UI/PopupScreens.h
Original file line number Diff line number Diff line change
Expand Up @@ -430,8 +430,6 @@ class FileChooserChoice : public AbstractChoiceWithValueDisplay {

private:
std::string *value_;
BrowseFileType fileType_;
RequesterToken token_;
};

class FolderChooserChoice : public AbstractChoiceWithValueDisplay {
Expand Down
43 changes: 34 additions & 9 deletions Core/HLE/HLE.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
#include "Common/Log.h"
#include "Core/MIPS/MIPS.h"

#ifdef _MSC_VER
#pragma warning (error: 4834) // discarding return value of function with 'nodiscard' attribute
#endif

class PointerWrap;
class PSPAction;
typedef void (* HLEFunc)();
Expand Down Expand Up @@ -136,10 +140,12 @@ void hleSplitSyscallOverGe();
// Called after a split syscall from System.cpp
void hleFinishSyscallAfterGe();

[[nodiscard]]
inline int hleDelayResult(int result, const char *reason, int usec) {
return hleDelayResult((u32) result, reason, usec);
}

[[nodiscard]]
inline s64 hleDelayResult(s64 result, const char *reason, int usec) {
return hleDelayResult((u64) result, reason, usec);
}
Expand All @@ -164,6 +170,7 @@ void *GetQuickSyscallFunc(MIPSOpcode op);
void hleDoLogInternal(Log t, LogLevel level, u64 res, const char *file, int line, const char *reportTag, char retmask, const char *reason, const char *formatted_reason);

template <typename T>
[[nodiscard]]
T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char *reportTag, char retmask, const char *reason, ...) {
if ((int)level > MAX_LOGLEVEL || !GenericLogEnabled(level, t)) {
return res;
Expand Down Expand Up @@ -192,6 +199,7 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char
}

template <typename T>
[[nodiscard]]
T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char *reportTag, char retmask) {
if (((int)level > MAX_LOGLEVEL || !GenericLogEnabled(level, t)) && !reportTag) {
return res;
Expand All @@ -208,6 +216,14 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char
return res;
}

// These will become important later.
template <typename T>
[[nodiscard]]
inline T hleNoLog(T t) {
return t;
}
inline void hleNoLogVoid() {}

// This is just a quick way to force logging to be more visible for one file.
#ifdef HLE_LOG_FORCE
#define HLE_LOG_LDEBUG LNOTICE
Expand All @@ -218,22 +234,31 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char
#undef VERBOSE_LOG
#define VERBOSE_LOG DEBUG_LOG
#else
#define HLE_LOG_LDEBUG LDEBUG
#define HLE_LOG_LVERBOSE LVERBOSE
#define HLE_LOG_LDEBUG LogLevel::LDEBUG
#define HLE_LOG_LVERBOSE LogLevel::LVERBOSE
#endif

#define hleLogHelper(t, level, res, retmask, ...) hleDoLog(t, LogLevel::level, res, __FILE__, __LINE__, nullptr, retmask, ##__VA_ARGS__)
#define hleLogError(t, res, ...) hleLogHelper(t, LERROR, res, 'x', ##__VA_ARGS__)
#define hleLogWarning(t, res, ...) hleLogHelper(t, LWARNING, res, 'x', ##__VA_ARGS__)
#define hleLogDebug(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
// 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 hleLogHelper(t, level, res, retmask, ...) hleDoLog(t, level, res, __FILE__, __LINE__, nullptr, retmask, ##__VA_ARGS__)
#define hleLogError(t, res, ...) hleLogHelper(t, LogLevel::LERROR, res, 'x', ##__VA_ARGS__)
#define hleLogWarning(t, res, ...) hleLogHelper(t, LogLevel::LWARNING, res, 'x', ##__VA_ARGS__)
#define hleLogVerbose(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'x', ##__VA_ARGS__)

// If res is negative, log warn/error, otherwise log debug.
#define hleLogSuccessOrWarn(t, res, ...) hleLogHelper(t, res < 0 ? LogLevel::LWARNING : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
#define hleLogSuccessOrError(t, res, ...) hleLogHelper(t, res < 0 ? LogLevel::LERROR : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)

// NOTE: hleLogDebug is equivalent to hleLogSuccessI/X.
#define hleLogDebug(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
#define hleLogSuccessX(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
#define hleLogSuccessI(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'i', ##__VA_ARGS__)
#define hleLogSuccessInfoX(t, res, ...) hleLogHelper(t, LINFO, res, 'x', ##__VA_ARGS__)
#define hleLogSuccessInfoI(t, res, ...) hleLogHelper(t, LINFO, res, 'i', ##__VA_ARGS__)
#define hleLogSuccessInfoX(t, res, ...) hleLogHelper(t, LogLevel::LINFO, res, 'x', ##__VA_ARGS__)
#define hleLogSuccessInfoI(t, res, ...) hleLogHelper(t, LogLevel::LINFO, res, 'i', ##__VA_ARGS__)
#define hleLogSuccessVerboseX(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'x', ##__VA_ARGS__)
#define hleLogSuccessVerboseI(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'i', ##__VA_ARGS__)

#define hleReportError(t, res, ...) hleDoLog(t, LogLevel::LERROR, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)
#define hleReportWarning(t, res, ...) hleDoLog(t, LogLevel::LWARNING, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)
#define hleReportDebug(t, res, ...) hleDoLog(t, LogLevel::HLE_LOG_LDEBUG, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)
#define hleReportDebug(t, res, ...) hleDoLog(t, HLE_LOG_LDEBUG, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)
2 changes: 1 addition & 1 deletion Core/HLE/Plugins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ bool Load() {
continue;
}

int ret = KernelStartModule(module, 0, 0, 0, nullptr, nullptr);
int ret = __KernelStartModule(module, 0, 0, 0, nullptr, nullptr);
if (ret < 0) {
ERROR_LOG(Log::System, "Unable to start plugin %s: %08x", filename.c_str(), ret);
} else {
Expand Down
115 changes: 45 additions & 70 deletions Core/HLE/sceAudio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,115 +86,94 @@ void AudioChannel::clear()
// max or 50%?
static u32 sceAudioOutputBlocking(u32 chan, int vol, u32 samplePtr) {
if (vol > 0xFFFF) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputBlocking() - invalid volume");
return SCE_ERROR_AUDIO_INVALID_VOLUME;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputBlocking() - bad channel");
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
} else if (!chans[chan].reserved) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputBlocking() - channel not reserved");
return SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
} else {
DEBUG_LOG(Log::sceAudio, "sceAudioOutputBlocking(%08x, %08x, %08x)", chan, vol, samplePtr);
if (vol >= 0) {
chans[chan].leftVolume = vol;
chans[chan].rightVolume = vol;
}
chans[chan].sampleAddress = samplePtr;
return __AudioEnqueue(chans[chan], chan, true);
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
}

if (vol >= 0) {
chans[chan].leftVolume = vol;
chans[chan].rightVolume = vol;
}
chans[chan].sampleAddress = samplePtr;
return hleLogDebug(Log::sceAudio, __AudioEnqueue(chans[chan], chan, true));
}

static u32 sceAudioOutputPannedBlocking(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
int result = 0;
// For some reason, this is the only one that checks for negative.
if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputPannedBlocking() - invalid volume");
result = SCE_ERROR_AUDIO_INVALID_VOLUME;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputPannedBlocking() - bad channel");
result = SCE_ERROR_AUDIO_INVALID_CHANNEL;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
} else if (!chans[chan].reserved) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputPannedBlocking() - channel not reserved");
result = SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
} else {
if (leftvol >= 0) {
chans[chan].leftVolume = leftvol;
}
if (rightvol >= 0) {
chans[chan].rightVolume = rightvol;
}
chans[chan].sampleAddress = samplePtr;
result = __AudioEnqueue(chans[chan], chan, true);
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
}

DEBUG_LOG(Log::sceAudio, "%08x = sceAudioOutputPannedBlocking(%08x, %08x, %08x, %08x)", result, chan, leftvol, rightvol, samplePtr);
return result;

if (leftvol >= 0) {
chans[chan].leftVolume = leftvol;
}
if (rightvol >= 0) {
chans[chan].rightVolume = rightvol;
}
chans[chan].sampleAddress = samplePtr;
u32 result = __AudioEnqueue(chans[chan], chan, true);
return hleLogDebug(Log::sceAudio, result);
}

static u32 sceAudioOutput(u32 chan, int vol, u32 samplePtr) {
if (vol > 0xFFFF) {
ERROR_LOG(Log::sceAudio, "sceAudioOutput() - invalid volume");
return SCE_ERROR_AUDIO_INVALID_VOLUME;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
ERROR_LOG(Log::sceAudio, "sceAudioOutput() - bad channel");
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
} else if (!chans[chan].reserved) {
ERROR_LOG(Log::sceAudio, "sceAudioOutput(%08x, %08x, %08x) - channel not reserved", chan, vol, samplePtr);
return SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
} else {
DEBUG_LOG(Log::sceAudio, "sceAudioOutput(%08x, %08x, %08x)", chan, vol, samplePtr);
if (vol >= 0) {
chans[chan].leftVolume = vol;
chans[chan].rightVolume = vol;
}
chans[chan].sampleAddress = samplePtr;
return __AudioEnqueue(chans[chan], chan, false);
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
}

if (vol >= 0) {
chans[chan].leftVolume = vol;
chans[chan].rightVolume = vol;
}
chans[chan].sampleAddress = samplePtr;
u32 result = __AudioEnqueue(chans[chan], chan, false);
return hleLogDebug(Log::sceAudio, result);
}

static u32 sceAudioOutputPanned(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
if (leftvol > 0xFFFF || rightvol > 0xFFFF) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputPanned() - invalid volume");
return SCE_ERROR_AUDIO_INVALID_VOLUME;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputPanned() - bad channel");
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
} else if (!chans[chan].reserved) {
ERROR_LOG(Log::sceAudio, "sceAudioOutputPanned(%08x, %08x, %08x, %08x) - channel not reserved", chan, leftvol, rightvol, samplePtr);
return SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
} else {
DEBUG_LOG(Log::sceAudio, "sceAudioOutputPanned(%08x, %08x, %08x, %08x)", chan, leftvol, rightvol, samplePtr);
if (leftvol >= 0) {
chans[chan].leftVolume = leftvol;
}
if (rightvol >= 0) {
chans[chan].rightVolume = rightvol;
}
chans[chan].sampleAddress = samplePtr;
return __AudioEnqueue(chans[chan], chan, false);
u32 result = __AudioEnqueue(chans[chan], chan, false);
return hleLogDebug(Log::sceAudio, result);
}
}

static int sceAudioGetChannelRestLen(u32 chan) {
if (chan >= PSP_AUDIO_CHANNEL_MAX) {
ERROR_LOG(Log::sceAudio, "sceAudioGetChannelRestLen(%08x) - bad channel", chan);
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
}
int remainingSamples = (int)chanSampleQueues[chan].size() / 2;
VERBOSE_LOG(Log::sceAudio, "%d=sceAudioGetChannelRestLen(%08x)", remainingSamples, chan);
return remainingSamples;
return hleLogVerbose(Log::sceAudio, remainingSamples);
}

static int sceAudioGetChannelRestLength(u32 chan) {
if (chan >= PSP_AUDIO_CHANNEL_MAX) {
ERROR_LOG(Log::sceAudio, "sceAudioGetChannelRestLength(%08x) - bad channel", chan);
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
}
int remainingSamples = (int)chanSampleQueues[chan].size() / 2;
VERBOSE_LOG(Log::sceAudio, "%d=sceAudioGetChannelRestLength(%08x)", remainingSamples, chan);
return remainingSamples;
return hleLogVerbose(Log::sceAudio, remainingSamples);
}

static u32 GetFreeChannel() {
Expand Down Expand Up @@ -474,18 +453,14 @@ static u32 sceAudioSRCOutputBlocking(u32 vol, u32 buf) {

static int sceAudioInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) {
if (!Memory::IsValidAddress(bufAddr)) {
ERROR_LOG(Log::HLE, "sceAudioInputBlocking(%d, %d, %08x): invalid addresses", maxSamples, sampleRate, bufAddr);
return -1;
return hleLogError(Log::HLE, -1, "invalid address");
}

INFO_LOG(Log::HLE, "sceAudioInputBlocking: maxSamples: %d, samplerate: %d, bufAddr: %08x", maxSamples, sampleRate, bufAddr);
return __MicInput(maxSamples, sampleRate, bufAddr, AUDIOINPUT);
return hleLogSuccessInfoI(Log::HLE, __MicInput(maxSamples, sampleRate, bufAddr, AUDIOINPUT));
}

static int sceAudioInput(u32 maxSamples, u32 sampleRate, u32 bufAddr) {
if (!Memory::IsValidAddress(bufAddr)) {
ERROR_LOG(Log::HLE, "sceAudioInput(%d, %d, %08x): invalid addresses", maxSamples, sampleRate, bufAddr);
return -1;
return hleLogError(Log::HLE, -1, "invalid address");
}

ERROR_LOG(Log::HLE, "UNTEST sceAudioInput: maxSamples: %d, samplerate: %d, bufAddr: %08x", maxSamples, sampleRate, bufAddr);
Expand Down
3 changes: 1 addition & 2 deletions Core/HLE/sceCtrl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -514,8 +514,7 @@ static int sceCtrlReadBufferPositive(u32 ctrlDataPtr, u32 nBufs)
{
int done = __CtrlReadBuffer(ctrlDataPtr, nBufs, false, false);
hleEatCycles(330);
if (done != 0)
{
if (done != 0) {
DEBUG_LOG(Log::sceCtrl, "%d=sceCtrlReadBufferPositive(%08x, %i)", done, ctrlDataPtr, nBufs);
}
else
Expand Down
Loading
Loading