Commit 3892b11e authored by Tiezhu Yang's avatar Tiezhu Yang Committed by Huacai Chen

LoongArch: Check TIF_LOAD_WATCH to enable user space watchpoint

Currently, there are some places to set CSR.PRMD.PWE, the first one is
in hw_breakpoint_thread_switch() to enable user space singlestep via
checking TIF_SINGLESTEP, the second one is in hw_breakpoint_control() to
enable user space watchpoint. For the latter case, it should also check
TIF_LOAD_WATCH to make the logic correct and clear.

Fixes: c8e57ab0 ("LoongArch: Trigger user-space watchpoints correctly")
Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 0d3a6322
...@@ -221,7 +221,7 @@ static int hw_breakpoint_control(struct perf_event *bp, ...@@ -221,7 +221,7 @@ static int hw_breakpoint_control(struct perf_event *bp,
} }
enable = csr_read64(LOONGARCH_CSR_CRMD); enable = csr_read64(LOONGARCH_CSR_CRMD);
csr_write64(CSR_CRMD_WE | enable, LOONGARCH_CSR_CRMD); csr_write64(CSR_CRMD_WE | enable, LOONGARCH_CSR_CRMD);
if (bp->hw.target) if (bp->hw.target && test_tsk_thread_flag(bp->hw.target, TIF_LOAD_WATCH))
regs->csr_prmd |= CSR_PRMD_PWE; regs->csr_prmd |= CSR_PRMD_PWE;
break; break;
case HW_BREAKPOINT_UNINSTALL: case HW_BREAKPOINT_UNINSTALL:
......
...@@ -589,6 +589,7 @@ static int ptrace_hbp_set_ctrl(unsigned int note_type, ...@@ -589,6 +589,7 @@ static int ptrace_hbp_set_ctrl(unsigned int note_type,
struct perf_event *bp; struct perf_event *bp;
struct perf_event_attr attr; struct perf_event_attr attr;
struct arch_hw_breakpoint_ctrl ctrl; struct arch_hw_breakpoint_ctrl ctrl;
struct thread_info *ti = task_thread_info(tsk);
bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx); bp = ptrace_hbp_get_initialised_bp(note_type, tsk, idx);
if (IS_ERR(bp)) if (IS_ERR(bp))
...@@ -613,8 +614,10 @@ static int ptrace_hbp_set_ctrl(unsigned int note_type, ...@@ -613,8 +614,10 @@ static int ptrace_hbp_set_ctrl(unsigned int note_type,
if (err) if (err)
return err; return err;
attr.disabled = 0; attr.disabled = 0;
set_ti_thread_flag(ti, TIF_LOAD_WATCH);
} else { } else {
attr.disabled = 1; attr.disabled = 1;
clear_ti_thread_flag(ti, TIF_LOAD_WATCH);
} }
return modify_user_hw_breakpoint(bp, &attr); return modify_user_hw_breakpoint(bp, &attr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment