mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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 <ian.campbell@citrix.com> Signed-off-by: Keir Fraser <keir@xen.org> xen-unstable changeset: 23245:3539ef956a37 xen-unstable date: Mon Apr 18 18:34:45 2011 +0100
This commit is contained in:
1 parent
a8bb2c6ec1
commit
a619245a1e
2 files changed
+18
-6
No files matched your search
@@ -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();
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <stdint.h>
|
||||
#include <xen/xen.h>
|
||||
#include <xen/memory.h>
|
||||
#include <xen/sched.h>
|
||||
|
||||
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)
|
||||
|
||||