xref: /qemu/tests/tcg/aarch64/test-826.c (revision a09863610aefe17390612b7d78d3fba20e43b53e)
1*b17ab470SRichard Henderson #include <sys/mman.h>
2*b17ab470SRichard Henderson #include <unistd.h>
3*b17ab470SRichard Henderson #include <signal.h>
4*b17ab470SRichard Henderson #include <stdlib.h>
5*b17ab470SRichard Henderson #include <stdio.h>
6*b17ab470SRichard Henderson #include <assert.h>
7*b17ab470SRichard Henderson 
8*b17ab470SRichard Henderson static void *expected;
9*b17ab470SRichard Henderson 
sigsegv(int sig,siginfo_t * info,void * vuc)10*b17ab470SRichard Henderson void sigsegv(int sig, siginfo_t *info, void *vuc)
11*b17ab470SRichard Henderson {
12*b17ab470SRichard Henderson     ucontext_t *uc = vuc;
13*b17ab470SRichard Henderson 
14*b17ab470SRichard Henderson     assert(info->si_addr == expected);
15*b17ab470SRichard Henderson     uc->uc_mcontext.pc += 4;
16*b17ab470SRichard Henderson }
17*b17ab470SRichard Henderson 
main()18*b17ab470SRichard Henderson int main()
19*b17ab470SRichard Henderson {
20*b17ab470SRichard Henderson     struct sigaction sa = {
21*b17ab470SRichard Henderson         .sa_sigaction = sigsegv,
22*b17ab470SRichard Henderson         .sa_flags = SA_SIGINFO
23*b17ab470SRichard Henderson     };
24*b17ab470SRichard Henderson 
25*b17ab470SRichard Henderson     void *page;
26*b17ab470SRichard Henderson     long ofs;
27*b17ab470SRichard Henderson 
28*b17ab470SRichard Henderson     if (sigaction(SIGSEGV, &sa, NULL) < 0) {
29*b17ab470SRichard Henderson         perror("sigaction");
30*b17ab470SRichard Henderson         return EXIT_FAILURE;
31*b17ab470SRichard Henderson     }
32*b17ab470SRichard Henderson 
33*b17ab470SRichard Henderson     page = mmap(0, getpagesize(), PROT_NONE, MAP_PRIVATE | MAP_ANON, -1, 0);
34*b17ab470SRichard Henderson     if (page == MAP_FAILED) {
35*b17ab470SRichard Henderson         perror("mmap");
36*b17ab470SRichard Henderson         return EXIT_FAILURE;
37*b17ab470SRichard Henderson     }
38*b17ab470SRichard Henderson 
39*b17ab470SRichard Henderson     ofs = 0x124;
40*b17ab470SRichard Henderson     expected = page + ofs;
41*b17ab470SRichard Henderson 
42*b17ab470SRichard Henderson     asm("ptrue p0.d, vl1\n\t"
43*b17ab470SRichard Henderson         "dup z0.d, %0\n\t"
44*b17ab470SRichard Henderson         "ldnt1h {z1.d}, p0/z, [z0.d, %1]\n\t"
45*b17ab470SRichard Henderson         "dup z1.d, %1\n\t"
46*b17ab470SRichard Henderson         "ldnt1h {z0.d}, p0/z, [z1.d, %0]"
47*b17ab470SRichard Henderson         : : "r"(page), "r"(ofs) : "v0", "v1");
48*b17ab470SRichard Henderson 
49*b17ab470SRichard Henderson     return EXIT_SUCCESS;
50*b17ab470SRichard Henderson }
51