xref: /openbsd-src/regress/sys/arch/hppa/sfuid/sfuid.c (revision 49a6e16f2c2c8e509184b1f777366d1a6f337e1c)
1 /*	$OpenBSD: sfuid.c,v 1.4 2021/12/13 16:56:49 deraadt Exp $	*/
2 
3 /*
4  * Written by Michael Shalayeff, 2004. Public Domain.
5  */
6 
7 #include <sys/types.h>
8 #include <signal.h>
9 #include <unistd.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <err.h>
14 
15 #ifdef __hppa__
16 
17 #define	sfuid(i,r)	__asm volatile(	\
18     "spop1,%1,0	%0" : "=r" (r) : "i" (i))
19 
20 volatile int sfu;
21 
22 void
sigill(int sig,siginfo_t * sip,void * scp)23 sigill(int sig, siginfo_t *sip, void *scp)
24 {
25 	char buf[1024];
26 
27 	snprintf(buf, sizeof buf, "sfuid(%d) not decoded\n", sfu);
28 	write(STDOUT_FILENO, buf, strlen(buf));
29         _exit(1);
30 }
31 
32 int
main(int argc,char * argv[])33 main(int argc, char *argv[])
34 {
35 	struct sigaction sa;
36 	int rv;
37 
38 	sa.sa_sigaction = &sigill;
39 	sa.sa_flags = SA_SIGINFO;
40 	sigemptyset(&sa.sa_mask);
41 	sigaction(SIGILL, &sa, NULL);
42 
43 #define	test_sfuid(i,rv)	\
44 	rv = -1, sfu = i;	\
45 	sfuid(i, rv);		\
46 	if (rv != 0)		\
47 		errx(1, "sfuid(%d) returned %d", i, rv);
48 
49 	sfuid(0, rv);
50 	sfuid(1, rv);
51 	sfuid(2, rv);
52 	sfuid(3, rv);
53 	sfuid(4, rv);
54 	sfuid(5, rv);
55 	sfuid(6, rv);
56 	sfuid(7, rv);
57 
58 	exit(0);
59 }
60 
61 #else
62 
63 int
main(int argc,char * argv[])64 main(int argc, char *argv[])
65 {
66 	printf("SKIPPED\n");
67 	exit(0);
68 }
69 
70 #endif
71