flash/nor: improved API of flash_driver.info & fixed buffer overruns
[fw/openocd] / src / flash / nor / psoc6.c
index c7141738d00cc0454fe83f04a61d5418431fad07..c65411bb9cfb98ce85609ada2ca5e0c56d424e5d 100644 (file)
@@ -151,12 +151,6 @@ static int sromalgo_prepare(struct target *target)
        if (hr != ERROR_OK)
                return hr;
 
-       /* Restore THUMB bit in xPSR register */
-       const struct armv7m_common *cm = target_to_armv7m(target);
-       hr = cm->store_core_reg_u32(target, ARMV7M_xPSR, 0x01000000);
-       if (hr != ERROR_OK)
-               return hr;
-
        /* Allocate Working Area for Stack and Flash algorithm */
        hr = target_alloc_working_area(target, RAM_STACK_WA_SIZE, &g_stack_area);
        if (hr != ERROR_OK)
@@ -378,7 +372,7 @@ static int call_sromapi(struct target *target,
 
        bool is_success = (*data_out & SROMAPI_STATUS_MSK) == SROMAPI_STAT_SUCCESS;
        if (!is_success) {
-               LOG_ERROR("SROM API execution failed. Status: 0x%08X", (uint32_t)*data_out);
+               LOG_ERROR("SROM API execution failed. Status: 0x%08" PRIX32, *data_out);
                return ERROR_TARGET_FAILURE;
        }
 
@@ -501,7 +495,7 @@ static const char *protection_to_str(uint8_t protection)
  * @param buf_size size of the buffer
  * @return ERROR_OK in case of success, ERROR_XXX code otherwise
  *************************************************************************************************/
-static int psoc6_get_info(struct flash_bank *bank, char *buf, int buf_size)
+static int psoc6_get_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct psoc6_target_info *psoc6_info = bank->driver_priv;
 
@@ -512,10 +506,10 @@ static int psoc6_get_info(struct flash_bank *bank, char *buf, int buf_size)
        if (hr != ERROR_OK)
                return hr;
 
-       snprintf(buf, buf_size,
-               "PSoC6 Silicon ID: 0x%08X\n"
+       command_print_sameline(cmd,
+               "PSoC6 Silicon ID: 0x%08" PRIX32 "\n"
                "Protection: %s\n"
-               "Main Flash size: %d kB\n"
+               "Main Flash size: %" PRIu32 " kB\n"
                "Work Flash size: 32 kB\n",
                psoc6_info->silicon_id,
                protection_to_str(psoc6_info->protection),
@@ -585,10 +579,8 @@ static int psoc6_probe(struct flash_bank *bank)
        /* Calculate size of Main Flash*/
        uint32_t flash_sz_bytes = bank_cnt * row_cnt * row_sz;
 
-       if (bank->sectors) {
-               free(bank->sectors);
-               bank->sectors = NULL;
-       }
+       free(bank->sectors);
+       bank->sectors = NULL;
 
        size_t bank_size = 0;
 
@@ -662,7 +654,7 @@ static int psoc6_erase_sector(struct flash_bank *bank, struct working_area *wa,
 {
        struct target *target = bank->target;
 
-       LOG_DEBUG("Erasing SECTOR @%08X", addr);
+       LOG_DEBUG("Erasing SECTOR @%08" PRIX32, addr);
 
        int hr = target_write_u32(target, wa->address, SROMAPI_ERASESECTOR_REQ);
        if (hr != ERROR_OK)
@@ -675,7 +667,7 @@ static int psoc6_erase_sector(struct flash_bank *bank, struct working_area *wa,
        uint32_t data_out;
        hr = call_sromapi(target, SROMAPI_ERASESECTOR_REQ, wa->address, &data_out);
        if (hr != ERROR_OK)
-               LOG_ERROR("SECTOR @%08X not erased!", addr);
+               LOG_ERROR("SECTOR @%08" PRIX32 " not erased!", addr);
 
        return hr;
 }
@@ -691,7 +683,7 @@ static int psoc6_erase_row(struct flash_bank *bank, struct working_area *wa, uin
 {
        struct target *target = bank->target;
 
-       LOG_DEBUG("Erasing ROW @%08X", addr);
+       LOG_DEBUG("Erasing ROW @%08" PRIX32, addr);
 
        int hr = target_write_u32(target, wa->address, SROMAPI_ERASEROW_REQ);
        if (hr != ERROR_OK)
@@ -704,7 +696,7 @@ static int psoc6_erase_row(struct flash_bank *bank, struct working_area *wa, uin
        uint32_t data_out;
        hr = call_sromapi(target, SROMAPI_ERASEROW_REQ, wa->address, &data_out);
        if (hr != ERROR_OK)
-               LOG_ERROR("ROW @%08X not erased!", addr);
+               LOG_ERROR("ROW @%08" PRIX32 " not erased!", addr);
 
        return hr;
 }
@@ -794,7 +786,7 @@ static int psoc6_program_row(struct flash_bank *bank,
        uint32_t data_out;
        int hr = ERROR_OK;
 
-       LOG_DEBUG("Programming ROW @%08X", addr);
+       LOG_DEBUG("Programming ROW @%08" PRIX32, addr);
 
        hr = target_alloc_working_area(target, psoc6_info->row_sz + 32, &wa);
        if (hr != ERROR_OK)
@@ -865,7 +857,7 @@ static int psoc6_program(struct flash_bank *bank,
 
                hr = psoc6_program_row(bank, aligned_addr, page_buf, is_sflash);
                if (hr != ERROR_OK) {
-                       LOG_ERROR("Failed to program Flash at address 0x%08X", aligned_addr);
+                       LOG_ERROR("Failed to program Flash at address 0x%08" PRIX32, aligned_addr);
                        goto exit;
                }
 
@@ -881,7 +873,6 @@ exit:
 
 /** ***********************************************************************************************
  * @brief Performs Mass Erase operation
- * @param bank flash bank index to erase
  * @return ERROR_OK in case of success, ERROR_XXX code otherwise
  *************************************************************************************************/
 COMMAND_HANDLER(psoc6_handle_mass_erase_command)
@@ -910,7 +901,7 @@ COMMAND_HANDLER(psoc6_handle_mass_erase_command)
  * @param target current target
  * @return ERROR_OK in case of success, ERROR_XXX code otherwise
  *************************************************************************************************/
-int handle_reset_halt(struct target *target)
+static int handle_reset_halt(struct target *target)
 {
        int hr;
        uint32_t reset_addr;
@@ -961,11 +952,11 @@ int handle_reset_halt(struct target *target)
         * Ignoring return value of mem_ap_write_atomic_u32 seems to be ok here */
        if (is_cm0) {
                /* Reset the CM0 by asserting SYSRESETREQ. This will also reset CM4 */
-               LOG_INFO("psoc6.cm0: bkpt @0x%08X, issuing SYSRESETREQ", reset_addr);
+               LOG_INFO("psoc6.cm0: bkpt @0x%08" PRIX32 ", issuing SYSRESETREQ", reset_addr);
                mem_ap_write_atomic_u32(cm->debug_ap, NVIC_AIRCR,
                        AIRCR_VECTKEY | AIRCR_SYSRESETREQ);
        } else {
-               LOG_INFO("psoc6.cm4: bkpt @0x%08X, issuing VECTRESET", reset_addr);
+               LOG_INFO("psoc6.cm4: bkpt @0x%08" PRIX32 ", issuing VECTRESET", reset_addr);
                mem_ap_write_atomic_u32(cm->debug_ap, NVIC_AIRCR,
                        AIRCR_VECTKEY | AIRCR_VECTRESET);
        }