#include #include #include #include #include #ifndef SYS_set_thread_area #define SYS_set_thread_area 243 #endif int main (void) { unsigned long tp, old_tp; int ret; asm volatile ("move $pid,%0" : "=r" (old_tp)); old_tp &= ~0xff; ret = syscall (SYS_set_thread_area, 0xf0); if (ret != -1 || errno != EINVAL) { syscall (SYS_set_thread_area, old_tp); perror ("Invalid thread area accepted:"); abort(); } ret = syscall (SYS_set_thread_area, 0xeddeed00); if (ret != 0) { perror ("Valid thread area not accepted: "); abort (); } asm volatile ("move $pid,%0" : "=r" (tp)); tp &= ~0xff; syscall (SYS_set_thread_area, old_tp); if (tp != 0xeddeed00) { * (volatile int *) 0 = 0; perror ("tls2"); abort (); } printf ("pass\n"); return EXIT_SUCCESS; }