Simplify syscall_fixup[_on_sysexit]

* syscall.c (syscall_fixup): Remove checks for entering(tcp).
Remove code which executes if exiting(tcp).
(syscall_fixup_on_sysexit): Remove code which executes
if entering(tcp). Remove checks for exiting(tcp).

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
diff --git a/syscall.c b/syscall.c
index 521ca10..57fd131 100644
--- a/syscall.c
+++ b/syscall.c
@@ -1250,66 +1250,43 @@
 #ifdef USE_PROCFS
 	int scno = known_scno(tcp);
 
-	if (entering(tcp)) {
-		if (tcp->status.PR_WHY != PR_SYSENTRY) {
-			if (
-			    scno == SYS_fork
+	if (tcp->status.PR_WHY != PR_SYSENTRY) {
+		if (
+		    scno == SYS_fork
 #ifdef SYS_vfork
-			    || scno == SYS_vfork
-#endif /* SYS_vfork */
+		    || scno == SYS_vfork
+#endif
 #ifdef SYS_fork1
-			    || scno == SYS_fork1
-#endif /* SYS_fork1 */
+		    || scno == SYS_fork1
+#endif
 #ifdef SYS_forkall
-			    || scno == SYS_forkall
-#endif /* SYS_forkall */
+		    || scno == SYS_forkall
+#endif
 #ifdef SYS_rfork1
-			    || scno == SYS_rfork1
-#endif /* SYS_fork1 */
+		    || scno == SYS_rfork1
+#endif
 #ifdef SYS_rforkall
-			    || scno == SYS_rforkall
-#endif /* SYS_rforkall */
-			    ) {
-				/* We are returning in the child, fake it. */
-				tcp->status.PR_WHY = PR_SYSENTRY;
-				trace_syscall(tcp);
-				tcp->status.PR_WHY = PR_SYSEXIT;
-			}
-			else {
-				fprintf(stderr, "syscall: missing entry\n");
-				tcp->flags |= TCB_INSYSCALL;
-			}
+		    || scno == SYS_rforkall
+#endif
+		    ) {
+			/* We are returning in the child, fake it. */
+			tcp->status.PR_WHY = PR_SYSENTRY;
+			trace_syscall(tcp);
+			tcp->status.PR_WHY = PR_SYSEXIT;
 		}
-	}
-	else {
-		if (tcp->status.PR_WHY != PR_SYSEXIT) {
-			fprintf(stderr, "syscall: missing exit\n");
-			tcp->flags &= ~TCB_INSYSCALL;
+		else {
+			fprintf(stderr, "syscall: missing entry\n");
+			tcp->flags |= TCB_INSYSCALL;
 		}
 	}
 #endif /* USE_PROCFS */
 
 #ifdef SUNOS4
-	if (entering(tcp)) {
-		if (scno == 0) {
-			fprintf(stderr, "syscall: missing entry\n");
-			tcp->flags |= TCB_INSYSCALL;
-		}
+	if (scno == 0) {
+		fprintf(stderr, "syscall: missing entry\n");
+		tcp->flags |= TCB_INSYSCALL;
 	}
-	else {
-		if (scno != 0) {
-			if (debug) {
-				/*
-				 * This happens when a signal handler
-				 * for a signal which interrupted a
-				 * a system call makes another system call.
-				 */
-				fprintf(stderr, "syscall: missing exit\n");
-			}
-			tcp->flags &= ~TCB_INSYSCALL;
-		}
-	}
-#endif /* SUNOS4 */
+#endif
 
 #ifdef LINUX
 	/* A common case of "not a syscall entry" is post-execve SIGTRAP */
@@ -1318,7 +1295,7 @@
 	 * Every extra ptrace call is expensive, so check EAX
 	 * on syscall entry only if PTRACE_O_TRACEEXEC is not enabled:
 	 */
-	if (entering(tcp) && !(ptrace_setoptions & PTRACE_O_TRACEEXEC)) {
+	if (!(ptrace_setoptions & PTRACE_O_TRACEEXEC)) {
 		if (upeek(tcp, 4*EAX, &eax) < 0)
 			return -1;
 		if (eax != -ENOSYS) {
@@ -1328,7 +1305,7 @@
 		}
 	}
 #elif defined (X86_64)
-	if (entering(tcp) && !(ptrace_setoptions & PTRACE_O_TRACEEXEC)) {
+	if (!(ptrace_setoptions & PTRACE_O_TRACEEXEC)) {
 		if (upeek(tcp, 8*RAX, &rax) < 0)
 			return -1;
 		if (current_personality == 1)
@@ -1344,21 +1321,11 @@
 		return -1;
 	if (syscall_mode != -ENOSYS)
 		syscall_mode = tcp->scno;
-	if (gpr2 != syscall_mode && entering(tcp)) {
+	if (gpr2 != syscall_mode) {
 		if (debug)
 			fprintf(stderr, "not a syscall entry (gpr2 = %ld)\n", gpr2);
 		return 0;
 	}
-	else if (((tcp->flags & (TCB_INSYSCALL|TCB_WAITEXECVE))
-		  == (TCB_INSYSCALL|TCB_WAITEXECVE))
-		 && (gpr2 == -ENOSYS || gpr2 == tcp->scno)) {
-		/*
-		 * Return from execve.
-		 * Fake a return value of zero.  We leave the TCB_WAITEXECVE
-		 * flag set for the post-execve SIGTRAP to see and reset.
-		 */
-		gpr2 = 0;
-	}
 #elif defined (POWERPC)
 # define SO_MASK 0x10000000
 	if (upeek(tcp, sizeof(unsigned long)*PT_CCR, &flags) < 0)
@@ -1370,15 +1337,13 @@
 #elif defined (M68K)
 	if (upeek(tcp, 4*PT_D0, &d0) < 0)
 		return -1;
-	if (d0 != -ENOSYS && entering(tcp)) {
+	if (d0 != -ENOSYS) {
 		if (debug)
 			fprintf(stderr, "not a syscall entry (d0 = %ld)\n", d0);
 		return 0;
 	}
 #elif defined (ARM)
-	/*
-	 * Nothing required
-	 */
+	/* Nothing required */
 #elif defined(BFIN)
 	if (upeek(tcp, PT_R0, &r0) < 0)
 		return -1;
@@ -1390,7 +1355,7 @@
 		return -1;
 	if (upeek(tcp, PT_R8, &r8) < 0)
 		return -1;
-	if (ia32 && r8 != -ENOSYS && entering(tcp)) {
+	if (ia32 && r8 != -ENOSYS) {
 		if (debug)
 			fprintf(stderr, "not a syscall entry (r8 = %ld)\n", r8);
 		return 0;
@@ -1398,7 +1363,7 @@
 #elif defined(CRISV10) || defined(CRISV32)
 	if (upeek(tcp, 4*PT_R10, &r10) < 0)
 		return -1;
-	if (r10 != -ENOSYS && entering(tcp)) {
+	if (r10 != -ENOSYS) {
 		if (debug)
 			fprintf(stderr, "not a syscall entry (r10 = %ld)\n", r10);
 		return 0;
@@ -1406,7 +1371,7 @@
 #elif defined(MICROBLAZE)
 	if (upeek(tcp, 3 * 4, &r3) < 0)
 		return -1;
-	if (r3 != -ENOSYS && entering(tcp)) {
+	if (r3 != -ENOSYS) {
 		if (debug)
 			fprintf(stderr, "not a syscall entry (r3 = %ld)\n", r3);
 		return 0;
@@ -1998,55 +1963,15 @@
 syscall_fixup_on_sysexit(struct tcb *tcp)
 {
 #ifdef USE_PROCFS
-	int scno = known_scno(tcp);
-
-	if (entering(tcp)) {
-		if (tcp->status.PR_WHY != PR_SYSENTRY) {
-			if (
-			    scno == SYS_fork
-#ifdef SYS_vfork
-			    || scno == SYS_vfork
-#endif /* SYS_vfork */
-#ifdef SYS_fork1
-			    || scno == SYS_fork1
-#endif /* SYS_fork1 */
-#ifdef SYS_forkall
-			    || scno == SYS_forkall
-#endif /* SYS_forkall */
-#ifdef SYS_rfork1
-			    || scno == SYS_rfork1
-#endif /* SYS_fork1 */
-#ifdef SYS_rforkall
-			    || scno == SYS_rforkall
-#endif /* SYS_rforkall */
-			    ) {
-				/* We are returning in the child, fake it. */
-				tcp->status.PR_WHY = PR_SYSENTRY;
-				trace_syscall(tcp);
-				tcp->status.PR_WHY = PR_SYSEXIT;
-			}
-			else {
-				fprintf(stderr, "syscall: missing entry\n");
-				tcp->flags |= TCB_INSYSCALL;
-			}
-		}
-	}
-	else {
-		if (tcp->status.PR_WHY != PR_SYSEXIT) {
-			fprintf(stderr, "syscall: missing exit\n");
-			tcp->flags &= ~TCB_INSYSCALL;
-		}
+	if (tcp->status.PR_WHY != PR_SYSEXIT) {
+		fprintf(stderr, "syscall: missing exit\n");
+		tcp->flags &= ~TCB_INSYSCALL;
 	}
 #endif /* USE_PROCFS */
 
 #ifdef SUNOS4
-	if (entering(tcp)) {
-		if (scno == 0) {
-			fprintf(stderr, "syscall: missing entry\n");
-			tcp->flags |= TCB_INSYSCALL;
-		}
-	}
-	else {
+	{
+		int scno = known_scno(tcp);
 		if (scno != 0) {
 			if (debug) {
 				/*
@@ -2062,45 +1987,12 @@
 #endif /* SUNOS4 */
 
 #ifdef LINUX
-	/* A common case of "not a syscall entry" is post-execve SIGTRAP */
-#if defined (I386)
-	/* With PTRACE_O_TRACEEXEC, post-execve SIGTRAP is disabled.
-	 * Every extra ptrace call is expensive, so check EAX
-	 * on syscall entry only if PTRACE_O_TRACEEXEC is not enabled:
-	 */
-	if (entering(tcp) && !(ptrace_setoptions & PTRACE_O_TRACEEXEC)) {
-		if (upeek(tcp, 4*EAX, &eax) < 0)
-			return -1;
-		if (eax != -ENOSYS) {
-			if (debug)
-				fprintf(stderr, "not a syscall entry (eax = %ld)\n", eax);
-			return 0;
-		}
-	}
-#elif defined (X86_64)
-	if (entering(tcp) && !(ptrace_setoptions & PTRACE_O_TRACEEXEC)) {
-		if (upeek(tcp, 8*RAX, &rax) < 0)
-			return -1;
-		if (current_personality == 1)
-			rax = (long int)(int)rax; /* sign extend from 32 bits */
-		if (rax != -ENOSYS && entering(tcp)) {
-			if (debug)
-				fprintf(stderr, "not a syscall entry (rax = %ld)\n", rax);
-			return 0;
-		}
-	}
-#elif defined (S390) || defined (S390X)
+#if defined (S390) || defined (S390X)
 	if (upeek(tcp, PT_GPR2, &gpr2) < 0)
 		return -1;
 	if (syscall_mode != -ENOSYS)
 		syscall_mode = tcp->scno;
-	if (gpr2 != syscall_mode && entering(tcp)) {
-		if (debug)
-			fprintf(stderr, "not a syscall entry (gpr2 = %ld)\n", gpr2);
-		return 0;
-	}
-	else if (((tcp->flags & (TCB_INSYSCALL|TCB_WAITEXECVE))
-		  == (TCB_INSYSCALL|TCB_WAITEXECVE))
+	if ((tcp->flags & TCB_WAITEXECVE)
 		 && (gpr2 == -ENOSYS || gpr2 == tcp->scno)) {
 		/*
 		 * Return from execve.
@@ -2120,15 +2012,8 @@
 #elif defined (M68K)
 	if (upeek(tcp, 4*PT_D0, &d0) < 0)
 		return -1;
-	if (d0 != -ENOSYS && entering(tcp)) {
-		if (debug)
-			fprintf(stderr, "not a syscall entry (d0 = %ld)\n", d0);
-		return 0;
-	}
 #elif defined (ARM)
-	/*
-	 * Nothing required
-	 */
+	/* Nothing required */
 #elif defined(BFIN)
 	if (upeek(tcp, PT_R0, &r0) < 0)
 		return -1;
@@ -2140,27 +2025,12 @@
 		return -1;
 	if (upeek(tcp, PT_R8, &r8) < 0)
 		return -1;
-	if (ia32 && r8 != -ENOSYS && entering(tcp)) {
-		if (debug)
-			fprintf(stderr, "not a syscall entry (r8 = %ld)\n", r8);
-		return 0;
-	}
 #elif defined(CRISV10) || defined(CRISV32)
 	if (upeek(tcp, 4*PT_R10, &r10) < 0)
 		return -1;
-	if (r10 != -ENOSYS && entering(tcp)) {
-		if (debug)
-			fprintf(stderr, "not a syscall entry (r10 = %ld)\n", r10);
-		return 0;
-	}
 #elif defined(MICROBLAZE)
 	if (upeek(tcp, 3 * 4, &r3) < 0)
 		return -1;
-	if (r3 != -ENOSYS && entering(tcp)) {
-		if (debug)
-			fprintf(stderr, "not a syscall entry (r3 = %ld)\n", r3);
-		return 0;
-	}
 #endif
 #endif /* LINUX */
 	return 1;