13#define PRINT_ALL_REGS_AND_HALT(ctxptr, intfrptr) \
15 gop_printf(COLOR_RED, \
16 "RAX=%p RBX=%p RCX=%p RDX=%p\n" \
17 "RSI=%p RDI=%p RBP=%p RSP=%p\n" \
18 "R8 =%p R9 =%p R10=%p R11=%p\n" \
19 "R12=%p R13=%p R14=%p R15=%p\n" \
20 "RIP=%p RFLAGS=%p\n", \
21 (ctxptr)->rax, (ctxptr)->rbx, (ctxptr)->rcx, (ctxptr)->rdx, \
22 (ctxptr)->rsi, (ctxptr)->rdi, (ctxptr)->rbp, (intfrptr)->rsp, \
23 (ctxptr)->r8, (ctxptr)->r9, (ctxptr)->r10, (ctxptr)->r11, \
24 (ctxptr)->r12, (ctxptr)->r13, (ctxptr)->r14, (ctxptr)->r15, \
25 (intfrptr)->rip, (intfrptr)->rflags); \
36static void MiHandleTimer(
bool schedulerEnabled,
PTRAP_FRAME trap) {
48 if (__sync_sub_and_fetch(¤tThread->
TimeSlice, 1) > 0) {
66 MiHandleTimer(schedulerEnabled, trap);
109 if (idx == -1)
break;
116 for (
int i = 0; i < 4; i++) {
123 dr7 &= ~(1ULL << (i * 2));
125 uint64_t mask = 0xFULL << (16 + 4 * i);
177 __asm__ __volatile__ (
212 (
void*)(uintptr_t)status,
215 (
void*)trap->error_code
323 for (
int i = 0; i < 4; ++i) {
324 if (dr6 & (1ULL << i)) {
339 gop_printf(0xFFFFFF00,
"DEBUG: DR%d fired at addr %p but no callback\n", i, (
void*)
__read_dr(i));
349 else if (dr6 & (1 << 14)) {
465 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
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)
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 __write_cr3(uint64_t val)
FORCEINLINE uint64_t __read_cr3(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 MT_FAILURE(Status)
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