aboutsummaryrefslogtreecommitdiff
path: root/kdebug/exit.c
diff options
context:
space:
mode:
Diffstat (limited to 'kdebug/exit.c')
-rw-r--r--kdebug/exit.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/kdebug/exit.c b/kdebug/exit.c
new file mode 100644
index 0000000..a83232d
--- /dev/null
+++ b/kdebug/exit.c
@@ -0,0 +1,36 @@
+/*
+ * See https://stackoverflow.com/questions/42208228/how-to-automatically-close-the-execution-of-the-qemu-after-end-of-process
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/io.h>
+#include <unistd.h>
+
+#define SHUTDOWN_PORT 0x604
+#define EXIT_PORT 0x501
+
+static void clean_exit(void) {
+ ioperm(SHUTDOWN_PORT, 16, 1);
+ outw(0x2000, SHUTDOWN_PORT);
+}
+
+int main(int argc, char **argv) {
+ int status;
+ if (argc != 2) {
+ clean_exit();
+ }
+ status = atoi(argv[1]);
+ printf("exiting with status %d (in three seconds)\n", status);
+ sleep(3);
+ if (!status) {
+ clean_exit();
+ }
+ ioperm(EXIT_PORT, 8, 1);
+ /*
+ * status returned is 1+(2*orig_status)
+ */
+ outb(status-1, EXIT_PORT);
+ printf("didn't exit.. did you include '-device isa-debug-exit'"
+ " in qemu command?\n");
+ exit(1);
+}