1/* This testcase originally provoked an unaligned access fault on Alpha.
2
3   Since Digital Unix and Linux (and probably others) by default fix
4   these up in the kernel, the failure was not visible unless one
5   is sitting at the console examining logs.
6
7   So: If we know how, ask the kernel to deliver SIGBUS instead so
8   that the test case visibly fails.  */
9
10#if defined(__alpha__) && (defined(__linux__) || defined(__osf__))
11#ifdef __linux__
12#include <asm/sysinfo.h>
13#include <asm/unistd.h>
14
15static inline int
16setsysinfo(unsigned long op, void *buffer, unsigned long size,
17           int *start, void *arg, unsigned long flag)
18{
19  syscall(__NR_osf_setsysinfo, op, buffer, size, start, arg, flag);
20}
21
22#else
23#include <sys/sysinfo.h>
24#include <sys/proc.h>
25#endif
26
27static void __attribute__((constructor))
28trap_unaligned(void)
29{
30  unsigned int buf[2];
31  buf[0] = SSIN_UACPROC;
32  buf[1] = UAC_SIGBUS | UAC_NOPRINT;
33  setsysinfo(SSI_NVPAIRS, buf, 1, 0, 0, 0);
34}
35#endif /* alpha */
36
37void foo(char *a, char *b) { }
38
39void showinfo()
40{
41    char uname[33] = "", tty[38] = "/dev/";
42    foo(uname, tty);
43}
44
45int main()
46{
47  showinfo ();
48  exit (0);
49}
50