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