Statistics
| Branch: | Revision:

root / tests / cris / check_settls1.c @ 2917dce4

History | View | Annotate | Download (930 Bytes)

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