xref: /openbsd/regress/sys/arch/hppa/sfuid/sfuid.c (revision 3d8817e4)
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