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 Hendersonint 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