aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2022-07-30 12:15:43 +0200
committerTomas Vanek <vanekt@fbl.cz>2022-08-08 20:51:52 +0000
commit2aaa991a503dc28b087d81b59531c66931ad74d8 (patch)
tree53f20b35fedea50ac6dce5fb7e9ae6023e5abfa1
parentd9940cc9bc6745825abbf7d338df0d1f21c58ab8 (diff)
downloadriscv-openocd-2aaa991a503dc28b087d81b59531c66931ad74d8.zip
riscv-openocd-2aaa991a503dc28b087d81b59531c66931ad74d8.tar.gz
riscv-openocd-2aaa991a503dc28b087d81b59531c66931ad74d8.tar.bz2
target: fix unaligned return of target_get_working_area_avail()
The working area allocation routines use 4 byte word alignment. In the corner case the size of the working area is not aligned, target_alloc_working_area() of size = target_get_working_area_avail() will fail because the size gets aligned up and does not fit to the area which size is aligned down. Align down the result of target_get_working_area_avail() to cope with that corner case. While on it use fancy ALIGN_... macros instead of bitwise and operator. Change-Id: Ia2a1e861c401c2c78fe6323379a3776fb4f47b06 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/7096 Tested-by: jenkins Reviewed-by: Erhan Kurubas <erhan.kurubas@espressif.com> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
-rw-r--r--src/target/target.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/src/target/target.c b/src/target/target.c
index 78073f6..553400d 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -2071,7 +2071,7 @@ int target_alloc_working_area_try(struct target *target, uint32_t size, struct w
struct working_area *new_wa = malloc(sizeof(*new_wa));
if (new_wa) {
new_wa->next = NULL;
- new_wa->size = target->working_area_size & ~3UL; /* 4-byte align */
+ new_wa->size = ALIGN_DOWN(target->working_area_size, 4); /* 4-byte align */
new_wa->address = target->working_area;
new_wa->backup = NULL;
new_wa->user = NULL;
@@ -2082,8 +2082,7 @@ int target_alloc_working_area_try(struct target *target, uint32_t size, struct w
}
/* only allocate multiples of 4 byte */
- if (size % 4)
- size = (size + 3) & (~3UL);
+ size = ALIGN_UP(size, 4);
struct working_area *c = target->working_areas;
@@ -2237,7 +2236,7 @@ uint32_t target_get_working_area_avail(struct target *target)
uint32_t max_size = 0;
if (!c)
- return target->working_area_size;
+ return ALIGN_DOWN(target->working_area_size, 4);
while (c) {
if (c->free && max_size < c->size)