target algo: do not write reg_param if direction is PARAM_IN
[openocd.git] / src / target / stm8.c
index 4556fd9..f5df248 100644 (file)
@@ -1189,6 +1189,11 @@ static int stm8_write_core_reg(struct target *target, unsigned int num)
        return ERROR_OK;
 }
 
+static const char *stm8_get_gdb_arch(struct target *target)
+{
+       return "stm8";
+}
+
 static int stm8_get_gdb_reg_list(struct target *target, struct reg **reg_list[],
                int *reg_list_size, enum target_register_class reg_class)
 {
@@ -1750,7 +1755,7 @@ static int stm8_examine(struct target *target)
 
 /** Checks whether a memory region is erased. */
 static int stm8_blank_check_memory(struct target *target,
-               target_addr_t address, uint32_t count, uint32_t *blank, uint8_t erased_value)
+               struct target_memory_check_block *blocks, int num_blocks, uint8_t erased_value)
 {
        struct working_area *erase_check_algorithm;
        struct reg_param reg_params[2];
@@ -1778,10 +1783,10 @@ static int stm8_blank_check_memory(struct target *target,
        stm8_info.common_magic = STM8_COMMON_MAGIC;
 
        init_mem_param(&mem_params[0], 0x0, 3, PARAM_OUT);
-       buf_set_u32(mem_params[0].value, 0, 24, address);
+       buf_set_u32(mem_params[0].value, 0, 24, blocks[0].address);
 
        init_mem_param(&mem_params[1], 0x3, 3, PARAM_OUT);
-       buf_set_u32(mem_params[1].value, 0, 24, count);
+       buf_set_u32(mem_params[1].value, 0, 24, blocks[0].size);
 
        init_reg_param(&reg_params[0], "a", 32, PARAM_IN_OUT);
        buf_set_u32(reg_params[0].value, 0, 32, erased_value);
@@ -1795,15 +1800,19 @@ static int stm8_blank_check_memory(struct target *target,
                        10000, &stm8_info);
 
        if (retval == ERROR_OK)
-               *blank = (*(reg_params[0].value) == 0xff);
+               blocks[0].result = (*(reg_params[0].value) == 0xff);
 
        destroy_mem_param(&mem_params[0]);
        destroy_mem_param(&mem_params[1]);
        destroy_reg_param(&reg_params[0]);
+       destroy_reg_param(&reg_params[1]);
 
        target_free_working_area(target, erase_check_algorithm);
 
-       return retval;
+       if (retval != ERROR_OK)
+               return retval;
+
+       return 1;       /* only one block has been checked */
 }
 
 static int stm8_checksum_memory(struct target *target, target_addr_t address,
@@ -1888,6 +1897,9 @@ static int stm8_run_algorithm(struct target *target, int num_mem_params,
        }
 
        for (int i = 0; i < num_reg_params; i++) {
+               if (reg_params[i].direction == PARAM_IN)
+                       continue;
+
                struct reg *reg = register_get_by_name(stm8->core_cache,
                                reg_params[i].reg_name, 0);
 
@@ -2196,6 +2208,7 @@ struct target_type stm8_target = {
        .assert_reset = stm8_reset_assert,
        .deassert_reset = stm8_reset_deassert,
 
+       .get_gdb_arch = stm8_get_gdb_arch,
        .get_gdb_reg_list = stm8_get_gdb_reg_list,
 
        .read_memory = stm8_read_memory,