From: Keir Fraser Date: Mon, 25 Apr 2011 12:34:20 +0000 (+0100) Subject: tools: hvmloader: attempt to SHUTDOWN_crash on BUG X-Git-Tag: 4.1.1-rc1~28 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=8a13de28a348a568b796c227559e0f5623ff4e5c;p=people%2Fvhanquez%2Fxen.git tools: hvmloader: attempt to SHUTDOWN_crash on BUG Executing UD2 (invalid opcode) triggers a triple fault which signals reboot to the toolstack, rather than crash. Signed-off-by: Ian Campbell Signed-off-by: Keir Fraser xen-unstable changeset: 23245:3539ef956a37 xen-unstable date: Mon Apr 18 18:34:45 2011 +0100 --- diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c index 5ba71f621..b052f3354 100644 --- a/tools/firmware/hvmloader/hvmloader.c +++ b/tools/firmware/hvmloader/hvmloader.c @@ -704,6 +704,9 @@ int main(void) uint32_t etherboot_phys_addr, option_rom_phys_addr, bios32_addr; struct bios_info *bios_info; + /* Initialise hypercall stubs with RET, rendering them no-ops. */ + memset((void *)HYPERCALL_PHYSICAL_ADDRESS, 0xc3 /* RET */, PAGE_SIZE); + printf("HVM Loader\n"); init_hypercalls(); diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index c58ea1071..0daa84fbf 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -25,6 +25,7 @@ #include #include #include +#include void wrmsr(uint32_t idx, uint64_t v) { @@ -538,19 +539,27 @@ int vprintf(const char *fmt, va_list ap) return 0; } +static void __attribute__((noreturn)) crash(void) +{ + struct sched_shutdown shutdown = { .reason = SHUTDOWN_crash }; + printf("*** HVMLoader crashed.\n"); + hypercall_sched_op(SCHEDOP_shutdown, &shutdown); + printf("*** Failed to crash. Halting.\n"); + for ( ; ; ) + asm volatile ( "hlt" ); +} + void __assert_failed(char *assertion, char *file, int line) { - printf("HVMLoader assertion '%s' failed at %s:%d\n", + printf("*** HVMLoader assertion '%s' failed at %s:%d\n", assertion, file, line); - for ( ; ; ) - asm volatile ( "ud2" ); + crash(); } void __bug(char *file, int line) { - printf("HVMLoader bug at %s:%d\n", file, line); - for ( ; ; ) - asm volatile ( "ud2" ); + printf("*** HVMLoader bug at %s:%d\n", file, line); + crash(); } static void validate_hvm_info(struct hvm_info_table *t)