platform: qemu-virt: Implement system shutdown

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>
This commit is contained in:
Nick Kossifidis
2019-02-17 04:02:15 +02:00
committed by Anup Patel
parent b44878b773
commit 51e543511a

View 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;
}