diff options
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/Makefile | 4 | ||||
-rw-r--r-- | usr.bin/uac/Makefile | 5 | ||||
-rw-r--r-- | usr.bin/uac/uac.1 | 90 | ||||
-rw-r--r-- | usr.bin/uac/uac.c | 134 |
4 files changed, 233 insertions, 0 deletions
diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 9572e7c..2a68194 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 0000000..eb46c1d --- /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 0000000..1470e59 --- /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 0000000..856b9d8 --- /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"); +} |