From 73eb3f17db3ff0a57a52507eafb5ef78eb5dc66e Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 14 Sep 2012 15:42:54 +0100 Subject: [PATCH] [int13] Zero all possible registers when jumping to a boot sector At least one boot sector (the DUET boot sector used for bootstrapping EFI from a non-EFI system) fails to initialise the high words of registers before using them in calculations, leading to undefined behaviour. Work around such broken boot sectors by explicitly zeroing the contents of all registers apart from %cs:%ip and %ss:%sp. Signed-off-by: Michael Brown --- src/arch/i386/image/bootsector.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/arch/i386/image/bootsector.c b/src/arch/i386/image/bootsector.c index 289be7d709..faf21c6fc7 100644 --- a/src/arch/i386/image/bootsector.c +++ b/src/arch/i386/image/bootsector.c @@ -80,9 +80,22 @@ int call_bootsector ( unsigned int segment, unsigned int offset, "movw %%ss, %%ax\n\t" "movw %%ax, %%cs:saved_ss\n\t" "movw %%sp, %%cs:saved_sp\n\t" - /* Jump to boot sector */ + /* Prepare jump to boot sector */ "pushw %%bx\n\t" "pushw %%di\n\t" + /* Clear all registers */ + "xorl %%eax, %%eax\n\t" + "xorl %%ebx, %%ebx\n\t" + "xorl %%ecx, %%ecx\n\t" + "xorl %%edx, %%edx\n\t" + "xorl %%esi, %%esi\n\t" + "xorl %%edi, %%edi\n\t" + "xorl %%ebp, %%ebp\n\t" + "movw %%ax, %%ds\n\t" + "movw %%ax, %%es\n\t" + "movw %%ax, %%fs\n\t" + "movw %%ax, %%gs\n\t" + /* Jump to boot sector */ "sti\n\t" "lret\n\t" /* Preserved variables */