/* Common Linux target-dependent functionality for AArch64 MTE
- Copyright (C) 2021 Free Software Foundation, Inc.
+ Copyright (C) 2021-2022 Free Software Foundation, Inc.
This file is part of GDB.
/* 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;
}
+
+/* See arch/aarch64-mte-linux.h */
+
+CORE_ADDR
+aarch64_mte_make_ltag_bits (CORE_ADDR value)
+{
+ return value & AARCH64_MTE_LOGICAL_MAX_VALUE;
+}
+
+/* See arch/aarch64-mte-linux.h */
+
+CORE_ADDR
+aarch64_mte_make_ltag (CORE_ADDR value)
+{
+ return (aarch64_mte_make_ltag_bits (value)
+ << AARCH64_MTE_LOGICAL_TAG_START_BIT);
+}
+
+/* See arch/aarch64-mte-linux.h */
+
+CORE_ADDR
+aarch64_mte_set_ltag (CORE_ADDR address, CORE_ADDR tag)
+{
+ /* Remove the existing tag. */
+ address &= ~aarch64_mte_make_ltag (AARCH64_MTE_LOGICAL_MAX_VALUE);
+
+ /* Return the new tagged address. */
+ return address | aarch64_mte_make_ltag (tag);
+}
+
+/* See arch/aarch64-mte-linux.h */
+
+CORE_ADDR
+aarch64_mte_get_ltag (CORE_ADDR address)
+{
+ CORE_ADDR ltag_addr = address >> AARCH64_MTE_LOGICAL_TAG_START_BIT;
+ return aarch64_mte_make_ltag_bits (ltag_addr);
+}