Add basic breakpoint support to kdb
This commit is contained in:
parent
0a11ea3e50
commit
765bde0c82
@ -160,6 +160,89 @@ Debug_Backtrace(int argc, const char *argv[])
|
|||||||
|
|
||||||
REGISTER_DBGCMD(backtrace, "Print backtrace", Debug_Backtrace);
|
REGISTER_DBGCMD(backtrace, "Print backtrace", Debug_Backtrace);
|
||||||
|
|
||||||
|
static void
|
||||||
|
Debug_SetBreakpoint(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
if (argc != 2) {
|
||||||
|
kprintf("bkpt [ADDR]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t addr = Debug_StrToInt(argv[1]);
|
||||||
|
|
||||||
|
uint32_t flags = read_dr7();
|
||||||
|
|
||||||
|
if (!(flags & DR7_DR0G)) {
|
||||||
|
write_dr0(addr);
|
||||||
|
write_dr7(flags | DR7_DR0G);
|
||||||
|
} else if (!(flags & DR7_DR1G)) {
|
||||||
|
write_dr1(addr);
|
||||||
|
write_dr7(flags | DR7_DR1G);
|
||||||
|
} else if (!(flags & DR7_DR2G)) {
|
||||||
|
write_dr2(addr);
|
||||||
|
write_dr7(flags | DR7_DR2G);
|
||||||
|
} else if (!(flags & DR7_DR3G)) {
|
||||||
|
write_dr3(addr);
|
||||||
|
write_dr7(flags | DR7_DR3G);
|
||||||
|
} else {
|
||||||
|
kprintf("No more breakpoints left!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_DBGCMD(bkpt, "Set breakpoint", Debug_SetBreakpoint);
|
||||||
|
|
||||||
|
static void
|
||||||
|
Debug_ClearBreakpoint(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
if (argc != 2) {
|
||||||
|
kprintf("clrbkpt [0-3]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t flags = read_dr7();
|
||||||
|
switch (argv[1][0]) {
|
||||||
|
case '0':
|
||||||
|
flags &= ~DR7_DR0G;
|
||||||
|
break;
|
||||||
|
case '1':
|
||||||
|
flags &= ~DR7_DR1G;
|
||||||
|
break;
|
||||||
|
case '2':
|
||||||
|
flags &= ~DR7_DR2G;
|
||||||
|
break;
|
||||||
|
case '3':
|
||||||
|
flags &= ~DR7_DR3G;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
kprintf("Specify a breakpoint between 0-3\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
write_dr7(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_DBGCMD(clrbkpt, "Clear breakpoint", Debug_ClearBreakpoint);
|
||||||
|
|
||||||
|
static void
|
||||||
|
Debug_ListBreakpoints(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
uint32_t flags = read_dr7();
|
||||||
|
|
||||||
|
if (flags & DR7_DR0G) {
|
||||||
|
kprintf("DR0: 0x%lx\n", read_dr0());
|
||||||
|
}
|
||||||
|
if (flags & DR7_DR1G) {
|
||||||
|
kprintf("DR1: 0x%lx\n", read_dr1());
|
||||||
|
}
|
||||||
|
if (flags & DR7_DR2G) {
|
||||||
|
kprintf("DR2: 0x%lx\n", read_dr2());
|
||||||
|
}
|
||||||
|
if (flags & DR7_DR3G) {
|
||||||
|
kprintf("DR3: 0x%lx\n", read_dr3());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_DBGCMD(bkpts, "List breakpoint", Debug_ListBreakpoints);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
Debug_Reboot(int argc, const char *argv[])
|
Debug_Reboot(int argc, const char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -191,6 +191,15 @@ typedef struct XSAVEArea
|
|||||||
* Debug Registers
|
* Debug Registers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define DR7_DR0L 0x00000001
|
||||||
|
#define DR7_DR0G 0x00000002
|
||||||
|
#define DR7_DR1L 0x00000004
|
||||||
|
#define DR7_DR1G 0x00000008
|
||||||
|
#define DR7_DR2L 0x00000010
|
||||||
|
#define DR7_DR2G 0x00000020
|
||||||
|
#define DR7_DR3L 0x00000040
|
||||||
|
#define DR7_DR3G 0x00000080
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MSRs
|
* MSRs
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user