diff --git a/src/Common/Logging.h b/src/Common/Logging.h index ecdb814ea..77f2cee74 100644 --- a/src/Common/Logging.h +++ b/src/Common/Logging.h @@ -231,6 +231,10 @@ extern thread_local std::string _logPrefix; #define LOG_FUNC_RESULT(r) \ std::cout << _logFuncPrefix << " returns " << r << "\n"; +// LOG_FUNC_RESULT_TYPE logs the function return result using the overloaded << operator of the given type +#define LOG_FUNC_RESULT_TYPE(type, r) \ + std::cout << _logFuncPrefix << " returns " << (type)r << "\n"; + // LOG_FORWARD indicates that an api is implemented by a forward to another API #define LOG_FORWARD(api) \ LOG_INIT \ @@ -275,6 +279,7 @@ extern thread_local std::string _logPrefix; #define LOG_FUNC_ARG_OUT(arg) #define LOG_FUNC_END #define LOG_FUNC_RESULT(r) +#define LOG_FUNC_RESULT_TYPE(type, r) #define LOG_FORWARD(arg) #define LOG_IGNORED() #define LOG_UNIMPLEMENTED() @@ -303,6 +308,9 @@ extern thread_local std::string _logPrefix; // RETURN logs the given result and then returns it (so this should appear last in functions) #define RETURN(r) do { LOG_FUNC_RESULT(r) return r; } while (0) +// RETURN_TYPE logs the given typed result and then returns it (so this should appear last in functions) +#define RETURN_TYPE(type, r) do { LOG_FUNC_RESULT_TYPE(type, r) return r; } while (0) + #define LOG_ONCE(msg, ...) { static bool bFirstTime = true; if(bFirstTime) { bFirstTime = false; DbgPrintf("TRAC: " ## msg, __VA_ARGS__); } } #define LOG_XBOX_CALL(func) DbgPrintf("TRAC: Xbox " ## func ## "() call\n"); diff --git a/src/CxbxKrnl/EmuKrnl.cpp b/src/CxbxKrnl/EmuKrnl.cpp index a9c386e4b..03b275f9a 100644 --- a/src/CxbxKrnl/EmuKrnl.cpp +++ b/src/CxbxKrnl/EmuKrnl.cpp @@ -393,7 +393,7 @@ XBSYSAPI EXPORTNUM(160) xboxkrnl::KIRQL FASTCALL xboxkrnl::KfRaiseIrql IN KIRQL NewIrql ) { - LOG_FUNC_ONE_ARG(NewIrql); + LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, NewIrql); // Inlined KeGetCurrentIrql() : PKPCR Pcr = KeGetPcr(); @@ -407,7 +407,7 @@ XBSYSAPI EXPORTNUM(160) xboxkrnl::KIRQL FASTCALL xboxkrnl::KfRaiseIrql KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL, (PVOID)OldIrql, (PVOID)NewIrql, 0, 0); } - RETURN(OldIrql); + RETURN_TYPE(KIRQL_TYPE, OldIrql); } inline int bsr(const uint32_t a) { DWORD result; _BitScanReverse(&result, a); return result; } @@ -422,7 +422,7 @@ XBSYSAPI EXPORTNUM(161) xboxkrnl::VOID FASTCALL xboxkrnl::KfLowerIrql IN KIRQL NewIrql ) { - LOG_FUNC_ONE_ARG(NewIrql); + LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, NewIrql); KPCR* Pcr = KeGetPcr(); @@ -470,7 +470,7 @@ XBSYSAPI EXPORTNUM(163) xboxkrnl::VOID FASTCALL xboxkrnl::KiUnlockDispatcherData IN KIRQL OldIrql ) { - LOG_FUNC_ONE_ARG(OldIrql); + LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, OldIrql); if (!(KeGetCurrentPrcb()->DpcRoutineActive)) // Avoid KeIsExecutingDpc(), as that logs HalRequestSoftwareInterrupt(DISPATCH_LEVEL); diff --git a/src/CxbxKrnl/EmuKrnlHal.cpp b/src/CxbxKrnl/EmuKrnlHal.cpp index 6c373eba9..26374a907 100644 --- a/src/CxbxKrnl/EmuKrnlHal.cpp +++ b/src/CxbxKrnl/EmuKrnlHal.cpp @@ -125,7 +125,7 @@ XBSYSAPI EXPORTNUM(38) xboxkrnl::VOID FASTCALL xboxkrnl::HalClearSoftwareInterru KIRQL Request ) { - LOG_FUNC_ONE_ARG(Request); + LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, Request); // Mask out this interrupt request DWORD InterruptMask = 1 << Request; @@ -438,7 +438,7 @@ XBSYSAPI EXPORTNUM(48) xboxkrnl::VOID FASTCALL xboxkrnl::HalRequestSoftwareInter IN KIRQL Request ) { - LOG_FUNC_ONE_ARG(Request); + LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, Request); DWORD InterruptMask = 1 << Request; diff --git a/src/CxbxKrnl/EmuKrnlKe.cpp b/src/CxbxKrnl/EmuKrnlKe.cpp index e5ccccab3..6c0226ecf 100644 --- a/src/CxbxKrnl/EmuKrnlKe.cpp +++ b/src/CxbxKrnl/EmuKrnlKe.cpp @@ -560,7 +560,7 @@ XBSYSAPI EXPORTNUM(103) xboxkrnl::KIRQL NTAPI xboxkrnl::KeGetCurrentIrql(void) KPCR* Pcr = KeGetPcr(); KIRQL Irql = (KIRQL)Pcr->Irql; - RETURN(Irql); + RETURN_TYPE(KIRQL_TYPE, Irql); } // ****************************************************************** @@ -706,7 +706,7 @@ XBSYSAPI EXPORTNUM(109) xboxkrnl::VOID NTAPI xboxkrnl::KeInitializeInterrupt LOG_FUNC_ARG(ServiceRoutine) LOG_FUNC_ARG(ServiceContext) LOG_FUNC_ARG(Vector) - LOG_FUNC_ARG(Irql) + LOG_FUNC_ARG_TYPE(KIRQL_TYPE, Irql) LOG_FUNC_ARG(InterruptMode) LOG_FUNC_ARG(ShareVector) LOG_FUNC_END; diff --git a/src/CxbxKrnl/EmuKrnlLogging.cpp b/src/CxbxKrnl/EmuKrnlLogging.cpp index b9dcbf53d..ad00e49c5 100644 --- a/src/CxbxKrnl/EmuKrnlLogging.cpp +++ b/src/CxbxKrnl/EmuKrnlLogging.cpp @@ -237,6 +237,15 @@ ENUM2STR_START(KINTERRUPT_MODE) ENUM2STR_CASE(Latched) ENUM2STR_END_and_LOGRENDER(KINTERRUPT_MODE) +ENUM2STR_START(KIRQL_TYPE) + ENUM2STR_CASE_DEF(PASSIVE_LEVEL) + ENUM2STR_CASE_DEF(APC_LEVEL) + ENUM2STR_CASE_DEF(DISPATCH_LEVEL) + ENUM2STR_CASE_DEF(PROFILE_LEVEL) + ENUM2STR_CASE_DEF(SYNC_LEVEL) + ENUM2STR_CASE_DEF(HIGH_LEVEL) +ENUM2STR_END_and_LOGRENDER(KIRQL_TYPE) + ENUM2STR_START(KWAIT_REASON) ENUM2STR_CASE(Executive) ENUM2STR_CASE(FreePage) diff --git a/src/CxbxKrnl/EmuKrnlLogging.h b/src/CxbxKrnl/EmuKrnlLogging.h index 37f8b39ef..12b620246 100644 --- a/src/CxbxKrnl/EmuKrnlLogging.h +++ b/src/CxbxKrnl/EmuKrnlLogging.h @@ -46,6 +46,7 @@ enum ALLOCATION_TYPE; enum CREATE_DISPOSITION; enum CREATE_OPTION; //enum NTSTATUS; +enum KIRQL_TYPE; // fake enum, since KIRQL is an unsigned char, which clashes with BOOLEAN enum PROTECTION_TYPE; }; @@ -69,6 +70,7 @@ ENUM2STR_HEADER(EXCEPTION_DISPOSITION) ENUM2STR_HEADER(FILE_INFORMATION_CLASS) ENUM2STR_HEADER(FS_INFORMATION_CLASS) ENUM2STR_HEADER(KINTERRUPT_MODE) +ENUM2STR_HEADER(KIRQL_TYPE) // Not really an enum ENUM2STR_HEADER(KWAIT_REASON) ENUM2STR_HEADER(KOBJECTS) ENUM2STR_HEADER(MODE)