diff options
author | Tomas Vanek <vanekt@fbl.cz> | 2022-07-30 12:15:43 +0200 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2022-08-08 20:51:52 +0000 |
commit | 2aaa991a503dc28b087d81b59531c66931ad74d8 (patch) | |
tree | 53f20b35fedea50ac6dce5fb7e9ae6023e5abfa1 /src/target | |
parent | d9940cc9bc6745825abbf7d338df0d1f21c58ab8 (diff) | |
download | riscv-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>
Diffstat (limited to 'src/target')
-rw-r--r-- | src/target/target.c | 7 |
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) |