Skip to content

Commit

Permalink
[romprefix] Do not clobber stack segment when returning to BIOS
Browse files Browse the repository at this point in the history
Commit c429bf0 ("[romprefix] Store boot bus:dev.fn address as autoboot
device location") introduced a regression by using register %cx to
temporarily hold the PCI bus:dev.fn address, despite the fact that %cx
was already being used to hold the stored BIOS stack segment.
Consequently, when returning to the BIOS after a failed or cancelled
boot attempt, iPXE would end up calling INT 18 with the stack segment
set equal to the PCI bus:dev.fn address.  Writing to essentially
random areas of memory tends to upset even the more robust BIOSes.

Fix by using register %ax to temporarily hold the PCI bus:dev.fn
address.

Reported-by: Anton D. Kachalov <mouse@yandex-team.ru>
Tested-by: Anton D. Kachalov <mouse@yandex-team.ru>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 5, 2014
1 parent ac5c2e8 commit 1137fa3
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/arch/i386/prefix/romprefix.S
Expand Up @@ -740,13 +740,13 @@ exec: /* Set %ds = %cs */
.section ".text16", "awx", @progbits
1:
/* Retrieve PCI bus:dev.fn */
movw init_pci_busdevfn, %cx
movw init_pci_busdevfn, %ax

/* Set up %ds for access to .data16 */
movw %bx, %ds

/* Store PCI bus:dev.fn */
movw %cx, autoboot_busdevfn
movw %ax, autoboot_busdevfn

/* Call main() */
pushl $main
Expand Down

0 comments on commit 1137fa3

Please sign in to comment.