/* * In order to access the breakpoint/watchpoint control registers, * we must be running in debug monitor mode. */ #define ARM_DSCR_HDBGEN (1 << 14) /* DSCR halting bits. */ #define ARM_DSCR_MDBGEN (1 << 15) /* DSCR monitor bits. */ /* Accessor macros for the debug registers. */ #define ARM_DBG_READ(N, M, OP2, VAL) \ do \ { \ asm volatile("mrc p14, 0, %0, " #N "," #M ", " #OP2 : "=r"(VAL)); \ } while (0) #define ARM_DBG_WRITE(N, M, OP2, VAL) \ do \ { \ asm volatile("mcr p14, 0, %0, " #N "," #M ", " #OP2 : : "r"(VAL)); \ } while (0) static int monitor_mode_enabled(void) { unsigned int dscr; ARM_DBG_READ(c0, c1, 0, dscr); if (dscr & ARM_DSCR_MDBGEN) return 1; return 0; } #include int main() { printf("%u\n", monitor_mode_enabled()); }