/* * ARM MemTag operation helpers. * * This code is licensed under the GNU GPL v2 or later. * * SPDX-License-Identifier: LGPL-2.1-or-later */ #ifndef TARGET_ARM_MTE_H #define TARGET_ARM_MTE_H #include "exec/mmu-access-type.h" /** * allocation_tag_mem_probe: * @env: the cpu environment * @ptr_mmu_idx: the addressing regime to use for the virtual address * @ptr: the virtual address for which to look up tag memory * @ptr_access: the access to use for the virtual address * @ptr_size: the number of bytes in the normal memory access * @tag_access: the access to use for the tag memory * @probe: true to merely probe, never taking an exception * @ra: the return address for exception handling * * Our tag memory is formatted as a sequence of little-endian nibbles. * That is, the byte at (addr >> (LOG2_TAG_GRANULE + 1)) contains two * tags, with the tag at [3:0] for the lower addr and the tag at [7:4] * for the higher addr. * * Here, resolve the physical address from the virtual address, and return * a pointer to the corresponding tag byte. * * If there is no tag storage corresponding to @ptr, return NULL. * * If the page is inaccessible for @ptr_access, or has a watchpoint, there are * three options: * (1) probe = true, ra = 0 : pure probe -- we return NULL if the page is not * accessible, and do not take watchpoint traps. The calling code must * handle those cases in the right priority compared to MTE traps. * (2) probe = false, ra = 0 : probe, no fault expected -- the caller guarantees * that the page is going to be accessible. We will take watchpoint traps. * (3) probe = false, ra != 0 : non-probe -- we will take both memory access * traps and watchpoint traps. * (probe = true, ra != 0 is invalid and will assert.) */ uint8_t *allocation_tag_mem_probe(CPUARMState *env, int ptr_mmu_idx, uint64_t ptr, MMUAccessType ptr_access, int ptr_size, MMUAccessType tag_access, bool probe, uintptr_t ra); /** * load_tag1 - Load 1 tag (nibble) from byte * @ptr: The tagged address * @mem: The tag address (packed, 2 tags in byte) */ int load_tag1(uint64_t ptr, uint8_t *mem); /** * store_tag1 - Store 1 tag (nibble) into byte * @ptr: The tagged address * @mem: The tag address (packed, 2 tags in byte) * @tag: The tag to be stored in the nibble */ void store_tag1(uint64_t ptr, uint8_t *mem, int tag); #endif /* TARGET_ARM_MTE_H */