bfin: remove inline keyword
[xenomai-head.git] / src / testsuite / regression / posix / mprotect.c
blob3c4956baa50fd3d7b41f599930d3742faedf0316
1 /*
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.
7 */
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <signal.h>
12 #include <sys/mman.h>
13 #include <pthread.h>
15 #include "check.h"
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)
23 return;
25 pthread_set_mode_np(PTHREAD_WARNSW, 0);
26 fprintf(stderr,
27 "FAILURE %s:%d: %s returned %u instead of %u\n",
28 fn, line, msg, value, expected);
29 exit(EXIT_FAILURE);
32 #define check_value(msg, value, expected) do { \
33 int __value = value; \
34 check_value_inner(__FUNCTION__, __LINE__, msg, __value, \
35 expected); \
36 } while (0)
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",
43 reason);
44 exit(EXIT_FAILURE);
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 };
52 struct sigaction sa;
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, &param));
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");
81 test2_mem[0] = 0xff;
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");
90 test1_mem[0] = 0xff;
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);
101 test1_mem[0] = 0xff;
102 check_value("read zero", zero_mem[0], 0);
104 fprintf(stderr, "Test OK\n");
106 return 0;