From: Denys V. <dvl...@re...> - 2009-02-12 12:55:49
|
2009-02-09 Denys Vlasenko <dvl...@re...> * defs.h: Correct the comment about TCB_SUSPENDED. * strace.c: Fix misplaced #endif. * util.c: Indent preprocessor directives, mark code parts which can never be reached by compilation because of the combination of #if directives. These are likely dead code, I want to remove them later. This patch was born while I was working on an experimental strace version. I did some trivial improvements too and decided that it would be a pity to have them wasted. So I have split them off experimental work and applied to cvs. They are: In strace.c, one #endif was clearly misplaced. This went unnoticed because at least on Linux it doesn't matter. Huge re-indenting of cpp directives in util.c doesn't change anything, but now it's easier to track #if nesting and it's easier to see that there are two large "#if LINUX" blocks which sit in even larger "#else /* !LINUX */" block. I added "DEAD CODE HERE? WE ARE IN 'else !defined LINUX'" line into each in order to test whether this is indeed an unreachable code. (I might have miscounted #if's, after all). Roland, please ACK/NAK. -- vda diff -x CVS -urpN 2009-02-09/defs.h 2009-02-10/defs.h --- 2009-02-09/defs.h 2009-01-26 20:09:38.000000000 +0100 +++ 2009-02-10/defs.h 2009-02-09 19:55:59.000000000 +0100 @@ -353,8 +353,7 @@ struct tcb { #define TCB_INSYSCALL 00004 /* A system call is in progress */ #define TCB_ATTACHED 00010 /* Process is not our own child */ #define TCB_EXITING 00020 /* As far as we know, this process is exiting */ -#define TCB_SUSPENDED 00040 /* Process has done a wait(4), that can - not be allowed to complete just now */ +#define TCB_SUSPENDED 00040 /* Process can not be allowed to resume just now */ #define TCB_BPTSET 00100 /* "Breakpoint" set after fork(2) */ #define TCB_SIGTRAPPED 00200 /* Process wanted to block SIGTRAP */ #define TCB_FOLLOWFORK 00400 /* Process should have forks followed */ diff -x CVS -urpN 2009-02-09/strace.c 2009-02-10/strace.c --- 2009-02-09/strace.c 2009-01-29 21:38:20.000000000 +0100 +++ 2009-02-10/strace.c 2009-02-09 19:55:59.000000000 +0100 @@ -1498,10 +1498,10 @@ resume_from_tcp (struct tcb *tcp) } } } +#endif return error; } -#endif #endif /* !USE_PROCFS */ diff -x CVS -urpN 2009-02-09/util.c 2009-02-10/util.c --- 2009-02-09/util.c 2009-01-17 02:52:54.000000000 +0100 +++ 2009-02-10/util.c 2009-02-09 19:55:59.000000000 +0100 @@ -995,10 +995,10 @@ umovestr(struct tcb *tcp, long addr, int } #ifdef LINUX -#if !defined (SPARC) && !defined(SPARC64) -#define PTRACE_WRITETEXT 101 -#define PTRACE_WRITEDATA 102 -#endif /* !SPARC && !SPARC64 */ +# if !defined (SPARC) && !defined(SPARC64) +# define PTRACE_WRITETEXT 101 +# define PTRACE_WRITEDATA 102 +# endif /* !SPARC && !SPARC64 */ #endif /* LINUX */ #ifdef SUNOS4 @@ -1011,7 +1011,7 @@ long addr; int len; char *laddr; { -#if 0 +# if 0 int n; while (len) { @@ -1025,7 +1025,7 @@ char *laddr; addr += n; laddr += n; } -#else +# else int peek, poke; int n, m; union { @@ -1068,7 +1068,7 @@ char *laddr; } addr += sizeof(long), laddr += m, len -= m; } -#endif +# endif return 0; } @@ -1103,7 +1103,7 @@ long *res; { long val; -#ifdef SUNOS4_KERNEL_ARCH_KLUDGE +# ifdef SUNOS4_KERNEL_ARCH_KLUDGE { static int is_sun4m = -1; struct utsname name; @@ -1125,7 +1125,7 @@ long *res; if (is_sun4m) off += 1024; } -#endif /* SUNOS4_KERNEL_ARCH_KLUDGE */ +# endif /* SUNOS4_KERNEL_ARCH_KLUDGE */ errno = 0; val = do_ptrace(PTRACE_PEEKUSER, tcp, (char *) off, 0); if (val == -1 && errno) { @@ -1150,51 +1150,51 @@ struct tcb *tcp; #ifdef LINUX long pc; -#if defined(I386) +# if defined(I386) if (upeek(tcp, 4*EIP, &pc) < 0) return -1; -#elif defined(X86_64) +# elif defined(X86_64) if (upeek(tcp, 8*RIP, &pc) < 0) return -1; -#elif defined(IA64) +# elif defined(IA64) if (upeek(tcp, PT_B0, &pc) < 0) return -1; -#elif defined(ARM) +# elif defined(ARM) if (upeek(tcp, 4*15, &pc) < 0) return -1; -#elif defined(BFIN) +# elif defined(BFIN) if (upeek(tcp, REG_PC, &pc) < 0) return -1; -#elif defined(POWERPC) +# elif defined(POWERPC) if (upeek(tcp, sizeof(unsigned long)*PT_NIP, &pc) < 0) return -1; -#elif defined(M68K) +# elif defined(M68K) if (upeek(tcp, 4*PT_PC, &pc) < 0) return -1; -#elif defined(ALPHA) +# elif defined(ALPHA) if (upeek(tcp, REG_PC, &pc) < 0) return -1; -#elif defined(MIPS) - if (upeek(tcp, REG_EPC, &pc) < 0) - return -1; -#elif defined(SPARC) || defined(SPARC64) +# elif defined(MIPS) + if (upeek(tcp, REG_EPC, &pc) < 0) + return -1; +# elif defined(SPARC) || defined(SPARC64) struct regs regs; if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0) return -1; pc = regs.r_pc; -#elif defined(S390) || defined(S390X) +# elif defined(S390) || defined(S390X) if(upeek(tcp,PT_PSWADDR,&pc) < 0) return -1; -#elif defined(HPPA) +# elif defined(HPPA) if(upeek(tcp,PT_IAOQ0,&pc) < 0) return -1; -#elif defined(SH) +# elif defined(SH) if (upeek(tcp, 4*REG_PC ,&pc) < 0) return -1; -#elif defined(SH64) +# elif defined(SH64) if (upeek(tcp, REG_PC ,&pc) < 0) return -1; -#endif +# endif return pc; #endif /* LINUX */ @@ -1223,7 +1223,7 @@ struct tcb *tcp; return regs.r_eip; #endif /* FREEBSD */ } -#endif +#endif /* 0 */ void printcall(tcp) @@ -1234,7 +1234,7 @@ struct tcb *tcp; NULL /* crash */) #ifdef LINUX -#ifdef I386 +# ifdef I386 long eip; if (upeek(tcp, 4*EIP, &eip) < 0) { @@ -1243,19 +1243,19 @@ struct tcb *tcp; } tprintf("[%08lx] ", eip); -#elif defined(S390) || defined(S390X) +# elif defined(S390) || defined(S390X) long psw; if(upeek(tcp,PT_PSWADDR,&psw) < 0) { PRINTBADPC; return; } -#ifdef S390 +# ifdef S390 tprintf("[%08lx] ", psw); -#elif S390X +# elif S390X tprintf("[%16lx] ", psw); -#endif +# endif -#elif defined(X86_64) +# elif defined(X86_64) long rip; if (upeek(tcp, 8*RIP, &rip) < 0) { @@ -1263,7 +1263,7 @@ struct tcb *tcp; return; } tprintf("[%16lx] ", rip); -#elif defined(IA64) +# elif defined(IA64) long ip; if (upeek(tcp, PT_B0, &ip) < 0) { @@ -1271,7 +1271,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", ip); -#elif defined(POWERPC) +# elif defined(POWERPC) long pc; if (upeek(tcp, sizeof(unsigned long)*PT_NIP, &pc) < 0) { @@ -1279,7 +1279,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(M68K) +# elif defined(M68K) long pc; if (upeek(tcp, 4*PT_PC, &pc) < 0) { @@ -1287,7 +1287,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(ALPHA) +# elif defined(ALPHA) long pc; if (upeek(tcp, REG_PC, &pc) < 0) { @@ -1295,14 +1295,14 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(SPARC) || defined(SPARC64) +# elif defined(SPARC) || defined(SPARC64) struct regs regs; if (ptrace(PTRACE_GETREGS,tcp->pid,(char *)®s,0) < 0) { PRINTBADPC; return; } tprintf("[%08lx] ", regs.r_pc); -#elif defined(HPPA) +# elif defined(HPPA) long pc; if(upeek(tcp,PT_IAOQ0,&pc) < 0) { @@ -1310,7 +1310,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(MIPS) +# elif defined(MIPS) long pc; if (upeek(tcp, REG_EPC, &pc) < 0) { @@ -1318,7 +1318,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(SH) +# elif defined(SH) long pc; if (upeek(tcp, 4*REG_PC, &pc) < 0) { @@ -1326,7 +1326,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(SH64) +# elif defined(SH64) long pc; if (upeek(tcp, REG_PC, &pc) < 0) { @@ -1334,7 +1334,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(ARM) +# elif defined(ARM) long pc; if (upeek(tcp, 4*15, &pc) < 0) { @@ -1342,7 +1342,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#elif defined(BFIN) +# elif defined(BFIN) long pc; if (upeek(tcp, PT_PC, &pc) < 0) { @@ -1350,7 +1350,7 @@ struct tcb *tcp; return; } tprintf("[%08lx] ", pc); -#endif /* !architecture */ +# endif /* architecture */ #endif /* LINUX */ #ifdef SUNOS4 @@ -1376,32 +1376,37 @@ struct tcb *tcp; #endif /* FREEBSD */ } + +/* + * These #if's are huge, please indent them correctly. + * It's easy to get confused otherwise. + */ #ifndef USE_PROCFS -#if defined LINUX +# if defined LINUX -#include "syscall.h" +# include "syscall.h" -#include <sys/syscall.h> -#ifndef CLONE_PTRACE -# define CLONE_PTRACE 0x00002000 -#endif -#ifndef CLONE_VFORK -# define CLONE_VFORK 0x00004000 -#endif -#ifndef CLONE_VM -# define CLONE_VM 0x00000100 -#endif -#ifndef CLONE_STOPPED -# define CLONE_STOPPED 0x02000000 -#endif +# include <sys/syscall.h> +# ifndef CLONE_PTRACE +# define CLONE_PTRACE 0x00002000 +# endif +# ifndef CLONE_VFORK +# define CLONE_VFORK 0x00004000 +# endif +# ifndef CLONE_VM +# define CLONE_VM 0x00000100 +# endif +# ifndef CLONE_STOPPED +# define CLONE_STOPPED 0x02000000 +# endif -#ifdef IA64 +# ifdef IA64 /* We don't have fork()/vfork() syscalls on ia64 itself, but the ia32 subsystem has them for x86... */ -#define SYS_fork 2 -#define SYS_vfork 190 +# define SYS_fork 2 +# define SYS_vfork 190 typedef unsigned long *arg_setup_state; @@ -1430,9 +1435,9 @@ arg_setup(struct tcb *tcp, arg_setup_sta return 0; } -# define arg_finish_change(tcp, state) 0 +# define arg_finish_change(tcp, state) 0 -#ifdef SYS_fork +# ifdef SYS_fork static int get_arg0 (struct tcb *tcp, arg_setup_state *state, long *valp) { @@ -1460,7 +1465,7 @@ get_arg1 (struct tcb *tcp, arg_setup_sta sizeof(long), (void *) valp); return ret; } -#endif +# endif static int set_arg0 (struct tcb *tcp, arg_setup_state *state, long val) @@ -1497,74 +1502,74 @@ set_arg1 (struct tcb *tcp, arg_setup_sta /* ia64 does not return the input arguments from functions (and syscalls) according to ia64 RSE (Register Stack Engine) behavior. */ -# define restore_arg0(tcp, state, val) ((void) (state), 0) -# define restore_arg1(tcp, state, val) ((void) (state), 0) +# define restore_arg0(tcp, state, val) ((void) (state), 0) +# define restore_arg1(tcp, state, val) ((void) (state), 0) -#elif defined (SPARC) || defined (SPARC64) +# elif defined (SPARC) || defined (SPARC64) typedef struct regs arg_setup_state; -# define arg_setup(tcp, state) \ - (ptrace (PTRACE_GETREGS, tcp->pid, (char *) (state), 0)) -# define arg_finish_change(tcp, state) \ - (ptrace (PTRACE_SETREGS, tcp->pid, (char *) (state), 0)) - -# define get_arg0(tcp, state, valp) (*(valp) = (state)->r_o0, 0) -# define get_arg1(tcp, state, valp) (*(valp) = (state)->r_o1, 0) -# define set_arg0(tcp, state, val) ((state)->r_o0 = (val), 0) -# define set_arg1(tcp, state, val) ((state)->r_o1 = (val), 0) -# define restore_arg0(tcp, state, val) 0 +# define arg_setup(tcp, state) \ + (ptrace (PTRACE_GETREGS, tcp->pid, (char *) (state), 0)) +# define arg_finish_change(tcp, state) \ + (ptrace (PTRACE_SETREGS, tcp->pid, (char *) (state), 0)) + +# define get_arg0(tcp, state, valp) (*(valp) = (state)->r_o0, 0) +# define get_arg1(tcp, state, valp) (*(valp) = (state)->r_o1, 0) +# define set_arg0(tcp, state, val) ((state)->r_o0 = (val), 0) +# define set_arg1(tcp, state, val) ((state)->r_o1 = (val), 0) +# define restore_arg0(tcp, state, val) 0 -#else +# else /* other architectures */ -# if defined S390 || defined S390X +# if defined S390 || defined S390X /* Note: this is only true for the `clone' system call, which handles arguments specially. We could as well say that its first two arguments are swapped relative to other architectures, but that would just be another #ifdef in the calls. */ -# define arg0_offset PT_GPR3 -# define arg1_offset PT_ORIGGPR2 -# define restore_arg0(tcp, state, val) ((void) (state), 0) -# define restore_arg1(tcp, state, val) ((void) (state), 0) -# define arg0_index 1 -# define arg1_index 0 -# elif defined (ALPHA) || defined (MIPS) -# define arg0_offset REG_A0 -# define arg1_offset (REG_A0+1) -# elif defined (POWERPC) -# define arg0_offset (sizeof(unsigned long)*PT_R3) -# define arg1_offset (sizeof(unsigned long)*PT_R4) -# define restore_arg0(tcp, state, val) ((void) (state), 0) -# elif defined (HPPA) -# define arg0_offset PT_GR26 -# define arg1_offset (PT_GR26-4) -# elif defined (X86_64) -# define arg0_offset ((long)(8*(current_personality ? RBX : RDI))) -# define arg1_offset ((long)(8*(current_personality ? RCX : RSI))) -# elif defined (SH) -# define arg0_offset (4*(REG_REG0+4)) -# define arg1_offset (4*(REG_REG0+5)) -# elif defined (SH64) - /* ABI defines arg0 & 1 in r2 & r3 */ -# define arg0_offset (REG_OFFSET+16) -# define arg1_offset (REG_OFFSET+24) -# define restore_arg0(tcp, state, val) 0 -# else -# define arg0_offset 0 -# define arg1_offset 4 -# if defined ARM -# define restore_arg0(tcp, state, val) 0 -# endif -# endif +# define arg0_offset PT_GPR3 +# define arg1_offset PT_ORIGGPR2 +# define restore_arg0(tcp, state, val) ((void) (state), 0) +# define restore_arg1(tcp, state, val) ((void) (state), 0) +# define arg0_index 1 +# define arg1_index 0 +# elif defined (ALPHA) || defined (MIPS) +# define arg0_offset REG_A0 +# define arg1_offset (REG_A0+1) +# elif defined (POWERPC) +# define arg0_offset (sizeof(unsigned long)*PT_R3) +# define arg1_offset (sizeof(unsigned long)*PT_R4) +# define restore_arg0(tcp, state, val) ((void) (state), 0) +# elif defined (HPPA) +# define arg0_offset PT_GR26 +# define arg1_offset (PT_GR26-4) +# elif defined (X86_64) +# define arg0_offset ((long)(8*(current_personality ? RBX : RDI))) +# define arg1_offset ((long)(8*(current_personality ? RCX : RSI))) +# elif defined (SH) +# define arg0_offset (4*(REG_REG0+4)) +# define arg1_offset (4*(REG_REG0+5)) +# elif defined (SH64) + /* ABI defines arg0 & 1 in r2 & r3 */ +# define arg0_offset (REG_OFFSET+16) +# define arg1_offset (REG_OFFSET+24) +# define restore_arg0(tcp, state, val) 0 +# else +# define arg0_offset 0 +# define arg1_offset 4 +# if defined ARM +# define restore_arg0(tcp, state, val) 0 +# endif +# endif typedef int arg_setup_state; -# define arg_setup(tcp, state) (0) -# define arg_finish_change(tcp, state) 0 -# define get_arg0(tcp, cookie, valp) \ - (upeek ((tcp), arg0_offset, (valp))) -# define get_arg1(tcp, cookie, valp) \ - (upeek ((tcp), arg1_offset, (valp))) +# define arg_setup(tcp, state) (0) +# define arg_finish_change(tcp, state) 0 +# define get_arg0(tcp, cookie, valp) \ + (upeek ((tcp), arg0_offset, (valp))) +# define get_arg1(tcp, cookie, valp) \ + (upeek ((tcp), arg1_offset, (valp))) static int set_arg0 (struct tcb *tcp, void *cookie, long val) @@ -1578,19 +1583,19 @@ set_arg1 (struct tcb *tcp, void *cookie, return ptrace (PTRACE_POKEUSER, tcp->pid, (char*)arg1_offset, val); } -#endif +# endif /* architectures */ -#ifndef restore_arg0 -# define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val)) -#endif -#ifndef restore_arg1 -# define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val)) -#endif +# ifndef restore_arg0 +# define restore_arg0(tcp, state, val) set_arg0((tcp), (state), (val)) +# endif +# ifndef restore_arg1 +# define restore_arg1(tcp, state, val) set_arg1((tcp), (state), (val)) +# endif -#ifndef arg0_index -# define arg0_index 0 -# define arg1_index 1 -#endif +# ifndef arg0_index +# define arg0_index 0 +# define arg1_index 1 +# endif int setbpt(struct tcb *tcp) @@ -1618,13 +1623,13 @@ setbpt(struct tcb *tcp) } switch (known_scno(tcp)) { -#ifdef SYS_vfork +# ifdef SYS_vfork case SYS_vfork: -#endif -#ifdef SYS_fork +# endif +# ifdef SYS_fork case SYS_fork: -#endif -#if defined SYS_fork || defined SYS_vfork +# endif +# if defined SYS_fork || defined SYS_vfork if (arg_setup (tcp, &state) < 0 || get_arg0 (tcp, &state, &tcp->inst[0]) < 0 || get_arg1 (tcp, &state, &tcp->inst[1]) < 0 @@ -1637,12 +1642,12 @@ setbpt(struct tcb *tcp) tcp->u_arg[arg1_index] = 0; tcp->flags |= TCB_BPTSET; return 0; -#endif +# endif case SYS_clone: -#ifdef SYS_clone2 +# ifdef SYS_clone2 case SYS_clone2: -#endif +# endif /* ia64 calls directly `clone (CLONE_VFORK | CLONE_VM)' contrary to x86 SYS_vfork above. Even on x86 we turn the vfork semantics into plain fork - each application must not @@ -1686,20 +1691,20 @@ struct tcb *tcp; return 0; } -#else +# else /* !defined LINUX */ int setbpt(tcp) struct tcb *tcp; { - -#ifdef LINUX -#if defined (SPARC) || defined (SPARC64) +# ifdef LINUX + DEAD CODE HERE? WE ARE IN 'else !defined LINUX' +# if defined (SPARC) || defined (SPARC64) /* We simply use the SunOS breakpoint code. */ struct regs regs; unsigned long inst; -#define LOOPA 0x30800000 /* ba,a 0 */ +# define LOOPA 0x30800000 /* ba,a 0 */ if (tcp->flags & TCB_BPTSET) { fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid); @@ -1724,15 +1729,15 @@ struct tcb *tcp; * die with a core dump. * Thus, we are force our way in by taking out two instructions * and insert an eternal loop instead, in expectance of the SIGSTOP - * generated by out PTRACE_ATTACH. + * generated by our PTRACE_ATTACH. * Of cause, if we evaporate ourselves in the middle of all this... */ errno = 0; inst = LOOPA; -#if defined (SPARC64) +# if defined (SPARC64) inst <<= 32; inst |= (tcp->inst[0] & 0xffffffffUL); -#endif +# endif ptrace(PTRACE_POKETEXT, tcp->pid, (char *) tcp->baddr, inst); if(errno) { perror("setbpt: ptrace(PTRACE_POKETEXT, ...)"); @@ -1740,8 +1745,8 @@ struct tcb *tcp; } tcp->flags |= TCB_BPTSET; -#else /* !SPARC && !SPARC64 */ -#ifdef IA64 +# else /* !SPARC && !SPARC64 */ +# ifdef IA64 if (ia32) { # define LOOP 0x0000feeb if (tcp->flags & TCB_BPTSET) { @@ -1777,8 +1782,8 @@ struct tcb *tcp; * This ensures that the newly forked child will loop * endlessly until we've got a chance to attach to it. */ -# define LOOP0 0x0000100000000017 -# define LOOP1 0x4000000000200000 +# define LOOP0 0x0000100000000017 +# define LOOP1 0x4000000000200000 unsigned long addr, ipsr; pid_t pid; @@ -1809,71 +1814,71 @@ struct tcb *tcp; } tcp->flags |= TCB_BPTSET; } -#else /* !IA64 */ +# else /* !IA64 */ -#if defined (I386) || defined(X86_64) -#define LOOP 0x0000feeb -#elif defined (M68K) -#define LOOP 0x60fe0000 -#elif defined (ALPHA) -#define LOOP 0xc3ffffff -#elif defined (POWERPC) -#define LOOP 0x48000000 -#elif defined(ARM) -#define LOOP 0xEAFFFFFE -#elif defined(MIPS) -#define LOOP 0x1000ffff -#elif defined(S390) -#define LOOP 0xa7f40000 /* BRC 15,0 */ -#elif defined(S390X) -#define LOOP 0xa7f4000000000000UL /* BRC 15,0 */ -#elif defined(HPPA) -#define LOOP 0xe81f1ff7 /* b,l,n <loc>,r0 */ -#elif defined(SH) -#ifdef __LITTLE_ENDIAN__ -#define LOOP 0x0000affe -#else -#define LOOP 0xfeaf0000 -#endif -#else -#error unknown architecture -#endif +# if defined (I386) || defined(X86_64) +# define LOOP 0x0000feeb +# elif defined (M68K) +# define LOOP 0x60fe0000 +# elif defined (ALPHA) +# define LOOP 0xc3ffffff +# elif defined (POWERPC) +# define LOOP 0x48000000 +# elif defined(ARM) +# define LOOP 0xEAFFFFFE +# elif defined(MIPS) +# define LOOP 0x1000ffff +# elif defined(S390) +# define LOOP 0xa7f40000 /* BRC 15,0 */ +# elif defined(S390X) +# define LOOP 0xa7f4000000000000UL /* BRC 15,0 */ +# elif defined(HPPA) +# define LOOP 0xe81f1ff7 /* b,l,n <loc>,r0 */ +# elif defined(SH) +# ifdef __LITTLE_ENDIAN__ +# define LOOP 0x0000affe +# else +# define LOOP 0xfeaf0000 +# endif +# else +# error unknown architecture +# endif if (tcp->flags & TCB_BPTSET) { fprintf(stderr, "PANIC: bpt already set in pid %u\n", tcp->pid); return -1; } -#if defined (I386) +# if defined (I386) if (upeek(tcp, 4*EIP, &tcp->baddr) < 0) return -1; -#elif defined (X86_64) +# elif defined (X86_64) if (upeek(tcp, 8*RIP, &tcp->baddr) < 0) return -1; -#elif defined (M68K) +# elif defined (M68K) if (upeek(tcp, 4*PT_PC, &tcp->baddr) < 0) return -1; -#elif defined (ALPHA) +# elif defined (ALPHA) return -1; -#elif defined (ARM) +# elif defined (ARM) return -1; -#elif defined (MIPS) +# elif defined (MIPS) return -1; /* FIXME: I do not know what i do - Flo */ -#elif defined (POWERPC) +# elif defined (POWERPC) if (upeek(tcp, sizeof(unsigned long)*PT_NIP, &tcp->baddr) < 0) return -1; -#elif defined(S390) || defined(S390X) +# elif defined(S390) || defined(S390X) if (upeek(tcp,PT_PSWADDR, &tcp->baddr) < 0) return -1; -#elif defined(HPPA) +# elif defined(HPPA) if (upeek(tcp, PT_IAOQ0, &tcp->baddr) < 0) return -1; tcp->baddr &= ~0x03; -#elif defined(SH) +# elif defined(SH) if (upeek(tcp, 4*REG_PC, &tcp->baddr) < 0) return -1; -#else -#error unknown architecture -#endif +# else +# error unknown architecture +# endif if (debug) fprintf(stderr, "[%d] setting bpt at %lx\n", tcp->pid, tcp->baddr); tcp->inst[0] = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *) tcp->baddr, 0); @@ -1888,23 +1893,23 @@ struct tcb *tcp; } tcp->flags |= TCB_BPTSET; -#endif /* !IA64 */ -#endif /* SPARC || SPARC64 */ -#endif /* LINUX */ +# endif /* !IA64 */ +# endif /* !SPARC && !SPARC64 */ +# endif /* LINUX */ -#ifdef SUNOS4 -#ifdef SPARC /* This code is slightly sparc specific */ +# ifdef SUNOS4 +# ifdef SPARC /* This code is slightly sparc specific */ struct regs regs; -#define BPT 0x91d02001 /* ta 1 */ -#define LOOP 0x10800000 /* ba 0 */ -#define LOOPA 0x30800000 /* ba,a 0 */ -#define NOP 0x01000000 -#if LOOPA +# define BPT 0x91d02001 /* ta 1 */ +# define LOOP 0x10800000 /* ba 0 */ +# define LOOPA 0x30800000 /* ba,a 0 */ +# define NOP 0x01000000 +# if LOOPA static int loopdeloop[1] = {LOOPA}; -#else +# else static int loopdeloop[2] = {LOOP, NOP}; -#endif +# endif if (tcp->flags & TCB_BPTSET) { fprintf(stderr, "PANIC: TCB already set in pid %u\n", tcp->pid); @@ -1938,8 +1943,8 @@ struct tcb *tcp; } tcp->flags |= TCB_BPTSET; -#endif /* SPARC */ -#endif /* SUNOS4 */ +# endif /* SPARC */ +# endif /* SUNOS4 */ return 0; } @@ -1949,22 +1954,23 @@ clearbpt(tcp) struct tcb *tcp; { -#ifdef LINUX -#if defined(I386) || defined(X86_64) +# ifdef LINUX + DEAD CODE HERE? WE ARE IN 'else !defined LINUX' +# if defined(I386) || defined(X86_64) long eip; -#elif defined(POWERPC) +# elif defined(POWERPC) long pc; -#elif defined(M68K) +# elif defined(M68K) long pc; -#elif defined(ALPHA) +# elif defined(ALPHA) long pc; -#elif defined(HPPA) +# elif defined(HPPA) long iaoq; -#elif defined(SH) +# elif defined(SH) long pc; -#endif /* architecture */ +# endif /* architecture */ -#if defined (SPARC) || defined (SPARC64) +# if defined (SPARC) || defined (SPARC64) /* Again, we borrow the SunOS breakpoint code. */ if (!(tcp->flags & TCB_BPTSET)) { fprintf(stderr, "PANIC: TCB not set in pid %u\n", tcp->pid); @@ -1977,7 +1983,7 @@ struct tcb *tcp; return -1; } tcp->flags &= ~TCB_BPTSET; -#elif defined(IA64) +# elif defined(IA64) if (ia32) { unsigned long addr; @@ -2044,7 +2050,7 @@ struct tcb *tcp; return 0; } } -#else /* !IA64 && !SPARC && !SPARC64 */ +# else /* !IA64 && !SPARC && !SPARC64 */ if (debug) fprintf(stderr, "[%d] clearing bpt\n", tcp->pid); @@ -2060,7 +2066,7 @@ struct tcb *tcp; } tcp->flags &= ~TCB_BPTSET; -#ifdef I386 +# ifdef I386 if (upeek(tcp, 4*EIP, &eip) < 0) return -1; if (eip != tcp->baddr) { @@ -2071,7 +2077,7 @@ struct tcb *tcp; eip, tcp->baddr); return 0; } -#elif defined(X86_64) +# elif defined(X86_64) if (upeek(tcp, 8*RIP, &eip) < 0) return -1; if (eip != tcp->baddr) { @@ -2082,7 +2088,7 @@ struct tcb *tcp; eip, tcp->baddr); return 0; } -#elif defined(POWERPC) +# elif defined(POWERPC) if (upeek(tcp, sizeof(unsigned long)*PT_NIP, &pc) < 0) return -1; if (pc != tcp->baddr) { @@ -2092,7 +2098,7 @@ struct tcb *tcp; pc, tcp->baddr); return 0; } -#elif defined(M68K) +# elif defined(M68K) if (upeek(tcp, 4*PT_PC, &pc) < 0) return -1; if (pc != tcp->baddr) { @@ -2102,7 +2108,7 @@ struct tcb *tcp; pc, tcp->baddr); return 0; } -#elif defined(ALPHA) +# elif defined(ALPHA) if (upeek(tcp, REG_PC, &pc) < 0) return -1; if (pc != tcp->baddr) { @@ -2112,7 +2118,7 @@ struct tcb *tcp; pc, tcp->baddr); return 0; } -#elif defined(HPPA) +# elif defined(HPPA) if (upeek(tcp, PT_IAOQ0, &iaoq) < 0) return -1; iaoq &= ~0x03; @@ -2130,7 +2136,7 @@ struct tcb *tcp; */ ptrace(PTRACE_POKEUSER, tcp->pid, (void *)PT_IAOQ0, iaoq); ptrace(PTRACE_POKEUSER, tcp->pid, (void *)PT_IAOQ1, iaoq); -#elif defined(SH) +# elif defined(SH) if (upeek(tcp, 4*REG_PC, &pc) < 0) return -1; if (pc != tcp->baddr) { @@ -2141,16 +2147,16 @@ struct tcb *tcp; return 0; } -#endif /* arch */ -#endif /* !SPARC && !SPARC64 && !IA64 */ -#endif /* LINUX */ +# endif /* arch */ +# endif /* !SPARC && !SPARC64 && !IA64 */ +# endif /* LINUX */ -#ifdef SUNOS4 -#ifdef SPARC +# ifdef SUNOS4 +# ifdef SPARC -#if !LOOPA +# if !LOOPA struct regs regs; -#endif +# endif if (!(tcp->flags & TCB_BPTSET)) { fprintf(stderr, "PANIC: TCB not set in pid %u\n", tcp->pid); @@ -2163,10 +2169,10 @@ struct tcb *tcp; } tcp->flags &= ~TCB_BPTSET; -#if !LOOPA +# if !LOOPA /* * Since we don't have a single instruction breakpoint, we may have - * to adjust the program counter after removing the our `breakpoint'. + * to adjust the program counter after removing our `breakpoint'. */ if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) { perror("clearbpt: ptrace(PTRACE_GETREGS, ...)"); @@ -2178,7 +2184,7 @@ struct tcb *tcp; if (debug) fprintf(stderr, "NOTE: PC not at bpt (pc %#x baddr %#x)\n", - regs.r_pc, tcp->parent->baddr); + regs.r_pc, tcp->baddr); return 0; } if (regs.r_pc != tcp->baddr) @@ -2191,17 +2197,18 @@ struct tcb *tcp; perror("clearbpt: ptrace(PTRACE_SETREGS, ...)"); return -1; } -#endif /* LOOPA */ -#endif /* SPARC */ -#endif /* SUNOS4 */ +# endif /* LOOPA */ +# endif /* SPARC */ +# endif /* SUNOS4 */ return 0; } -#endif +# endif /* !defined LINUX */ #endif /* !USE_PROCFS */ + #ifdef SUNOS4 static int @@ -2262,13 +2269,13 @@ struct tcb *tcp; (int)ld.ld_symb_size, strtab) < 0) goto err; -#if 0 +# if 0 for (cp = strtab; cp < strtab + ld.ld_symb_size; ) { fprintf(stderr, "[symbol: %s]\n", cp); cp += strlen(cp)+1; } return 0; -#endif +# endif for (cp = strtab; cp < strtab + ld.ld_symb_size; ) { if (strcmp(cp, "_vfork") == 0) { if (debug) |