Skip to content

Commit b92d822

Browse files
authored
Merge pull request #19890 from hrydgard/hle-prepare-recursion
HLE: Convert a lot more logging to the "automatic" parameter logging system
2 parents e2c9376 + 86b3ead commit b92d822

29 files changed

+555
-825
lines changed

Common/UI/PopupScreens.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ std::string ChoiceWithValueDisplay::ValueText() const {
692692
}
693693

694694
FileChooserChoice::FileChooserChoice(RequesterToken token, std::string *value, std::string_view text, BrowseFileType fileType, LayoutParams *layoutParams)
695-
: AbstractChoiceWithValueDisplay(text, layoutParams), value_(value), fileType_(fileType), token_(token) {
695+
: AbstractChoiceWithValueDisplay(text, layoutParams), value_(value) {
696696
OnClick.Add([=](UI::EventParams &) {
697697
System_BrowseForFile(token, text_, fileType, [=](const std::string &returnValue, int) {
698698
if (*value_ != returnValue) {

Common/UI/PopupScreens.h

-2
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,6 @@ class FileChooserChoice : public AbstractChoiceWithValueDisplay {
430430

431431
private:
432432
std::string *value_;
433-
BrowseFileType fileType_;
434-
RequesterToken token_;
435433
};
436434

437435
class FolderChooserChoice : public AbstractChoiceWithValueDisplay {

Core/HLE/HLE.h

+34-9
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
#include "Common/Log.h"
2626
#include "Core/MIPS/MIPS.h"
2727

28+
#ifdef _MSC_VER
29+
#pragma warning (error: 4834) // discarding return value of function with 'nodiscard' attribute
30+
#endif
31+
2832
class PointerWrap;
2933
class PSPAction;
3034
typedef void (* HLEFunc)();
@@ -136,10 +140,12 @@ void hleSplitSyscallOverGe();
136140
// Called after a split syscall from System.cpp
137141
void hleFinishSyscallAfterGe();
138142

143+
[[nodiscard]]
139144
inline int hleDelayResult(int result, const char *reason, int usec) {
140145
return hleDelayResult((u32) result, reason, usec);
141146
}
142147

148+
[[nodiscard]]
143149
inline s64 hleDelayResult(s64 result, const char *reason, int usec) {
144150
return hleDelayResult((u64) result, reason, usec);
145151
}
@@ -164,6 +170,7 @@ void *GetQuickSyscallFunc(MIPSOpcode op);
164170
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);
165171

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

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

219+
// These will become important later.
220+
template <typename T>
221+
[[nodiscard]]
222+
inline T hleNoLog(T t) {
223+
return t;
224+
}
225+
inline void hleNoLogVoid() {}
226+
211227
// This is just a quick way to force logging to be more visible for one file.
212228
#ifdef HLE_LOG_FORCE
213229
#define HLE_LOG_LDEBUG LNOTICE
@@ -218,22 +234,31 @@ T hleDoLog(Log t, LogLevel level, T res, const char *file, int line, const char
218234
#undef VERBOSE_LOG
219235
#define VERBOSE_LOG DEBUG_LOG
220236
#else
221-
#define HLE_LOG_LDEBUG LDEBUG
222-
#define HLE_LOG_LVERBOSE LVERBOSE
237+
#define HLE_LOG_LDEBUG LogLevel::LDEBUG
238+
#define HLE_LOG_LVERBOSE LogLevel::LVERBOSE
223239
#endif
224240

225-
#define hleLogHelper(t, level, res, retmask, ...) hleDoLog(t, LogLevel::level, res, __FILE__, __LINE__, nullptr, retmask, ##__VA_ARGS__)
226-
#define hleLogError(t, res, ...) hleLogHelper(t, LERROR, res, 'x', ##__VA_ARGS__)
227-
#define hleLogWarning(t, res, ...) hleLogHelper(t, LWARNING, res, 'x', ##__VA_ARGS__)
228-
#define hleLogDebug(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
241+
// IMPORTANT: These *must* only be used directly in HLE functions. They cannot be used by utility functions
242+
// called by them. Use regular ERROR_LOG etc for those.
243+
244+
#define hleLogHelper(t, level, res, retmask, ...) hleDoLog(t, level, res, __FILE__, __LINE__, nullptr, retmask, ##__VA_ARGS__)
245+
#define hleLogError(t, res, ...) hleLogHelper(t, LogLevel::LERROR, res, 'x', ##__VA_ARGS__)
246+
#define hleLogWarning(t, res, ...) hleLogHelper(t, LogLevel::LWARNING, res, 'x', ##__VA_ARGS__)
229247
#define hleLogVerbose(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'x', ##__VA_ARGS__)
248+
249+
// If res is negative, log warn/error, otherwise log debug.
250+
#define hleLogSuccessOrWarn(t, res, ...) hleLogHelper(t, res < 0 ? LogLevel::LWARNING : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
251+
#define hleLogSuccessOrError(t, res, ...) hleLogHelper(t, res < 0 ? LogLevel::LERROR : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
252+
253+
// NOTE: hleLogDebug is equivalent to hleLogSuccessI/X.
254+
#define hleLogDebug(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
230255
#define hleLogSuccessX(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__)
231256
#define hleLogSuccessI(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'i', ##__VA_ARGS__)
232-
#define hleLogSuccessInfoX(t, res, ...) hleLogHelper(t, LINFO, res, 'x', ##__VA_ARGS__)
233-
#define hleLogSuccessInfoI(t, res, ...) hleLogHelper(t, LINFO, res, 'i', ##__VA_ARGS__)
257+
#define hleLogSuccessInfoX(t, res, ...) hleLogHelper(t, LogLevel::LINFO, res, 'x', ##__VA_ARGS__)
258+
#define hleLogSuccessInfoI(t, res, ...) hleLogHelper(t, LogLevel::LINFO, res, 'i', ##__VA_ARGS__)
234259
#define hleLogSuccessVerboseX(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'x', ##__VA_ARGS__)
235260
#define hleLogSuccessVerboseI(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'i', ##__VA_ARGS__)
236261

237262
#define hleReportError(t, res, ...) hleDoLog(t, LogLevel::LERROR, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)
238263
#define hleReportWarning(t, res, ...) hleDoLog(t, LogLevel::LWARNING, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)
239-
#define hleReportDebug(t, res, ...) hleDoLog(t, LogLevel::HLE_LOG_LDEBUG, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)
264+
#define hleReportDebug(t, res, ...) hleDoLog(t, HLE_LOG_LDEBUG, res, __FILE__, __LINE__, "", 'x', ##__VA_ARGS__)

Core/HLE/Plugins.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ bool Load() {
190190
continue;
191191
}
192192

193-
int ret = KernelStartModule(module, 0, 0, 0, nullptr, nullptr);
193+
int ret = __KernelStartModule(module, 0, 0, 0, nullptr, nullptr);
194194
if (ret < 0) {
195195
ERROR_LOG(Log::System, "Unable to start plugin %s: %08x", filename.c_str(), ret);
196196
} else {

Core/HLE/sceAudio.cpp

+45-70
Original file line numberDiff line numberDiff line change
@@ -86,115 +86,94 @@ void AudioChannel::clear()
8686
// max or 50%?
8787
static u32 sceAudioOutputBlocking(u32 chan, int vol, u32 samplePtr) {
8888
if (vol > 0xFFFF) {
89-
ERROR_LOG(Log::sceAudio, "sceAudioOutputBlocking() - invalid volume");
90-
return SCE_ERROR_AUDIO_INVALID_VOLUME;
89+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
9190
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
92-
ERROR_LOG(Log::sceAudio, "sceAudioOutputBlocking() - bad channel");
93-
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
91+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
9492
} else if (!chans[chan].reserved) {
95-
ERROR_LOG(Log::sceAudio, "sceAudioOutputBlocking() - channel not reserved");
96-
return SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
97-
} else {
98-
DEBUG_LOG(Log::sceAudio, "sceAudioOutputBlocking(%08x, %08x, %08x)", chan, vol, samplePtr);
99-
if (vol >= 0) {
100-
chans[chan].leftVolume = vol;
101-
chans[chan].rightVolume = vol;
102-
}
103-
chans[chan].sampleAddress = samplePtr;
104-
return __AudioEnqueue(chans[chan], chan, true);
93+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
94+
}
95+
96+
if (vol >= 0) {
97+
chans[chan].leftVolume = vol;
98+
chans[chan].rightVolume = vol;
10599
}
100+
chans[chan].sampleAddress = samplePtr;
101+
return hleLogDebug(Log::sceAudio, __AudioEnqueue(chans[chan], chan, true));
106102
}
107103

108104
static u32 sceAudioOutputPannedBlocking(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
109-
int result = 0;
110105
// For some reason, this is the only one that checks for negative.
111106
if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
112-
ERROR_LOG(Log::sceAudio, "sceAudioOutputPannedBlocking() - invalid volume");
113-
result = SCE_ERROR_AUDIO_INVALID_VOLUME;
107+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
114108
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
115-
ERROR_LOG(Log::sceAudio, "sceAudioOutputPannedBlocking() - bad channel");
116-
result = SCE_ERROR_AUDIO_INVALID_CHANNEL;
109+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
117110
} else if (!chans[chan].reserved) {
118-
ERROR_LOG(Log::sceAudio, "sceAudioOutputPannedBlocking() - channel not reserved");
119-
result = SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
120-
} else {
121-
if (leftvol >= 0) {
122-
chans[chan].leftVolume = leftvol;
123-
}
124-
if (rightvol >= 0) {
125-
chans[chan].rightVolume = rightvol;
126-
}
127-
chans[chan].sampleAddress = samplePtr;
128-
result = __AudioEnqueue(chans[chan], chan, true);
111+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
129112
}
130113

131-
DEBUG_LOG(Log::sceAudio, "%08x = sceAudioOutputPannedBlocking(%08x, %08x, %08x, %08x)", result, chan, leftvol, rightvol, samplePtr);
132-
return result;
133-
114+
if (leftvol >= 0) {
115+
chans[chan].leftVolume = leftvol;
116+
}
117+
if (rightvol >= 0) {
118+
chans[chan].rightVolume = rightvol;
119+
}
120+
chans[chan].sampleAddress = samplePtr;
121+
u32 result = __AudioEnqueue(chans[chan], chan, true);
122+
return hleLogDebug(Log::sceAudio, result);
134123
}
135124

136125
static u32 sceAudioOutput(u32 chan, int vol, u32 samplePtr) {
137126
if (vol > 0xFFFF) {
138-
ERROR_LOG(Log::sceAudio, "sceAudioOutput() - invalid volume");
139-
return SCE_ERROR_AUDIO_INVALID_VOLUME;
127+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
140128
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
141-
ERROR_LOG(Log::sceAudio, "sceAudioOutput() - bad channel");
142-
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
129+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
143130
} else if (!chans[chan].reserved) {
144-
ERROR_LOG(Log::sceAudio, "sceAudioOutput(%08x, %08x, %08x) - channel not reserved", chan, vol, samplePtr);
145-
return SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
146-
} else {
147-
DEBUG_LOG(Log::sceAudio, "sceAudioOutput(%08x, %08x, %08x)", chan, vol, samplePtr);
148-
if (vol >= 0) {
149-
chans[chan].leftVolume = vol;
150-
chans[chan].rightVolume = vol;
151-
}
152-
chans[chan].sampleAddress = samplePtr;
153-
return __AudioEnqueue(chans[chan], chan, false);
131+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
154132
}
133+
134+
if (vol >= 0) {
135+
chans[chan].leftVolume = vol;
136+
chans[chan].rightVolume = vol;
137+
}
138+
chans[chan].sampleAddress = samplePtr;
139+
u32 result = __AudioEnqueue(chans[chan], chan, false);
140+
return hleLogDebug(Log::sceAudio, result);
155141
}
156142

157143
static u32 sceAudioOutputPanned(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
158144
if (leftvol > 0xFFFF || rightvol > 0xFFFF) {
159-
ERROR_LOG(Log::sceAudio, "sceAudioOutputPanned() - invalid volume");
160-
return SCE_ERROR_AUDIO_INVALID_VOLUME;
145+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_VOLUME, "invalid volume");
161146
} else if (chan >= PSP_AUDIO_CHANNEL_MAX) {
162-
ERROR_LOG(Log::sceAudio, "sceAudioOutputPanned() - bad channel");
163-
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
147+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
164148
} else if (!chans[chan].reserved) {
165-
ERROR_LOG(Log::sceAudio, "sceAudioOutputPanned(%08x, %08x, %08x, %08x) - channel not reserved", chan, leftvol, rightvol, samplePtr);
166-
return SCE_ERROR_AUDIO_CHANNEL_NOT_INIT;
149+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_CHANNEL_NOT_INIT, "channel not reserved");
167150
} else {
168-
DEBUG_LOG(Log::sceAudio, "sceAudioOutputPanned(%08x, %08x, %08x, %08x)", chan, leftvol, rightvol, samplePtr);
169151
if (leftvol >= 0) {
170152
chans[chan].leftVolume = leftvol;
171153
}
172154
if (rightvol >= 0) {
173155
chans[chan].rightVolume = rightvol;
174156
}
175157
chans[chan].sampleAddress = samplePtr;
176-
return __AudioEnqueue(chans[chan], chan, false);
158+
u32 result = __AudioEnqueue(chans[chan], chan, false);
159+
return hleLogDebug(Log::sceAudio, result);
177160
}
178161
}
179162

180163
static int sceAudioGetChannelRestLen(u32 chan) {
181164
if (chan >= PSP_AUDIO_CHANNEL_MAX) {
182-
ERROR_LOG(Log::sceAudio, "sceAudioGetChannelRestLen(%08x) - bad channel", chan);
183-
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
165+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
184166
}
185167
int remainingSamples = (int)chanSampleQueues[chan].size() / 2;
186-
VERBOSE_LOG(Log::sceAudio, "%d=sceAudioGetChannelRestLen(%08x)", remainingSamples, chan);
187-
return remainingSamples;
168+
return hleLogVerbose(Log::sceAudio, remainingSamples);
188169
}
189170

190171
static int sceAudioGetChannelRestLength(u32 chan) {
191172
if (chan >= PSP_AUDIO_CHANNEL_MAX) {
192-
ERROR_LOG(Log::sceAudio, "sceAudioGetChannelRestLength(%08x) - bad channel", chan);
193-
return SCE_ERROR_AUDIO_INVALID_CHANNEL;
173+
return hleLogError(Log::sceAudio, SCE_ERROR_AUDIO_INVALID_CHANNEL, "bad channel");
194174
}
195175
int remainingSamples = (int)chanSampleQueues[chan].size() / 2;
196-
VERBOSE_LOG(Log::sceAudio, "%d=sceAudioGetChannelRestLength(%08x)", remainingSamples, chan);
197-
return remainingSamples;
176+
return hleLogVerbose(Log::sceAudio, remainingSamples);
198177
}
199178

200179
static u32 GetFreeChannel() {
@@ -474,18 +453,14 @@ static u32 sceAudioSRCOutputBlocking(u32 vol, u32 buf) {
474453

475454
static int sceAudioInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) {
476455
if (!Memory::IsValidAddress(bufAddr)) {
477-
ERROR_LOG(Log::HLE, "sceAudioInputBlocking(%d, %d, %08x): invalid addresses", maxSamples, sampleRate, bufAddr);
478-
return -1;
456+
return hleLogError(Log::HLE, -1, "invalid address");
479457
}
480-
481-
INFO_LOG(Log::HLE, "sceAudioInputBlocking: maxSamples: %d, samplerate: %d, bufAddr: %08x", maxSamples, sampleRate, bufAddr);
482-
return __MicInput(maxSamples, sampleRate, bufAddr, AUDIOINPUT);
458+
return hleLogSuccessInfoI(Log::HLE, __MicInput(maxSamples, sampleRate, bufAddr, AUDIOINPUT));
483459
}
484460

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

491466
ERROR_LOG(Log::HLE, "UNTEST sceAudioInput: maxSamples: %d, samplerate: %d, bufAddr: %08x", maxSamples, sampleRate, bufAddr);

Core/HLE/sceCtrl.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -514,8 +514,7 @@ static int sceCtrlReadBufferPositive(u32 ctrlDataPtr, u32 nBufs)
514514
{
515515
int done = __CtrlReadBuffer(ctrlDataPtr, nBufs, false, false);
516516
hleEatCycles(330);
517-
if (done != 0)
518-
{
517+
if (done != 0) {
519518
DEBUG_LOG(Log::sceCtrl, "%d=sceCtrlReadBufferPositive(%08x, %i)", done, ctrlDataPtr, nBufs);
520519
}
521520
else

0 commit comments

Comments
 (0)