um: Make errors to stop ptraced child fatal during startup
authorBenjamin Berg <benjamin@sipsolutions.net>
Fri, 10 Nov 2023 11:03:40 +0000 (12:03 +0100)
committerRichard Weinberger <richard@nod.at>
Thu, 4 Jan 2024 22:33:15 +0000 (23:33 +0100)
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>
arch/um/os-Linux/start_up.c

index 561c08e0cc9cfafac8981345b775bcc17bdb6efc..8b0e98ab842ccaabdb87e0f2e2c796be677d8587 100644 (file)
@@ -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)