From dce9a03cb2c50ef6c3f084c7d13325369559ebce Mon Sep 17 00:00:00 2001 From: Tomas Vanek Date: Tue, 27 Sep 2022 10:13:18 +0200 Subject: [PATCH] flash/nor/rp2040: fix setting sp The num_reg_params parameter of target_run_algorithm() was not updated when setting "sp" was introduced. Therefore "sp" as the last register parameter was not passed to a target algo. Introduce a new helper variable with correct count of register parameters and use it everywhere needed. Change-Id: I934a71380783d98917167f1569145808ef23540f Signed-off-by: Tomas Vanek Reviewed-on: https://review.openocd.org/c/openocd/+/7225 Tested-by: jenkins Reviewed-by: Antonio Borneo Reviewed-by: Jonathan Bell --- src/flash/nor/rp2040.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c index be86bb81e..feff9a6f9 100644 --- a/src/flash/nor/rp2040.c +++ b/src/flash/nor/rp2040.c @@ -111,11 +111,12 @@ static int rp2040_call_rom_func(struct target *target, struct rp2040_flash_bank /* Pass function pointer in r7 */ init_reg_param(&args[n_args], "r7", 32, PARAM_OUT); buf_set_u32(args[n_args].value, 0, 32, func_offset); + /* Setup stack */ init_reg_param(&args[n_args + 1], "sp", 32, PARAM_OUT); buf_set_u32(args[n_args + 1].value, 0, 32, stacktop); + unsigned int n_reg_params = n_args + 2; /* User arguments + r7 + sp */ - - for (unsigned int i = 0; i < n_args + 2; ++i) + for (unsigned int i = 0; i < n_reg_params; ++i) LOG_DEBUG("Set %s = 0x%" PRIx32, args[i].reg_name, buf_get_u32(args[i].value, 0, 32)); /* Actually call the function */ @@ -124,17 +125,19 @@ static int rp2040_call_rom_func(struct target *target, struct rp2040_flash_bank int err = target_run_algorithm( target, 0, NULL, /* No memory arguments */ - n_args + 1, args, /* User arguments + r7 */ + n_reg_params, args, /* User arguments + r7 + sp */ priv->jump_debug_trampoline, priv->jump_debug_trampoline_end, timeout_ms, &alg_info ); - for (unsigned int i = 0; i < n_args + 2; ++i) + + for (unsigned int i = 0; i < n_reg_params; ++i) destroy_reg_param(&args[i]); + if (err != ERROR_OK) LOG_ERROR("Failed to invoke ROM function @0x%" PRIx16, func_offset); - return err; + return err; } /* Finalize flash write/erase/read ID