xref: /qemu/tests/tcg/aarch64/mte-7.c (revision f5e6786de4815751b0a3d2235c760361f228ea48)
1d3327a38SRichard Henderson /*
2d3327a38SRichard Henderson  * Memory tagging, unaligned access crossing pages.
3d3327a38SRichard Henderson  * https://gitlab.com/qemu-project/qemu/-/issues/403
4d3327a38SRichard Henderson  *
5d3327a38SRichard Henderson  * Copyright (c) 2021 Linaro Ltd
6d3327a38SRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
7d3327a38SRichard Henderson  */
8d3327a38SRichard Henderson 
9d3327a38SRichard Henderson #include "mte.h"
10d3327a38SRichard Henderson 
main(int ac,char ** av)11d3327a38SRichard Henderson int main(int ac, char **av)
12d3327a38SRichard Henderson {
13d3327a38SRichard Henderson     void *p;
14d3327a38SRichard Henderson 
15d3327a38SRichard Henderson     enable_mte(PR_MTE_TCF_SYNC);
16d3327a38SRichard Henderson     p = alloc_mte_mem(2 * 0x1000);
17d3327a38SRichard Henderson 
18d3327a38SRichard Henderson     /* Tag the pointer. */
19d3327a38SRichard Henderson     p = (void *)((unsigned long)p | (1ul << 56));
20d3327a38SRichard Henderson 
21d3327a38SRichard Henderson     /* Store tag in sequential granules. */
22*b7559ff7SRichard Henderson     asm("stz2g %0, [%0]" : : "r"(p + 0x0ff0));
23d3327a38SRichard Henderson 
24d3327a38SRichard Henderson     /*
25d3327a38SRichard Henderson      * Perform an unaligned store with tag 1 crossing the pages.
26d3327a38SRichard Henderson      * Failure dies with SIGSEGV.
27d3327a38SRichard Henderson      */
28d3327a38SRichard Henderson     asm("str %0, [%0]" : : "r"(p + 0x0ffc));
29d3327a38SRichard Henderson     return 0;
30d3327a38SRichard Henderson }
31