57 lines
1.8 KiB
C
57 lines
1.8 KiB
C
#ifndef KE_DEBUG_H
|
|
#define KE_DEBUG_H
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
void KeInitDebug(void (*PrintPtr)(char, uint32_t, uint32_t), int v);
|
|
__declspec(dllexport) void DbgPrint(const char* fmt, ...);
|
|
__declspec(dllexport) void KePrintConsole(const char* buf, size_t len);
|
|
__declspec(dllexport) _Noreturn void KePanic(const char* fmt, ...);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Fault dispatch - called from the IDT fault stubs (ke_syscall.asm).
|
|
//
|
|
// The old scalar entry only reported RIP/error/CR2, which is not enough for
|
|
// debugging null indirect calls. The frame entry snapshots user GPRs plus the
|
|
// CPU exception frame, including user RSP. For a CALL through a null function
|
|
// pointer, RIP is 0 and [RSP] is usually the return address after the bad call;
|
|
// that is the useful caller site.
|
|
// ---------------------------------------------------------------------------
|
|
typedef struct KFAULT_FRAME {
|
|
uint64_t Magic;
|
|
uint64_t Vector;
|
|
uint64_t ErrorCode;
|
|
uint64_t Cr2;
|
|
uint64_t Rip;
|
|
uint64_t Cs;
|
|
uint64_t Rflags;
|
|
uint64_t Rsp;
|
|
uint64_t Ss;
|
|
|
|
uint64_t Rax;
|
|
uint64_t Rcx;
|
|
uint64_t Rdx;
|
|
uint64_t Rbx;
|
|
uint64_t Rbp;
|
|
uint64_t Rsi;
|
|
uint64_t Rdi;
|
|
uint64_t R8;
|
|
uint64_t R9;
|
|
uint64_t R10;
|
|
uint64_t R11;
|
|
uint64_t R12;
|
|
uint64_t R13;
|
|
uint64_t R14;
|
|
uint64_t R15;
|
|
} KFAULT_FRAME;
|
|
|
|
__declspec(dllexport) _Noreturn void KeFaultDispatchFrame(const KFAULT_FRAME* frame);
|
|
|
|
// Compatibility wrapper for any older assembly/object still calling this.
|
|
__declspec(dllexport) _Noreturn void KeFaultDispatch(int vector, uintptr_t rip,
|
|
uintptr_t errCode, uintptr_t cr2,
|
|
uintptr_t cs);
|
|
|
|
#endif // KE_DEBUG_H
|