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