flash/stm32l4x: fix scan-build warnings

fix "Declared variable-length array (VLA) has zero size" warnings

while at there instrument the probe function to ensure the flash bank
contains at least 1 sector

Change-Id: I3ba0e6345881557ad1aab2d1b41eee438b49fe04
Signed-off-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/6470
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
Tarek BOCHKATI 2022-05-26 16:20:19 +01:00 committed by Antonio Borneo
parent 4a20a1d1c0
commit 4f42600541
1 changed files with 47 additions and 42 deletions

View File

@ -1078,7 +1078,7 @@ static int stm32l4_get_all_wrpxy(struct flash_bank *bank, enum stm32_bank_id dev
if (dev_bank_id != STM32_BANK1 && stm32l4_info->dual_bank_mode)
wrp2y_sectors_offset = stm32l4_info->bank1_sectors;
if (wrp2y_sectors_offset > -1) {
if (wrp2y_sectors_offset >= 0) {
/* get WRP2AR */
ret = stm32l4_get_one_wrpxy(bank, &wrpxy[(*n_wrp)++], STM32_FLASH_WRP2AR_INDEX, wrp2y_sectors_offset);
if (ret != ERROR_OK)
@ -1220,49 +1220,11 @@ err_lock:
return retval2;
}
static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
static int stm32l4_protect_same_bank(struct flash_bank *bank, enum stm32_bank_id bank_id, int set,
unsigned int first, unsigned int last)
{
struct target *target = bank->target;
struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
int ret = ERROR_OK;
unsigned int i;
if (stm32l4_is_otp(bank)) {
LOG_ERROR("cannot protect/unprotect OTP memory");
return ERROR_FLASH_OPER_UNSUPPORTED;
}
if (target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted");
return ERROR_TARGET_NOT_HALTED;
}
/* the requested sectors could be located into bank1 and/or bank2 */
bool use_bank2 = false;
if (last >= stm32l4_info->bank1_sectors) {
if (first < stm32l4_info->bank1_sectors) {
/* the requested sectors for (un)protection are shared between
* bank 1 and 2, then split the operation */
/* 1- deal with bank 1 sectors */
LOG_DEBUG("The requested sectors for %s are shared between bank 1 and 2",
set ? "protection" : "unprotection");
ret = stm32l4_protect(bank, set, first, stm32l4_info->bank1_sectors - 1);
if (ret != ERROR_OK)
return ret;
/* 2- then continue with bank 2 sectors */
first = stm32l4_info->bank1_sectors;
}
use_bank2 = true;
}
/* refresh the sectors' protection */
ret = stm32l4_protect_check(bank);
if (ret != ERROR_OK)
return ret;
/* check if the desired protection is already configured */
for (i = first; i <= last; i++) {
if (bank->sectors[i].is_protected != set)
@ -1278,7 +1240,7 @@ static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first,
unsigned int n_wrp;
struct stm32l4_wrp wrpxy[4];
ret = stm32l4_get_all_wrpxy(bank, use_bank2 ? STM32_BANK2 : STM32_BANK1, wrpxy, &n_wrp);
int ret = stm32l4_get_all_wrpxy(bank, bank_id, wrpxy, &n_wrp);
if (ret != ERROR_OK)
return ret;
@ -1349,6 +1311,40 @@ static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first,
return stm32l4_write_all_wrpxy(bank, wrpxy, n_wrp);
}
static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
{
struct target *target = bank->target;
struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
if (stm32l4_is_otp(bank)) {
LOG_ERROR("cannot protect/unprotect OTP memory");
return ERROR_FLASH_OPER_UNSUPPORTED;
}
if (target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted");
return ERROR_TARGET_NOT_HALTED;
}
/* refresh the sectors' protection */
int ret = stm32l4_protect_check(bank);
if (ret != ERROR_OK)
return ret;
/* the requested sectors could be located into bank1 and/or bank2 */
if (last < stm32l4_info->bank1_sectors) {
return stm32l4_protect_same_bank(bank, STM32_BANK1, set, first, last);
} else if (first >= stm32l4_info->bank1_sectors) {
return stm32l4_protect_same_bank(bank, STM32_BANK2, set, first, last);
} else {
ret = stm32l4_protect_same_bank(bank, STM32_BANK1, set, first, stm32l4_info->bank1_sectors - 1);
if (ret != ERROR_OK)
return ret;
return stm32l4_protect_same_bank(bank, STM32_BANK2, set, stm32l4_info->bank1_sectors, last);
}
}
/* count is the size divided by stm32l4_info->data_width */
static int stm32l4_write_block(struct flash_bank *bank, const uint8_t *buffer,
uint32_t offset, uint32_t count)
@ -1987,6 +1983,15 @@ static int stm32l4_probe(struct flash_bank *bank)
return ERROR_FAIL;
}
/* ensure that at least there is 1 flash sector / page */
if (num_pages == 0) {
if (stm32l4_info->user_bank_size)
LOG_ERROR("The specified flash size is less than page size");
LOG_ERROR("Flash pages count cannot be zero");
return ERROR_FAIL;
}
LOG_INFO("flash mode : %s-bank", stm32l4_info->dual_bank_mode ? "dual" : "single");
const int gap_size_kb = stm32l4_info->hole_sectors * page_size_kb;