/*
    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  <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;

	/* check that we have at least 1 argument */
	if (argc < 2) {
		usage();
	}

	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 = 1; curr_arg < argc; curr_arg++) {
			size += strlen(argv[curr_arg]);
		}
		temp_str = (char *)malloc(size);
		if (!temp_str) {
		    fprintf(stderr, "Unable to malloc memory for string use: %s\n", strerror(errno));
		    exit(255);
		}
		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 */

