mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 02:24:58 -06:00
target/arm: Implement the SETG* instructions
The FEAT_MOPS SETG* instructions are very similar to the SET* instructions, but as well as setting memory contents they also set the MTE tags. They are architecturally required to operate on tag-granule aligned regions only. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20230912140434.1333369-10-peter.maydell@linaro.org
This commit is contained in:
parent
179e9a3bac
commit
6087df5744
6 changed files with 155 additions and 9 deletions
|
@ -1041,3 +1041,43 @@ uint64_t mte_mops_probe(CPUARMState *env, uint64_t ptr, uint64_t size,
|
|||
return n * TAG_GRANULE - (ptr - tag_first);
|
||||
}
|
||||
}
|
||||
|
||||
void mte_mops_set_tags(CPUARMState *env, uint64_t ptr, uint64_t size,
|
||||
uint32_t desc)
|
||||
{
|
||||
int mmu_idx, tag_count;
|
||||
uint64_t ptr_tag;
|
||||
void *mem;
|
||||
|
||||
if (!desc) {
|
||||
/* Tags not actually enabled */
|
||||
return;
|
||||
}
|
||||
|
||||
mmu_idx = FIELD_EX32(desc, MTEDESC, MIDX);
|
||||
/* True probe: this will never fault */
|
||||
mem = allocation_tag_mem_probe(env, mmu_idx, ptr, MMU_DATA_STORE, size,
|
||||
MMU_DATA_STORE, true, 0);
|
||||
if (!mem) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* We know that ptr and size are both TAG_GRANULE aligned; store
|
||||
* the tag from the pointer value into the tag memory.
|
||||
*/
|
||||
ptr_tag = allocation_tag_from_addr(ptr);
|
||||
tag_count = size / TAG_GRANULE;
|
||||
if (ptr & TAG_GRANULE) {
|
||||
/* Not 2*TAG_GRANULE-aligned: store tag to first nibble */
|
||||
store_tag1_parallel(TAG_GRANULE, mem, ptr_tag);
|
||||
mem++;
|
||||
tag_count--;
|
||||
}
|
||||
memset(mem, ptr_tag | (ptr_tag << 4), tag_count / 2);
|
||||
if (tag_count & 1) {
|
||||
/* Final trailing unaligned nibble */
|
||||
mem += tag_count / 2;
|
||||
store_tag1_parallel(0, mem, ptr_tag);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue