提问人:csmiss 提问时间:9/21/2023 更新时间:9/21/2023 访问量:25
关于在 EL1 级别中使用 arm64 硬件调试寄存器的问题
question about using arm64 hardware debug registers in EL1 level
问:
我正在调试在 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”等软件断点工作良好,可以按预期捕获异常,但上面的硬件调试测试代码永远不会出现异常。
我试图从网上搜索,但一无所获。
答: 暂无答案
评论