Add --[enable|disable]-sbi-exit-code to configure script. With the default value disabled. Add a check for SBI_PASS_EXIT_CODE in the environment, so that passing of the test status is configurable from both the environment and the configure script
Signed-off-by: Jesse Taube jesse@rivosinc.com --- configure | 11 +++++++++++ lib/riscv/io.c | 12 +++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/configure b/configure index 20bf5042..7c949bdc 100755 --- a/configure +++ b/configure @@ -67,6 +67,7 @@ earlycon= console= efi= efi_direct= +sbi_exit_code=0 target_cpu=
# Enable -Werror by default for git repositories only (i.e. developer builds) @@ -141,6 +142,9 @@ usage() { system and run from the UEFI shell. Ignored when efi isn't enabled and defaults to enabled when efi is enabled for riscv64. (arm64 and riscv64 only) + --[enable|disable]-sbi-exit-code + Enable or disable sending pass/fail exit code to SBI SRST. + (disabled by default, riscv only) EOF exit 1 } @@ -236,6 +240,12 @@ while [[ $optno -le $argc ]]; do --disable-efi-direct) efi_direct=n ;; + --enable-sbi-exit-code) + sbi_exit_code=1 + ;; + --disable-sbi-exit-code) + sbi_exit_code=0 + ;; --enable-werror) werror=-Werror ;; @@ -551,6 +561,7 @@ EOF elif [ "$arch" = "riscv32" ] || [ "$arch" = "riscv64" ]; then echo "#define CONFIG_UART_EARLY_BASE ${uart_early_addr}" >> lib/config.h [ "$console" = "sbi" ] && echo "#define CONFIG_SBI_CONSOLE" >> lib/config.h + echo "#define CONFIG_SBI_EXIT_CODE ${sbi_exit_code}" >> lib/config.h echo >> lib/config.h fi echo "#endif" >> lib/config.h diff --git a/lib/riscv/io.c b/lib/riscv/io.c index b1163404..0e666009 100644 --- a/lib/riscv/io.c +++ b/lib/riscv/io.c @@ -162,8 +162,18 @@ void halt(int code);
void exit(int code) { + char *s = getenv("SBI_PASS_EXIT_CODE"); + bool pass_exit = CONFIG_SBI_EXIT_CODE; + printf("\nEXIT: STATUS=%d\n", ((code) << 1) | 1); - sbi_shutdown(code == 0); + + if (s) + pass_exit = (*s == '1' || *s == 'y' || *s == 'Y'); + + if (pass_exit) + sbi_shutdown(code == 0); + else + sbi_shutdown(true); halt(code); __builtin_unreachable(); }