aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/Makefile4
-rw-r--r--usr.bin/uac/Makefile5
-rw-r--r--usr.bin/uac/uac.190
-rw-r--r--usr.bin/uac/uac.c134
4 files changed, 233 insertions, 0 deletions
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
index 9572e7c1d316..2a681946f9aa 100644
--- a/usr.bin/Makefile
+++ b/usr.bin/Makefile
@@ -224,4 +224,8 @@ SUBDIR+=ar \
strip
.endif
+.if ${MACHINE_ARCH} == "alpha"
+SUBDIR+=uac
+.endif
+
.include <bsd.subdir.mk>
diff --git a/usr.bin/uac/Makefile b/usr.bin/uac/Makefile
new file mode 100644
index 000000000000..eb46c1d10402
--- /dev/null
+++ b/usr.bin/uac/Makefile
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+PROG= uac
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/uac/uac.1 b/usr.bin/uac/uac.1
new file mode 100644
index 000000000000..1470e59a27d3
--- /dev/null
+++ b/usr.bin/uac/uac.1
@@ -0,0 +1,90 @@
+.\" Copyright (c) 2000 David E. O'Brien
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd January 18, 2000
+.Dt UAC 1
+.Os
+.Sh NAME
+.Nm uac
+.Nd Unaligned Access Message Control
+.Sh SYNOPSIS
+.Nm uac
+.Op Fl fprs
+.Sh DESCRIPTION
+.Nm
+sets the per-process handling of "Unaligned Access" events. Unlike many
+other CPU's the DEC Alpha processor cannot access unaligned data. To work
+around this, the Alpha has the ability to fix the UA fault rather than send
+the faulting process a SIGBUS signal. However, doing so does slow down the
+execution of the faulting process.
+At boot up, the DEC Alpha CPU defaults to printing "Fixed up unaligned data
+access for pid nnn at pc 0xADDR" when a UA happens along with fixing it so
+the faulting instruction can continue.
+UA handling settings are inherited by child process.
+Issued with out any options,
+.Mn
+displays the current UA handling for the parent process.
+.Pp
+The options are as follows:
+.Bl -tag -width Fl
+.It Fl f
+Unaligned access errors are not fixed for the parent and its future descendants.
+.It Fl p
+Unaligned access errors are not printed for the parent and its future
+descendants.
+.It Fl r
+Resets the unaligned access error settings back to their bootup defaults.
+.It Fl s
+Unaligned access errors result in a SIGBUS being delivered to the parent and
+its future descendants. This aid in pin pointing the faulting access so it
+debugged.
+.El
+.Sh DIAGNOSTICS
+Exit status is 0 on success, and 1 if the command
+fails for any reason.
+.El
+.Sh COMPATIBILITY
+The
+.Nm
+command syntax is incompatible with the DEC OSF/1 syntax.
+.Sh SEE ALSO
+.Xr signal 3
+.Sh HISTORY
+.Nm
+first appeared in DEC OSF/1.
+.Pp
+.Sh AUTHORS
+The
+.Fx
+version of
+.Nm
+was originally written by
+.An Andrew Gallatin Aq gallatin@cs.duke.edu
+and modified by
+.An David E. O'Brien Aq obrien@FreeBSD.org .
+This
+manual page was written by
+.An David E. O'Brien Aq obrien@FreeBSD.org .
diff --git a/usr.bin/uac/uac.c b/usr.bin/uac/uac.c
new file mode 100644
index 000000000000..856b9d866007
--- /dev/null
+++ b/usr.bin/uac/uac.c
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2000 Andrew Gallatin and David E. O'Brien
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <machine/sysarch.h>
+#include <machine/proc.h>
+
+#include <stdio.h>
+#include <unistd.h>
+#include <err.h>
+
+extern int sysarch(int, char *);
+static void usage ();
+
+struct parms {
+ u_int64_t uac;
+};
+
+int
+alpha_setuac(u_int64_t uac)
+{
+ struct parms p;
+
+ p.uac = uac;
+ return (sysarch(ALPHA_SET_UAC, (char *)&p));
+}
+
+int
+alpha_getuac(u_int64_t *uac)
+{
+ struct parms p;
+ int error;
+
+ error = sysarch(ALPHA_GET_UAC, (char *)&p);
+ *uac = p.uac;
+ return (error);
+}
+
+static void
+print_uac(u_int64_t uac)
+{
+
+ printf("parent printing is ");
+ if (uac & MDP_UAC_NOPRINT)
+ printf("off\n");
+ else
+ printf("on\n");
+
+ printf("parent fixup is ");
+ if (uac & MDP_UAC_NOFIX)
+ printf("off\n");
+ else
+ printf("on\n");
+
+ printf("parent sigbus is ");
+ if (uac & MDP_UAC_SIGBUS)
+ printf("on \n");
+ else
+ printf("off\n");
+}
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ u_int64_t uac;
+
+ if (alpha_getuac(&uac) != 0)
+ err(1, NULL);
+
+ while ((c = getopt(argc, argv, "fpsr")) != -1) {
+ switch (c) {
+ case 'f':
+ uac |= MDP_UAC_NOFIX;
+ break;
+ case 'p':
+ uac |= MDP_UAC_NOPRINT;
+ break;
+ case 's':
+ uac |= MDP_UAC_SIGBUS;
+ break;
+ case 'r':
+ uac = 0;
+ break;
+ default:
+ usage();
+ /* NOTREACHED */
+ }
+ }
+
+ if (argc != 1) {
+ if (alpha_setuac(uac) != 0)
+ err(1, NULL);
+ }
+
+ print_uac(uac);
+ return 0;
+}
+
+static void
+usage ()
+{
+
+ fprintf(stderr, "usage: uac [-fprs]\n");
+}