14#define PRINT_ALL_REGS_AND_HALT(ctxptr, intfrptr) \
16 gop_printf(COLOR_RED, \
17 "RAX=%p RBX=%p RCX=%p RDX=%p\n" \
18 "RSI=%p RDI=%p RBP=%p RSP=%p\n" \
19 "R8 =%p R9 =%p R10=%p R11=%p\n" \
20 "R12=%p R13=%p R14=%p R15=%p\n" \
21 "RIP=%p RFLAGS=%p\n", \
22 (ctxptr)->rax, (ctxptr)->rbx, (ctxptr)->rcx, (ctxptr)->rdx, \
23 (ctxptr)->rsi, (ctxptr)->rdi, (ctxptr)->rbp, (intfrptr)->rsp, \
24 (ctxptr)->r8, (ctxptr)->r9, (ctxptr)->r10, (ctxptr)->r11, \
25 (ctxptr)->r12, (ctxptr)->r13, (ctxptr)->r14, (ctxptr)->r15, \
26 (intfrptr)->rip, (intfrptr)->rflags); \
37static void MiHandleTimer(
bool schedulerEnabled,
PTRAP_FRAME trap) {
49 if (__sync_sub_and_fetch(¤tThread->
TimeSlice, 1) > 0) {
67 MiHandleTimer(schedulerEnabled, trap);
111 if (idx == -1)
break;
118 for (
int i = 0; i < 4; i++) {
125 dr7 &= ~(1ULL << (i * 2));
127 uint64_t mask = 0xFULL << (16 + 4 * i);
177 __asm__ __volatile__ (
231 if (HandlerAddress != 0) {
233 trap->rip = HandlerAddress;
241 (
void*)(uintptr_t)status,
244 (
void*)trap->error_code
352 for (
int i = 0; i < 4; ++i) {
353 if (dr6 & (1ULL << i)) {
368 gop_printf(0xFFFFFF00,
"DEBUG: DR%d fired at addr %p but no callback\n", i, (
void*)
__read_dr(i));
378 else if (dr6 & (1 << 14)) {
519 gop_printf(
COLOR_RED,
"[TERMINATE-#GPF] Terminating thread (%s) %p for %lx | RIP: %p\n", (Thread->
SystemThread) ?
"Kernel Mode" :
"User Mode", Thread, (
unsigned long)Status, (
void*)(uintptr_t)trap->
rip);
526 gop_printf(0xFFFF0000,
"Error: Floating Point error, have you done a correct calculation?\n");
FORCEINLINE uint64_t InterlockedAndU64(volatile uint64_t *target, uint64_t value)
FORCEINLINE uint64_t InterlockedOrU64(volatile uint64_t *target, uint64_t value)
NORETURN void MeBugCheck(IN enum _BUGCHECK_CODES BugCheckCode)
NORETURN void MeBugCheckEx(IN enum _BUGCHECK_CODES BugCheckCode, IN void *BugCheckParameter1, IN void *BugCheckParameter2, IN void *BugCheckParameter3, IN void *BugCheckParameter4)
int find_available_debug_reg(void)
struct _GOP_PARAMS GOP_PARAMS
uint64_t ExpFindKernelModeExceptionHandler(uint64_t Rip)
MTSTATUS MmAccessFault(IN uint64_t FaultBits, IN uint64_t VirtualAddress, IN PRIVILEGE_MODE PreviousMode, IN PTRAP_FRAME TrapFrame)
void gop_printf(uint32_t color, const char *fmt,...)
void MiBreakpoint(PTRAP_FRAME trap)
void MiNoCoprocessor(PTRAP_FRAME trap)
void MiBoundsCheck(PTRAP_FRAME trap)
NORETURN void MiNonMaskableInterrupt(PTRAP_FRAME trap)
void MiAlignmentCheck(PTRAP_FRAME trap)
void MiDebugTrap(PTRAP_FRAME trap)
void MiInvalidTss(IN PTRAP_FRAME trap)
void MiInvalidOpcode(PTRAP_FRAME trap)
void MiStackSegmentOverrun(PTRAP_FRAME trap)
void MiCoprocessorSegmentOverrun(PTRAP_FRAME trap)
void MiMachineCheck(PTRAP_FRAME trap)
void MiPageFault(IN PTRAP_FRAME trap)
NORETURN void MiDoubleFault(IN PTRAP_FRAME trap)
void MiLapicInterrupt(bool schedulerEnabled, PTRAP_FRAME trap)
void MiGeneralProtectionFault(PTRAP_FRAME trap)
void MiDivideByZero(PTRAP_FRAME trap)
void MiFloatingPointError(PTRAP_FRAME trap)
void MiOverflow(PTRAP_FRAME trap)
void MiInterprocessorInterrupt(void)
void MiSegmentSelectorNotPresent(PTRAP_FRAME trap)
bool ExpIsPrivilegedInstruction(uint8_t *Ip)
FORCEINLINE uint64_t __read_dr(int reg)
FORCEINLINE void invlpg(void *m)
FORCEINLINE void __hlt(void)
#define UNREFERENCED_PARAMETER(x)
FORCEINLINE void __write_dr(int reg, uint64_t val)
FORCEINLINE void __cli(void)
FORCEINLINE void __write_cr3(uint64_t val)
FORCEINLINE void __stac(void)
FORCEINLINE uint64_t __read_cr3(void)
FORCEINLINE void __clac(void)
@ COPROCESSOR_SEGMENT_OVERRUN
@ KMODE_EXCEPTION_NOT_HANDLED
@ GENERAL_PROTECTION_FAULT
@ SEGMENT_SELECTOR_NOTPRESENT
struct _DBG_CALLBACK_INFO DBG_CALLBACK_INFO
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
FORCEINLINE PRIVILEGE_MODE MeGetPreviousMode(void)
#define COLOR_RED
Colors definitions for easier access.
@ CPU_ACTION_DO_DEFERRED_ROUTINES
@ CPU_ACTION_WRITE_DEBUG_REGS
@ CPU_ACTION_CLEAR_DEBUG_REGS
@ CPU_ACTION_PERFORM_TLB_SHOOTDOWN
enum _CPU_ACTION CPU_ACTION
#define MI_IS_CANONICAL_ADDR(va)
enum _PRIVILEGE_MODE PRIVILEGE_MODE
#define MT_PRIVILEGED_INSTRUCTION
#define MT_FAILURE(Status)
#define MT_INTEGER_DIVIDE_BY_ZERO
#define MT_ACCESS_VIOLATION
struct _ITHREAD InternalThread
struct _PAGE_PARAMETERS pageParams
struct _DEBUG_REGISTERS debugRegs
enum _TimeSliceTicks TimeSlice
struct _TRAP_FRAME TrapRegisters
enum _TimeSliceTicks TimeSliceAllocated
uint64_t addressToInvalidate
volatile IPI_PARAMS IpiParameter
struct _DEBUG_ENTRY DebugEntry[4]
struct _ITHREAD * currentThread
enum _CPU_ACTION IpiAction
MTSTATUS PsTerminateThread(IN PETHREAD Thread, IN MTSTATUS ExitStatus)
PETHREAD PsGetCurrentThread(void)