关于在 EL1 级别中使用 arm64 硬件调试寄存器的问题

question about using arm64 hardware debug registers in EL1 level

提问人:csmiss 提问时间:9/21/2023 更新时间:9/21/2023 访问量:25

问:

我正在调试在 aarch64 EL1 中运行的 rtos 操作系统的任务堆栈基本步骤错误,加法器是 4k 对齐的,例如:0xFFFFxxxx8000。我尝试了下面的调试代码,期望当我将任何数据写入此地址时,会捕获异常外壳,然后我可以分析调用跟踪。但是,在测试中将数据强制到此加法器时,什么也没发生。

uint32_t mdscr, enable = 0;
uint64_t addr, ctrl;

/*enable MDE and KDE */
enable = DBG_MDSCR_MDE | DBG_MDSCR_KDE;
asm volatile("mrs %0, mdscr_el1" : "=r" (mdscr));
mdscr |= enable;
asm volatile("msr mdscr_el1, %0" :: "r" (mdscr));

#define ARM_BREAKPOINT_LEN_8    0xff
#define ARM_BREAKPOINT_STORE    2
#define AARCH64_BREAKPOINT_EL1  1

addr = task->stack_base;
ctrl = (ARM_BREAKPOINT_LEN_8<<5) | (ARM_BREAKPOINT_STORE<<3) | (AARCH64_BREAKPOINT_EL1<<1 | 1);
asm volatile("msr dbgbvr0_el1, %0" :: "r" (addr));
asm volatile("msr dbgbcr0_el1, %0" :: "r" (ctrl));
asm volatile("msr dbgwvr0_el1, %0" :: "r" (addr));
asm volatile("msr dbgwcr0_el1, %0" :: "r" (ctrl));

uint8_t cur_cpu_id = cpu_cur_get();
printk("addr %p is watched on cpu %d\n", cur_cpu_id);

............................................................

//in test case I write date to this task stack base directly:

uint8_t cur_cpu_id = cpu_cur_get();
printk("test writing addr %p on cpu %d\n", cur_cpu_id);
task->stack_base = -1;

我确定cur_cpu_id始终为 0,并且异常处理程序(el0 和 el1)没问题,该内核中的“BRK”等软件断点工作良好,可以按预期捕获异常,但上面的硬件调试测试代码永远不会出现异常。

我试图从网上搜索,但一无所获。

异常 调试 内核 断点 arm64

评论


答: 暂无答案