xref: /qemu/tests/tcg/aarch64/lse2-fault.c (revision 6a2c23dd)
16a2c23ddSRichard Henderson #include <sys/mman.h>
26a2c23ddSRichard Henderson #include <sys/shm.h>
36a2c23ddSRichard Henderson #include <unistd.h>
46a2c23ddSRichard Henderson #include <stdio.h>
56a2c23ddSRichard Henderson 
main()66a2c23ddSRichard Henderson int main()
76a2c23ddSRichard Henderson {
86a2c23ddSRichard Henderson     int psize = getpagesize();
96a2c23ddSRichard Henderson     int id;
106a2c23ddSRichard Henderson     void *p;
116a2c23ddSRichard Henderson 
126a2c23ddSRichard Henderson     /*
136a2c23ddSRichard Henderson      * We need a shared mapping to enter CF_PARALLEL mode.
146a2c23ddSRichard Henderson      * The easiest way to get that is shmat.
156a2c23ddSRichard Henderson      */
166a2c23ddSRichard Henderson     id = shmget(IPC_PRIVATE, 2 * psize, IPC_CREAT | 0600);
176a2c23ddSRichard Henderson     if (id < 0) {
186a2c23ddSRichard Henderson         perror("shmget");
196a2c23ddSRichard Henderson         return 2;
206a2c23ddSRichard Henderson     }
216a2c23ddSRichard Henderson     p = shmat(id, NULL, 0);
226a2c23ddSRichard Henderson     if (p == MAP_FAILED) {
236a2c23ddSRichard Henderson         perror("shmat");
246a2c23ddSRichard Henderson         return 2;
256a2c23ddSRichard Henderson     }
266a2c23ddSRichard Henderson 
276a2c23ddSRichard Henderson     /* Protect the second page. */
286a2c23ddSRichard Henderson     if (mprotect(p + psize, psize, PROT_NONE) < 0) {
296a2c23ddSRichard Henderson         perror("mprotect");
306a2c23ddSRichard Henderson         return 2;
316a2c23ddSRichard Henderson     }
326a2c23ddSRichard Henderson 
336a2c23ddSRichard Henderson     /*
346a2c23ddSRichard Henderson      * Load 4 bytes, 6 bytes from the end of the page.
356a2c23ddSRichard Henderson      * On success this will load 0 from the newly allocated shm.
366a2c23ddSRichard Henderson      */
376a2c23ddSRichard Henderson     return *(int *)(p + psize - 6);
386a2c23ddSRichard Henderson }
39