Kernel : Log IRQ level as string too.

This commit is contained in:
PatrickvL 2018-02-16 10:52:07 +01:00
parent 55a764ce52
commit 83fcfd8114
6 changed files with 27 additions and 8 deletions

View File

@ -231,6 +231,10 @@ extern thread_local std::string _logPrefix;
#define LOG_FUNC_RESULT(r) \ #define LOG_FUNC_RESULT(r) \
std::cout << _logFuncPrefix << " returns " << r << "\n"; 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 // LOG_FORWARD indicates that an api is implemented by a forward to another API
#define LOG_FORWARD(api) \ #define LOG_FORWARD(api) \
LOG_INIT \ LOG_INIT \
@ -275,6 +279,7 @@ extern thread_local std::string _logPrefix;
#define LOG_FUNC_ARG_OUT(arg) #define LOG_FUNC_ARG_OUT(arg)
#define LOG_FUNC_END #define LOG_FUNC_END
#define LOG_FUNC_RESULT(r) #define LOG_FUNC_RESULT(r)
#define LOG_FUNC_RESULT_TYPE(type, r)
#define LOG_FORWARD(arg) #define LOG_FORWARD(arg)
#define LOG_IGNORED() #define LOG_IGNORED()
#define LOG_UNIMPLEMENTED() #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) // 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) #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_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"); #define LOG_XBOX_CALL(func) DbgPrintf("TRAC: Xbox " ## func ## "() call\n");

View File

@ -393,7 +393,7 @@ XBSYSAPI EXPORTNUM(160) xboxkrnl::KIRQL FASTCALL xboxkrnl::KfRaiseIrql
IN KIRQL NewIrql IN KIRQL NewIrql
) )
{ {
LOG_FUNC_ONE_ARG(NewIrql); LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, NewIrql);
// Inlined KeGetCurrentIrql() : // Inlined KeGetCurrentIrql() :
PKPCR Pcr = KeGetPcr(); 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); 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; } 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 IN KIRQL NewIrql
) )
{ {
LOG_FUNC_ONE_ARG(NewIrql); LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, NewIrql);
KPCR* Pcr = KeGetPcr(); KPCR* Pcr = KeGetPcr();
@ -470,7 +470,7 @@ XBSYSAPI EXPORTNUM(163) xboxkrnl::VOID FASTCALL xboxkrnl::KiUnlockDispatcherData
IN KIRQL OldIrql IN KIRQL OldIrql
) )
{ {
LOG_FUNC_ONE_ARG(OldIrql); LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, OldIrql);
if (!(KeGetCurrentPrcb()->DpcRoutineActive)) // Avoid KeIsExecutingDpc(), as that logs if (!(KeGetCurrentPrcb()->DpcRoutineActive)) // Avoid KeIsExecutingDpc(), as that logs
HalRequestSoftwareInterrupt(DISPATCH_LEVEL); HalRequestSoftwareInterrupt(DISPATCH_LEVEL);

View File

@ -125,7 +125,7 @@ XBSYSAPI EXPORTNUM(38) xboxkrnl::VOID FASTCALL xboxkrnl::HalClearSoftwareInterru
KIRQL Request KIRQL Request
) )
{ {
LOG_FUNC_ONE_ARG(Request); LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, Request);
// Mask out this interrupt request // Mask out this interrupt request
DWORD InterruptMask = 1 << Request; DWORD InterruptMask = 1 << Request;
@ -438,7 +438,7 @@ XBSYSAPI EXPORTNUM(48) xboxkrnl::VOID FASTCALL xboxkrnl::HalRequestSoftwareInter
IN KIRQL Request IN KIRQL Request
) )
{ {
LOG_FUNC_ONE_ARG(Request); LOG_FUNC_ONE_ARG_TYPE(KIRQL_TYPE, Request);
DWORD InterruptMask = 1 << Request; DWORD InterruptMask = 1 << Request;

View File

@ -560,7 +560,7 @@ XBSYSAPI EXPORTNUM(103) xboxkrnl::KIRQL NTAPI xboxkrnl::KeGetCurrentIrql(void)
KPCR* Pcr = KeGetPcr(); KPCR* Pcr = KeGetPcr();
KIRQL Irql = (KIRQL)Pcr->Irql; 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(ServiceRoutine)
LOG_FUNC_ARG(ServiceContext) LOG_FUNC_ARG(ServiceContext)
LOG_FUNC_ARG(Vector) LOG_FUNC_ARG(Vector)
LOG_FUNC_ARG(Irql) LOG_FUNC_ARG_TYPE(KIRQL_TYPE, Irql)
LOG_FUNC_ARG(InterruptMode) LOG_FUNC_ARG(InterruptMode)
LOG_FUNC_ARG(ShareVector) LOG_FUNC_ARG(ShareVector)
LOG_FUNC_END; LOG_FUNC_END;

View File

@ -237,6 +237,15 @@ ENUM2STR_START(KINTERRUPT_MODE)
ENUM2STR_CASE(Latched) ENUM2STR_CASE(Latched)
ENUM2STR_END_and_LOGRENDER(KINTERRUPT_MODE) 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_START(KWAIT_REASON)
ENUM2STR_CASE(Executive) ENUM2STR_CASE(Executive)
ENUM2STR_CASE(FreePage) ENUM2STR_CASE(FreePage)

View File

@ -46,6 +46,7 @@ enum ALLOCATION_TYPE;
enum CREATE_DISPOSITION; enum CREATE_DISPOSITION;
enum CREATE_OPTION; enum CREATE_OPTION;
//enum NTSTATUS; //enum NTSTATUS;
enum KIRQL_TYPE; // fake enum, since KIRQL is an unsigned char, which clashes with BOOLEAN
enum PROTECTION_TYPE; enum PROTECTION_TYPE;
}; };
@ -69,6 +70,7 @@ ENUM2STR_HEADER(EXCEPTION_DISPOSITION)
ENUM2STR_HEADER(FILE_INFORMATION_CLASS) ENUM2STR_HEADER(FILE_INFORMATION_CLASS)
ENUM2STR_HEADER(FS_INFORMATION_CLASS) ENUM2STR_HEADER(FS_INFORMATION_CLASS)
ENUM2STR_HEADER(KINTERRUPT_MODE) ENUM2STR_HEADER(KINTERRUPT_MODE)
ENUM2STR_HEADER(KIRQL_TYPE) // Not really an enum
ENUM2STR_HEADER(KWAIT_REASON) ENUM2STR_HEADER(KWAIT_REASON)
ENUM2STR_HEADER(KOBJECTS) ENUM2STR_HEADER(KOBJECTS)
ENUM2STR_HEADER(MODE) ENUM2STR_HEADER(MODE)