diff options
Diffstat (limited to 'kdebug/exit.c')
-rw-r--r-- | kdebug/exit.c | 36 |
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); +} |