selftests/nolibc: on x86, support exiting with isa-debug-exit
authorWilly Tarreau <w@1wt.eu>
Tue, 19 Jul 2022 21:44:41 +0000 (23:44 +0200)
committerPaul E. McKenney <paulmck@kernel.org>
Wed, 31 Aug 2022 12:17:44 +0000 (05:17 -0700)
QEMU, when started with "-device isa-debug-exit -no-reboot" will exit
with status code 2N+1 when N is written to 0x501. This is particularly
convenient for automated tests but this is not portable. As such we
only enable this on x86_64 when pid==1. In addition, this requires an
ioperm() call but in order not to have to define arch-specific syscalls
we just perform the syscall by hand there.

Signed-off-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
tools/testing/selftests/nolibc/nolibc-test.c

index 291d96b..eeb2547 100644 (file)
@@ -638,6 +638,15 @@ int main(int argc, char **argv, char **envp)
                printf("Leaving init with final status: %d\n", !!ret);
                if (ret == 0)
                        reboot(LINUX_REBOOT_CMD_POWER_OFF);
+#if defined(__x86_64__)
+               /* QEMU started with "-device isa-debug-exit -no-reboot" will
+                * exit with status code 2N+1 when N is written to 0x501. We
+                * hard-code the syscall here as it's arch-dependent.
+                */
+               else if (my_syscall3(__NR_ioperm, 0x501, 1, 1) == 0)
+                       asm volatile ("outb %%al, %%dx" :: "d"(0x501), "a"(0));
+               /* if it does nothing, fall back to the regular panic */
+#endif
        }
 
        printf("Exiting with status %d\n", !!ret);