a2f604b5cd
X-SVN-Rev: 11643
153 lines
4.5 KiB
C
153 lines
4.5 KiB
C
/*
|
|
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 */
|
|
|