--- /dev/null
+/*
+
+ This program is a wrapper to assist in debugging analigned traps on the Alpha
+
+ architectures.
+
+
+
+ COPYRIGHT AND PERMISSION NOTICE
+
+
+
+ Copyright (c) 2002 Sean Hunter
+
+
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+
+ copy of this software and associated documentation files (the
+
+ "Software"), to deal in the Software without restriction, including
+
+ without limitation the rights to use, copy, modify, merge, publish,
+
+ distribute, and/or sell copies of the Software, and to permit persons
+
+ to whom the Software is furnished to do so, provided that the above
+
+ copyright notice(s) and this permission notice appear in all copies of
+
+ the Software and that both the above copyright notice(s) and this
+
+ permission notice appear in supporting documentation.
+
+
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+
+ OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+
+ HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+
+ INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+
+ FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+
+ NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+
+ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+
+ Except as contained in this notice, the name of a copyright holder
+
+ shall not be used in advertising or otherwise to promote the sale, use
+
+ or other dealings in this Software without prior written authorization
+
+ of the copyright holder.
+
+
+
+ --------------------------------------------------------------------------------
+
+ All trademarks and registered trademarks mentioned herein are the property
+
+ of their respective owners.
+
+
+
+*/
+
+#include <errno.h>
+
+#include <stdio.h>
+
+
+
+#include <asm/sysinfo.h>
+
+#include <asm/unistd.h>
+
+
+
+#define TMP_PATH_MAX 1024
+
+
+
+
+
+static int
+
+setsysinfo(unsigned long op, void *buffer, unsigned long size,
+
+ int *start, void *arg, unsigned long flag)
+
+{
+
+ syscall(__NR_osf_setsysinfo, op, buffer, size, start, arg, flag);
+
+}
+
+
+
+
+
+void
+
+trap_unaligned(void)
+
+{
+
+ unsigned int buf[2];
+
+ buf[0] = SSIN_UACPROC;
+
+ buf[1] = UAC_SIGBUS | UAC_NOPRINT;
+
+ setsysinfo(SSI_NVPAIRS, buf, 1, 0, 0, 0);
+
+}
+
+
+
+
+
+static void
+
+usage(void)
+
+{
+
+ fprintf(stderr,
+
+ "usage: unaligned [-b] <command-path> [command-args...]\n\n"
+
+ " This program is designed to assist debugging of\n"
+
+ " unaligned traps by running the program in gdb\n"
+
+ " and causing it to get SIGBUS when it encounters\n"
+
+ " an unaligned trap.\n\n"
+
+ " It is free software written by Sean Hunter <sean@uncarved.co.uk>\n"
+
+ " based on code by Richard Henderson and Andrew Morgan.\n\n"
+
+ );
+
+
+
+ exit(1);
+
+}
+
+
+
+
+
+int
+
+main(int argc, char **argv)
+
+{
+
+ const char my_debugger[] = "/usr/bin/gdb";
+
+
+
+ char *temp_str;
+
+ char *curr;
+
+ int size = 0;
+
+ int curr_arg;
+
+ int isBatchMode = 0;
+
+
+
+ /* check that we have at least 1 argument */
+
+ if (argc < 2) {
+
+ usage();
+
+ }
+
+ if( strcmp("-b" , argv[1]) == 0 ){
+
+ isBatchMode = 1;
+
+ curr_arg = 2;
+
+ }else{
+
+ curr_arg = 1;
+
+ }
+
+
+
+ trap_unaligned();
+
+
+
+ if (argc > 2) {
+
+ /* We're going to use bash process redirection to create a "file" for gdb to read
+
+ * containing the arguments we need */
+
+ size = 2048;
+
+ for(; curr_arg < argc; curr_arg++) {
+
+ size += strlen(argv[curr_arg]);
+
+ }
+
+ temp_str = (char *) malloc(sizeof(char) * size);
+
+ if (!temp_str) {
+
+ fprintf(stderr, "Unable to malloc memory for string use: %s\n", strerror(errno));
+
+ exit(255);
+
+ }
+
+ if(isBatchMode==1){
+
+ sprintf(temp_str, "%s -batch %s -x <( echo file %s; echo set args", my_debugger, argv[2], argv[2]);
+
+ }else{
+
+ sprintf(temp_str, "%s %s -x <( echo file %s; echo set args", my_debugger, argv[1], argv[1]);
+
+ }
+
+ curr = temp_str + strlen(temp_str);
+
+ for(curr_arg = 2; curr_arg < argc; curr_arg++) {
+
+ sprintf(curr, " %s", argv[curr_arg]);
+
+ curr = temp_str + strlen(temp_str);
+
+ }
+
+#ifndef NOAUTORUN
+
+ curr = temp_str + strlen(temp_str);
+
+ sprintf(curr, "; echo run");
+
+#endif
+
+ curr = temp_str + strlen(temp_str);
+
+ sprintf(curr, ")");
+
+
+
+ execlp("/bin/bash", "/bin/bash", "-c", temp_str, NULL);
+
+
+
+ }
+
+ else {
+
+ execlp(my_debugger, my_debugger, argv[1], NULL);
+
+ }
+
+
+
+ /* if we fall through to here, our exec failed -- announce the fact */
+
+ fprintf(stderr, "Unable to execute command: %s\n", strerror(errno));
+
+
+
+ usage();
+
+
+
+}
+
+
+
+/* use gcc unaligned.c -o unaliged to compile. Add -DNOAUTORUN if you
+
+don't want gdb to automatically run the program */
+
+
+