xref: /openbmc/qemu/tests/tcg/cris/libc/check_settls1.c (revision 3d9569b8)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <unistd.h>
5 
6 #include <sys/syscall.h>
7 
8 #ifndef SYS_set_thread_area
9 #define SYS_set_thread_area 243
10 #endif
11 
12 int main (void)
13 {
14     unsigned long tp, old_tp;
15     int ret;
16 
17     asm volatile ("move $pid,%0" : "=r" (old_tp));
18     old_tp &= ~0xff;
19 
20     ret = syscall (SYS_set_thread_area, 0xf0);
21     if (ret != -1 || errno != EINVAL) {
22         syscall (SYS_set_thread_area, old_tp);
23         perror ("Invalid thread area accepted:");
24         abort();
25     }
26 
27     ret = syscall (SYS_set_thread_area, 0xeddeed00);
28     if (ret != 0) {
29         perror ("Valid thread area not accepted: ");
30         abort ();
31     }
32 
33     asm volatile ("move $pid,%0" : "=r" (tp));
34     tp &= ~0xff;
35     syscall (SYS_set_thread_area, old_tp);
36 
37     if (tp != 0xeddeed00) {
38         * (volatile int *) 0 = 0;
39         perror ("tls2");
40         abort ();
41     }
42 
43     printf ("pass\n");
44     return EXIT_SUCCESS;
45 }
46