X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fcore.c;h=84408e6a62d6da33bd1fd66de302c585ebfe8d7a;hb=22911a3aedfa01c7a5643de9c21fbb94f6219c38;hp=1bd09b444d9c392d08f6f097937039c9660e8d43;hpb=ee4106ee995a1fc81778f4ebd496d6782e592b63;p=openocd.git diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c index 1bd09b444d..84408e6a62 100644 --- a/src/flash/nor/core.c +++ b/src/flash/nor/core.c @@ -197,7 +197,7 @@ struct flash_bank *get_flash_bank_by_name_noprobe(const char *name) return NULL; } -struct flash_bank *get_flash_bank_by_name(const char *name) +int get_flash_bank_by_name(const char *name, struct flash_bank **bank_result) { struct flash_bank *bank; int retval; @@ -210,11 +210,12 @@ struct flash_bank *get_flash_bank_by_name(const char *name) if (retval != ERROR_OK) { LOG_ERROR("auto_probe failed %d\n", retval); - return NULL; + return retval; } } - return bank; + *bank_result = bank; + return ERROR_OK; } int get_flash_bank_by_num(int num, struct flash_bank **bank) @@ -238,8 +239,9 @@ int get_flash_bank_by_num(int num, struct flash_bank **bank) return ERROR_OK; } -/* lookup flash bank by address */ -struct flash_bank *get_flash_bank_by_addr(struct target *target, uint32_t addr) +/* lookup flash bank by address, bank not found is success, but + * result_bank is set to NULL. */ +int get_flash_bank_by_addr(struct target *target, uint32_t addr, bool check, struct flash_bank **result_bank) { struct flash_bank *c; @@ -252,14 +254,22 @@ struct flash_bank *get_flash_bank_by_addr(struct target *target, uint32_t addr) if (retval != ERROR_OK) { LOG_ERROR("auto_probe failed %d\n", retval); - return NULL; + return retval; } /* check whether address belongs to this flash bank */ if ((addr >= c->base) && (addr <= c->base + (c->size - 1)) && target == c->target) - return c; + { + *result_bank = c; + return ERROR_OK; + } } - LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr); - return NULL; + *result_bank = NULL; + if (check) + { + LOG_ERROR("No flash at address 0x%08" PRIx32 "\n", addr); + return ERROR_FAIL; + } + return ERROR_OK; } int default_flash_mem_blank_check(struct flash_bank *bank) @@ -379,8 +389,9 @@ static int flash_iterate_address_range(struct target *target, int last = -1; int i; - if ((c = get_flash_bank_by_addr(target, addr)) == NULL) - return ERROR_FLASH_DST_OUT_OF_BANK; /* no corresponding bank found */ + int retval = get_flash_bank_by_addr(target, addr, true, &c); + if (retval != ERROR_OK) + return retval; if (c->size == 0 || c->num_sectors == 0) { @@ -588,7 +599,10 @@ int flash_write_unlock(struct target *target, struct image *image, } /* find the corresponding flash bank */ - if ((c = get_flash_bank_by_addr(target, run_address)) == NULL) + retval = get_flash_bank_by_addr(target, run_address, false, &c); + if (retval != ERROR_OK) + return retval; + if (c == NULL) { section++; /* and skip it */ section_offset = 0; @@ -636,7 +650,11 @@ int flash_write_unlock(struct target *target, struct image *image, LOG_INFO("Padding image section %d with %d bytes", section_last-1, pad_bytes); } - assert (run_address + run_size - 1 <= c->base + c->size - 1); + if (run_address + run_size - 1 > c->base + c->size - 1) + { + LOG_ERROR("The image is too big for the flash"); + return ERROR_FAIL; + } /* If we're applying any sector automagic, then pad this * (maybe-combined) segment to the end of its last sector.