summaryrefslogtreecommitdiffstats
path: root/src/arch/i386/prefix/romprefix.S
diff options
context:
space:
mode:
authorMichael Brown2008-06-14 14:49:26 +0200
committerMichael Brown2008-06-14 14:49:26 +0200
commitcd0e9bcd221e6d779e99e51998f34253642d13a8 (patch)
tree40ab0dd81cf2b95ebf8f248b9da7a3311d5d1d74 /src/arch/i386/prefix/romprefix.S
parent[via-rhine] Fix erroneous uses of memory I/O instead of port I/O (diff)
downloadipxe-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.S16
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
*