diff options
author | Michael Brown | 2008-06-14 14:49:26 +0200 |
---|---|---|
committer | Michael Brown | 2008-06-14 14:49:26 +0200 |
commit | cd0e9bcd221e6d779e99e51998f34253642d13a8 (patch) | |
tree | 40ab0dd81cf2b95ebf8f248b9da7a3311d5d1d74 /src/arch/i386/prefix/romprefix.S | |
parent | [via-rhine] Fix erroneous uses of memory I/O instead of port I/O (diff) | |
download | ipxe-cd0e9bcd221e6d779e99e51998f34253642d13a8.tar.gz ipxe-cd0e9bcd221e6d779e99e51998f34253642d13a8.tar.xz ipxe-cd0e9bcd221e6d779e99e51998f34253642d13a8.zip |
[prefix] When we have to hook INT 19, chain to original handler if possible
When the BIOS doesn't support BBS, hooking INT 19 is the only way to add
ourselves as a boot device. If we have to do this, we should at least
try to chain to the original INT 19 vector if our boot fails.
Idea suggested by Andrew Schran <aschran@google.com>
Diffstat (limited to 'src/arch/i386/prefix/romprefix.S')
-rw-r--r-- | src/arch/i386/prefix/romprefix.S | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/arch/i386/prefix/romprefix.S b/src/arch/i386/prefix/romprefix.S index 19e6a9b3..1eb87c37 100644 --- a/src/arch/i386/prefix/romprefix.S +++ b/src/arch/i386/prefix/romprefix.S @@ -173,6 +173,8 @@ hook_int19: call print_message xorw %ax, %ax movw %ax, %es + pushl %es:( 0x19 * 4 ) + popl orig_int19 pushw %cs pushw $int19_entry popl %es:( 0x19 * 4 ) @@ -345,14 +347,24 @@ bev_entry: /* INT19 entry point * - * Called via the hooked INT 19 if we detected a non-PnP BIOS. + * Called via the hooked INT 19 if we detected a non-PnP BIOS. We + * attempt to return via the original INT 19 vector (if we were able to + * store it). */ int19_entry: pushw %cs call exec - /* No real way to return from INT19 */ + movl %cs:orig_int19, %eax + testl %eax, %eax + je 1f + /* Chain to original INT 19 vector */ + ljmp *%cs:orig_int19 +1: /* No chained vector: issue INT 18 as a last resort */ int $0x18 .size int19_entry, . - int19_entry +orig_int19: + .long 0 + .size orig_int19, . - orig_int19 /* Execute as a boot device * |