On 1/24/19 1:00 PM, Andrew Jones wrote: > On Thu, Jan 24, 2019 at 11:16:32AM +0000, Alexandru Elisei wrote: >> On arm and arm64, kvm-unit-tests uses the QEMU chr-testdev device to shut >> down the virtual machine at the end of a test. The function >> psci_system_off() provides another mechanism for terminating the virtual >> machine. If the chr-testdev device hasn't been initialized successfully, >> then use psci_system_off() to terminate the test instead of >> chr_testdev_exit(). >> >> chr-testdev is implemented on top of virtio console. This patch makes it >> possible for a virtual machine manager which doesn't have support for >> chr-testdev, but has been configured not to emulate a virtio console, to >> gracefully terminate a virtual machine after a test has been completed. >> >> There is one limitation to using psci_system_off() to terminate a test: >> chr-testdev allows kvm-unit-tests to specify an exit code; >> psci_system_off() has no such mechanism. >> >> Signed-off-by: Alexandru Elisei <alexandru.elisei@xxxxxxx> >> --- >> lib/arm/io.c | 14 ++++++++++++-- >> 1 file changed, 12 insertions(+), 2 deletions(-) >> >> diff --git a/lib/arm/io.c b/lib/arm/io.c >> index 87435150f73e..9fe9bd0bf659 100644 >> --- a/lib/arm/io.c >> +++ b/lib/arm/io.c >> @@ -11,6 +11,7 @@ >> #include <libcflat.h> >> #include <devicetree.h> >> #include <chr-testdev.h> >> +#include "arm/asm/psci.h" >> #include <asm/spinlock.h> >> #include <asm/io.h> >> >> @@ -18,6 +19,8 @@ >> >> extern void halt(int code); >> >> +static bool testdev_enabled; >> + >> /* >> * Use this guess for the pl011 base in order to make an attempt at >> * having earlier printf support. We'll overwrite it with the real >> @@ -65,8 +68,12 @@ static void uart0_init(void) >> >> void io_init(void) >> { >> + int err; >> + >> uart0_init(); >> - chr_testdev_init(); >> + err = chr_testdev_init(); >> + if (!err) >> + testdev_enabled = true; >> } >> >> void puts(const char *s) >> @@ -79,7 +86,10 @@ void puts(const char *s) >> >> void exit(int code) >> { >> - chr_testdev_exit(code); >> + if (testdev_enabled) >> + chr_testdev_exit(code); >> + else >> + psci_system_off(); >> halt(code); >> __builtin_unreachable(); >> } >> -- >> 2.17.0 >> > chr_testdev_init() ensures vcon is NULL if it fails to initialize. > chr_testdev_exit() immediately returns if vcon is NULL. This was > done by design to allow fallback exits to be placed below the > chr_testdev_exit call, e.g. halt(). > > We should be able to drop patch 3/7 and change exit() to this > > void exit(int code) > { > chr_testdev_exit(code); > psci_system_off(); > halt(code); > __builtin_unreachable(); > } > > Thanks, > drew I wasn't aware of this design decision, thank you for explaining it. I'll implement the changes you suggested, including dropping patch 3/7: "lib: chr-testdev: Make chr_testdev_init() return status".