xref: /openbmc/qemu/tests/tcg/aarch64/mte-4.c (revision 65d6ae4927d2974bcfe9326c3fdfa0fac5c6295b)
1*36cd5fbdSRichard Henderson /*
2*36cd5fbdSRichard Henderson  * Memory tagging, re-reading tag checks.
3*36cd5fbdSRichard Henderson  *
4*36cd5fbdSRichard Henderson  * Copyright (c) 2021 Linaro Ltd
5*36cd5fbdSRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
6*36cd5fbdSRichard Henderson  */
7*36cd5fbdSRichard Henderson 
8*36cd5fbdSRichard Henderson #include "mte.h"
9*36cd5fbdSRichard Henderson 
tagset(void * p,size_t size)10*36cd5fbdSRichard Henderson void __attribute__((noinline)) tagset(void *p, size_t size)
11*36cd5fbdSRichard Henderson {
12*36cd5fbdSRichard Henderson     size_t i;
13*36cd5fbdSRichard Henderson     for (i = 0; i < size; i += 16) {
14*36cd5fbdSRichard Henderson         asm("stg %0, [%0]" : : "r"(p + i));
15*36cd5fbdSRichard Henderson     }
16*36cd5fbdSRichard Henderson }
17*36cd5fbdSRichard Henderson 
tagcheck(void * p,size_t size)18*36cd5fbdSRichard Henderson void __attribute__((noinline)) tagcheck(void *p, size_t size)
19*36cd5fbdSRichard Henderson {
20*36cd5fbdSRichard Henderson     size_t i;
21*36cd5fbdSRichard Henderson     void *c;
22*36cd5fbdSRichard Henderson 
23*36cd5fbdSRichard Henderson     for (i = 0; i < size; i += 16) {
24*36cd5fbdSRichard Henderson         asm("ldg %0, [%1]" : "=r"(c) : "r"(p + i), "0"(p));
25*36cd5fbdSRichard Henderson         assert(c == p);
26*36cd5fbdSRichard Henderson     }
27*36cd5fbdSRichard Henderson }
28*36cd5fbdSRichard Henderson 
main(int ac,char ** av)29*36cd5fbdSRichard Henderson int main(int ac, char **av)
30*36cd5fbdSRichard Henderson {
31*36cd5fbdSRichard Henderson     size_t size = getpagesize() * 4;
32*36cd5fbdSRichard Henderson     long excl = 1;
33*36cd5fbdSRichard Henderson     int *p0, *p1;
34*36cd5fbdSRichard Henderson 
35*36cd5fbdSRichard Henderson     enable_mte(PR_MTE_TCF_ASYNC);
36*36cd5fbdSRichard Henderson     p0 = alloc_mte_mem(size);
37*36cd5fbdSRichard Henderson 
38*36cd5fbdSRichard Henderson     /* Tag the pointer. */
39*36cd5fbdSRichard Henderson     asm("irg %0,%1,%2" : "=r"(p1) : "r"(p0), "r"(excl));
40*36cd5fbdSRichard Henderson 
41*36cd5fbdSRichard Henderson     tagset(p1, size);
42*36cd5fbdSRichard Henderson     tagcheck(p1, size);
43*36cd5fbdSRichard Henderson 
44*36cd5fbdSRichard Henderson     return 0;
45*36cd5fbdSRichard Henderson }
46