From 257c30c1d9041013dd3b01a91857ab25e86cac91 Mon Sep 17 00:00:00 2001 From: Marek Vrbka Date: Fri, 25 Aug 2023 15:29:19 +0200 Subject: [PATCH] target/riscv: Reject size 2 soft breakpoints when C extension not supported This patch disables software breakpoints of size 2 for targets which don't support compressed instructions. Change-Id: I8200b22a51c97ba2aa89e6328beadde8dd35cdd5 Signed-off-by: Marek Vrbka --- src/target/riscv/riscv.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c index ac48abd793..88aa553588 100644 --- a/src/target/riscv/riscv.c +++ b/src/target/riscv/riscv.c @@ -1198,15 +1198,17 @@ static int riscv_add_breakpoint(struct target *target, struct breakpoint *breakp LOG_TARGET_DEBUG(target, "@0x%" TARGET_PRIxADDR, breakpoint->address); assert(breakpoint); if (breakpoint->type == BKPT_SOFT) { - /** @todo check RVC for size/alignment */ - if (!(breakpoint->length == 4 || breakpoint->length == 2)) { - LOG_TARGET_ERROR(target, "Invalid breakpoint length %d", breakpoint->length); + const bool c_extension_supported = riscv_supports_extension(target, 'C'); + if (!(breakpoint->length == 4 || (breakpoint->length == 2 && c_extension_supported))) { + LOG_TARGET_ERROR(target, "Invalid breakpoint length %d, supported lengths: %s", breakpoint->length, + c_extension_supported ? "2, 4" : "4"); return ERROR_FAIL; } - if (0 != (breakpoint->address % 2)) { - LOG_TARGET_ERROR(target, "Invalid breakpoint alignment for address 0x%" TARGET_PRIxADDR, - breakpoint->address); + const unsigned int required_align = c_extension_supported ? 2 : 4; + if (0 != (breakpoint->address % required_align)) { + LOG_TARGET_ERROR(target, "Invalid breakpoint alignment for address 0x%" TARGET_PRIxADDR + ", required alignment: %u", breakpoint->address, required_align); return ERROR_FAIL; }