]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[int13] Zero all possible registers when jumping to a boot sector
authorMichael Brown <mcb30@ipxe.org>
Fri, 14 Sep 2012 14:42:54 +0000 (15:42 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 14 Sep 2012 14:42:54 +0000 (15:42 +0100)
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 <mcb30@ipxe.org>
src/arch/i386/image/bootsector.c

index 289be7d70930d6f282c71d70d5b52249ebd36c77..faf21c6fc7a109a12b77533be21127381a6fdc79 100644 (file)
@@ -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 */