mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-23 08:35:19 -05:00
um: Make errors to stop ptraced child fatal during startup
For the detection code to check whether SYSEMU_SINGLESTEP works correctly we needed some error cases while stopping to be non-fatal. However, at this point stop_ptraced_child must always succeed, and we can therefore simplify it slightly to exit immediately on error. Signed-off-by: Benjamin Berg <benjamin@sipsolutions.net> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
5713533794
commit
9e16fb933f
1 changed files with 12 additions and 29 deletions
|
@ -112,35 +112,20 @@ static int start_ptraced_child(void)
|
|||
return pid;
|
||||
}
|
||||
|
||||
/* When testing for SYSEMU support, if it is one of the broken versions, we
|
||||
* must just avoid using sysemu, not panic, but only if SYSEMU features are
|
||||
* broken.
|
||||
* So only for SYSEMU features we test mustpanic, while normal host features
|
||||
* must work anyway!
|
||||
*/
|
||||
static int stop_ptraced_child(int pid, int exitcode, int mustexit)
|
||||
static void stop_ptraced_child(int pid, int exitcode)
|
||||
{
|
||||
int status, n, ret = 0;
|
||||
int status, n;
|
||||
|
||||
if (ptrace(PTRACE_CONT, pid, 0, 0) < 0)
|
||||
fatal_perror("stop_ptraced_child : ptrace failed");
|
||||
|
||||
if (ptrace(PTRACE_CONT, pid, 0, 0) < 0) {
|
||||
perror("stop_ptraced_child : ptrace failed");
|
||||
return -1;
|
||||
}
|
||||
CATCH_EINTR(n = waitpid(pid, &status, 0));
|
||||
if (!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
|
||||
int exit_with = WEXITSTATUS(status);
|
||||
if (exit_with == 2)
|
||||
non_fatal("check_ptrace : child exited with status 2. "
|
||||
"\nDisabling SYSEMU support.\n");
|
||||
non_fatal("check_ptrace : child exited with exitcode %d, while "
|
||||
"expecting %d; status 0x%x\n", exit_with,
|
||||
exitcode, status);
|
||||
if (mustexit)
|
||||
exit(1);
|
||||
ret = -1;
|
||||
fatal("stop_ptraced_child : child exited with exitcode %d, "
|
||||
"while expecting %d; status 0x%x\n", exit_with,
|
||||
exitcode, status);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __init check_sysemu(void)
|
||||
|
@ -185,16 +170,14 @@ static void __init check_sysemu(void)
|
|||
goto fail;
|
||||
}
|
||||
}
|
||||
if (stop_ptraced_child(pid, 0, 0) < 0)
|
||||
goto fail_stopped;
|
||||
stop_ptraced_child(pid, 0);
|
||||
|
||||
os_info("OK\n");
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
stop_ptraced_child(pid, 1, 0);
|
||||
fail_stopped:
|
||||
stop_ptraced_child(pid, 1);
|
||||
fatal("missing\n");
|
||||
}
|
||||
|
||||
|
@ -233,7 +216,7 @@ static void __init check_ptrace(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
stop_ptraced_child(pid, 0, 1);
|
||||
stop_ptraced_child(pid, 0);
|
||||
os_info("OK\n");
|
||||
check_sysemu();
|
||||
}
|
||||
|
@ -312,7 +295,7 @@ void __init os_early_checks(void)
|
|||
pid = start_ptraced_child();
|
||||
if (init_pid_registers(pid))
|
||||
fatal("Failed to initialize default registers");
|
||||
stop_ptraced_child(pid, 1, 1);
|
||||
stop_ptraced_child(pid, 1);
|
||||
}
|
||||
|
||||
int __init parse_iomem(char *str, int *add)
|
||||
|
|
Loading…
Add table
Reference in a new issue