platform: qemu-virt: Implement system shutdown
authorNick Kossifidis <mickflemm@gmail.com>
Sun, 17 Feb 2019 02:02:15 +0000 (04:02 +0200)
committerAnup Patel <anup@brainfault.org>
Mon, 18 Feb 2019 03:51:58 +0000 (09:21 +0530)
In order for QEMU to be compatible with Spike, it implements
a simple protocol used for reporting back the simulation's
status, through the memory-mapped "test finisher" device. We
use that protocol to make QEMU exit on system shutdown.

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
platform/qemu/virt/platform.c

index 9dfd4d6..ab40b93 100644 (file)
@@ -5,9 +5,11 @@
  *
  * Authors:
  *   Anup Patel <anup.patel@wdc.com>
+ *   Nick Kossifidis <mick@ics.forth.gr>
  */
 
 #include <sbi/riscv_encoding.h>
+#include <sbi/riscv_io.h>
 #include <sbi/sbi_const.h>
 #include <sbi/sbi_hart.h>
 #include <sbi/sbi_platform.h>
@@ -19,6 +21,8 @@
 #define VIRT_HART_STACK_SIZE           8192
 
 #define VIRT_TEST_ADDR                 0x100000
+#define VIRT_TEST_FINISHER_FAIL                0x3333
+#define VIRT_TEST_FINISHER_PASS                0x5555
 
 #define VIRT_CLINT_ADDR                        0x2000000
 
@@ -122,7 +126,11 @@ static int virt_timer_init(bool cold_boot)
 
 static int virt_system_down(u32 type)
 {
-       /* For now nothing to do. */
+       /* Tell the "finisher" that the simulation
+        * was successful so that QEMU exits
+        */
+       writew(VIRT_TEST_FINISHER_PASS, (void *)VIRT_TEST_ADDR);
+
        return 0;
 }