From 0746f49b1dd44ce17b21468b9f8d9715e116a991 Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Thu, 29 Apr 2021 15:10:06 -0300 Subject: [PATCH] [AArch64] Fix off-by-one when calculating tag granules. When we want to fetch tags from a memory range, the last address in that range is not included. There is a off-by-one error in aarch64_mte_get_tag_granules, which this patch fixes. gdb/ChangeLog: 2021-05-13 Luis Machado * arch/aarch64-mte-linux.c (aarch64_mte_get_tag_granules): Don't include the last address in the range. --- gdb/ChangeLog | 5 +++++ gdb/arch/aarch64-mte-linux.c | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fe75cee4b5e..d41183682c9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2021-05-13 Luis Machado + + * arch/aarch64-mte-linux.c (aarch64_mte_get_tag_granules): Don't + include the last address in the range. + 2021-05-12 Simon Marchi * python/python-internal.h (gdbpy_parse_command_name): Return diff --git a/gdb/arch/aarch64-mte-linux.c b/gdb/arch/aarch64-mte-linux.c index 959c0247ed5..7c2ae9a7058 100644 --- a/gdb/arch/aarch64-mte-linux.c +++ b/gdb/arch/aarch64-mte-linux.c @@ -31,9 +31,10 @@ aarch64_mte_get_tag_granules (CORE_ADDR addr, size_t len, size_t granule_size) /* Start address */ CORE_ADDR s_addr = align_down (addr, granule_size); /* End address */ - CORE_ADDR e_addr = align_down (addr + len, granule_size); + CORE_ADDR e_addr = align_down (addr + len - 1, granule_size); - /* We always have at least 1 granule. */ + /* We always have at least 1 granule because len is non-zero at this + point. */ return 1 + (e_addr - s_addr) / granule_size; } -- 2.30.2