blob: 1f471fb69b1aef8b651a889cf75cde388b457e12 [file] [log] [blame]
/*
* 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 */