tools/nolibc/test: on x86, support exiting with isa-debug-exit

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>
diff --git a/tools/include/nolibc/test/nolibc-test.c b/tools/include/nolibc/test/nolibc-test.c
index be3aeb5..f52a10c 100644
--- a/tools/include/nolibc/test/nolibc-test.c
+++ b/tools/include/nolibc/test/nolibc-test.c
@@ -531,6 +531,15 @@
 		 */
 		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);
 	return ret;