1 /* $OpenBSD: sfuid.c,v 1.1 2004/05/13 01:22:05 mickey Exp $ */ 2 3 /* 4 * Written by Michael Shalayeff, 2004. Public Domain. 5 */ 6 7 #include <sys/param.h> 8 #include <signal.h> 9 #include <unistd.h> 10 #include <stdio.h> 11 #include <err.h> 12 13 #define sfuid(i,r) __asm __volatile( \ 14 "spop1,%1,0 %0" : "=r" (r) : "i" (i)) 15 16 volatile int sfu; 17 18 void 19 sigill(int sig, siginfo_t *sip, void *scp) 20 { 21 char buf[1024]; 22 23 snprintf(buf, sizeof buf, "sfuid(%d) not decoded\n", sfu); 24 write(STDOUT_FILENO, buf, strlen(buf)); 25 _exit(1); 26 } 27 28 int 29 main(int argc, char *argv[]) 30 { 31 struct sigaction sa; 32 int rv; 33 34 sa.sa_sigaction = &sigill; 35 sa.sa_flags = SA_SIGINFO; 36 sigemptyset(&sa.sa_mask); 37 sigaction(SIGILL, &sa, NULL); 38 39 #define test_sfuid(i,rv) \ 40 rv = -1, sfu = i; \ 41 sfuid(i, rv); \ 42 if (rv != 0) \ 43 errx(1, "sfuid(%d) returned %d", i, rv); 44 45 sfuid(0, rv); 46 sfuid(1, rv); 47 sfuid(2, rv); 48 sfuid(3, rv); 49 sfuid(4, rv); 50 sfuid(5, rv); 51 sfuid(6, rv); 52 sfuid(7, rv); 53 54 exit(0); 55 } 56