2 * Test if implicit pinning of memory via mprotect works.
4 * Copyright (C) Jan Kiszka <jan.kiszka@siemens.com>
6 * Released under the terms of GPLv2.
17 #define MEMSIZE 0x10000
19 static void check_value_inner(const char *fn
, int line
, const char *msg
,
20 int value
, int expected
)
22 if (value
== expected
)
25 pthread_set_mode_np(PTHREAD_WARNSW
, 0);
27 "FAILURE %s:%d: %s returned %u instead of %u\n",
28 fn
, line
, msg
, value
, expected
);
32 #define check_value(msg, value, expected) do { \
33 int __value = value; \
34 check_value_inner(__FUNCTION__, __LINE__, msg, __value, \
38 void sigdebug_handler(int sig
, siginfo_t
*si
, void *context
)
40 unsigned int reason
= si
->si_value
.sival_int
;
42 fprintf(stderr
, "FAILURE: sigdebug_handler triggered, reason %d\n",
47 int main(int argc
, char **argv
)
49 unsigned char *zero_mem
, *test1_mem
, *test2_mem
;
50 struct sched_param param
= { .sched_priority
= 1 };
51 struct timespec zero
= { .tv_sec
= 0, .tv_nsec
= 0 };
54 zero_mem
= check_mmap(mmap(0, MEMSIZE
, PROT_READ
,
55 MAP_PRIVATE
| MAP_ANONYMOUS
, 0, 0));
56 test1_mem
= check_mmap(mmap(0, MEMSIZE
, PROT_READ
,
57 MAP_PRIVATE
| MAP_ANONYMOUS
, 0, 0));
59 sigemptyset(&sa
.sa_mask
);
60 sa
.sa_sigaction
= sigdebug_handler
;
61 sa
.sa_flags
= SA_SIGINFO
;
62 check_unix(sigaction(SIGDEBUG
, &sa
, NULL
));
64 check_unix(mlockall(MCL_CURRENT
| MCL_FUTURE
));
66 check_pthread(pthread_setschedparam(pthread_self(), SCHED_FIFO
, ¶m
));
68 printf("memory read\n");
69 check_value("read mem", test1_mem
[0], 0);
71 pthread_set_mode_np(PTHREAD_WARNSW
, 0);
72 test2_mem
= check_mmap(mmap(0, MEMSIZE
, PROT_READ
| PROT_WRITE
,
73 MAP_PRIVATE
| MAP_ANONYMOUS
, 0, 0));
74 check_unix(mprotect(test2_mem
, MEMSIZE
,
75 PROT_READ
| PROT_WRITE
| PROT_EXEC
));
77 nanosleep(&zero
, NULL
);
78 pthread_set_mode_np(0, PTHREAD_WARNSW
);
80 printf("memory write after exec enable\n");
83 pthread_set_mode_np(PTHREAD_WARNSW
, 0);
84 check_unix(mprotect(test1_mem
, MEMSIZE
, PROT_READ
| PROT_WRITE
));
86 nanosleep(&zero
, NULL
);
87 pthread_set_mode_np(0, PTHREAD_WARNSW
);
89 printf("memory write after write enable\n");
91 check_value("read zero", zero_mem
[0], 0);
93 pthread_set_mode_np(PTHREAD_WARNSW
, 0);
95 test1_mem
= check_mmap(mmap(0, MEMSIZE
, PROT_NONE
,
96 MAP_PRIVATE
| MAP_ANONYMOUS
, 0, 0));
97 check_unix(mprotect(test1_mem
, MEMSIZE
, PROT_READ
| PROT_WRITE
));
99 printf("memory read/write after access enable\n");
100 check_value("read mem", test1_mem
[0], 0);
102 check_value("read zero", zero_mem
[0], 0);
104 fprintf(stderr
, "Test OK\n");