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
20volatile int sfu;
21
22void
23sigill(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
32int
33main(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
63int
64main(int argc, char *argv[])
65{
66	printf("SKIPPED\n");
67	exit(0);
68}
69
70#endif
71