/* This testcase originally provoked an unaligned access fault on Alpha.
|
/* This testcase originally provoked an unaligned access fault on Alpha.
|
|
|
Since Digital Unix and Linux (and probably others) by default fix
|
Since Digital Unix and Linux (and probably others) by default fix
|
these up in the kernel, the failure was not visible unless one
|
these up in the kernel, the failure was not visible unless one
|
is sitting at the console examining logs.
|
is sitting at the console examining logs.
|
|
|
So: If we know how, ask the kernel to deliver SIGBUS instead so
|
So: If we know how, ask the kernel to deliver SIGBUS instead so
|
that the test case visibly fails. */
|
that the test case visibly fails. */
|
|
|
#if defined(__alpha__) && (defined(__linux__) || defined(__osf__))
|
#if defined(__alpha__) && (defined(__linux__) || defined(__osf__))
|
#ifdef __linux__
|
#ifdef __linux__
|
#include <asm/sysinfo.h>
|
#include <asm/sysinfo.h>
|
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
|
|
static inline int
|
static inline int
|
setsysinfo(unsigned long op, void *buffer, unsigned long size,
|
setsysinfo(unsigned long op, void *buffer, unsigned long size,
|
int *start, void *arg, unsigned long flag)
|
int *start, void *arg, unsigned long flag)
|
{
|
{
|
syscall(__NR_osf_setsysinfo, op, buffer, size, start, arg, flag);
|
syscall(__NR_osf_setsysinfo, op, buffer, size, start, arg, flag);
|
}
|
}
|
|
|
#else
|
#else
|
#include <sys/sysinfo.h>
|
#include <sys/sysinfo.h>
|
#include <sys/proc.h>
|
#include <sys/proc.h>
|
#endif
|
#endif
|
|
|
static void __attribute__((constructor))
|
static void __attribute__((constructor))
|
trap_unaligned(void)
|
trap_unaligned(void)
|
{
|
{
|
unsigned int buf[2];
|
unsigned int buf[2];
|
buf[0] = SSIN_UACPROC;
|
buf[0] = SSIN_UACPROC;
|
buf[1] = UAC_SIGBUS | UAC_NOPRINT;
|
buf[1] = UAC_SIGBUS | UAC_NOPRINT;
|
setsysinfo(SSI_NVPAIRS, buf, 1, 0, 0, 0);
|
setsysinfo(SSI_NVPAIRS, buf, 1, 0, 0, 0);
|
}
|
}
|
#endif /* alpha */
|
#endif /* alpha */
|
|
|
void foo(char *a, char *b) { }
|
void foo(char *a, char *b) { }
|
|
|
void showinfo()
|
void showinfo()
|
{
|
{
|
char uname[33] = "", tty[38] = "/dev/";
|
char uname[33] = "", tty[38] = "/dev/";
|
foo(uname, tty);
|
foo(uname, tty);
|
}
|
}
|
|
|
int main()
|
int main()
|
{
|
{
|
showinfo ();
|
showinfo ();
|
exit (0);
|
exit (0);
|
}
|
}
|
|
|