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