1*82607a73SIlya Leoshkevich /*
2*82607a73SIlya Leoshkevich * Test that GDB can access PROT_NONE pages.
3*82607a73SIlya Leoshkevich *
4*82607a73SIlya Leoshkevich * SPDX-License-Identifier: GPL-2.0-or-later
5*82607a73SIlya Leoshkevich */
6*82607a73SIlya Leoshkevich #include <assert.h>
7*82607a73SIlya Leoshkevich #include <stdlib.h>
8*82607a73SIlya Leoshkevich #include <string.h>
9*82607a73SIlya Leoshkevich #include <sys/mman.h>
10*82607a73SIlya Leoshkevich #include <unistd.h>
11*82607a73SIlya Leoshkevich
break_here(void * q)12*82607a73SIlya Leoshkevich void break_here(void *q)
13*82607a73SIlya Leoshkevich {
14*82607a73SIlya Leoshkevich }
15*82607a73SIlya Leoshkevich
main(void)16*82607a73SIlya Leoshkevich int main(void)
17*82607a73SIlya Leoshkevich {
18*82607a73SIlya Leoshkevich long pagesize = sysconf(_SC_PAGESIZE);
19*82607a73SIlya Leoshkevich void *p, *q;
20*82607a73SIlya Leoshkevich int err;
21*82607a73SIlya Leoshkevich
22*82607a73SIlya Leoshkevich p = mmap(NULL, pagesize * 2, PROT_READ | PROT_WRITE,
23*82607a73SIlya Leoshkevich MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
24*82607a73SIlya Leoshkevich assert(p != MAP_FAILED);
25*82607a73SIlya Leoshkevich q = p + pagesize - 1;
26*82607a73SIlya Leoshkevich strcpy(q, "42");
27*82607a73SIlya Leoshkevich
28*82607a73SIlya Leoshkevich err = mprotect(p, pagesize * 2, PROT_NONE);
29*82607a73SIlya Leoshkevich assert(err == 0);
30*82607a73SIlya Leoshkevich
31*82607a73SIlya Leoshkevich break_here(q);
32*82607a73SIlya Leoshkevich
33*82607a73SIlya Leoshkevich err = mprotect(p, pagesize * 2, PROT_READ);
34*82607a73SIlya Leoshkevich assert(err == 0);
35*82607a73SIlya Leoshkevich if (getenv("PROT_NONE_PY")) {
36*82607a73SIlya Leoshkevich assert(strcmp(q, "24") == 0);
37*82607a73SIlya Leoshkevich }
38*82607a73SIlya Leoshkevich
39*82607a73SIlya Leoshkevich return EXIT_SUCCESS;
40*82607a73SIlya Leoshkevich }
41