From: Michael Brown Date: Sat, 14 Jun 2008 12:49:26 +0000 (+0100) Subject: [prefix] When we have to hook INT 19, chain to original handler if possible X-Git-Tag: v0.9.4~123 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd0e9bcd221e6d779e99e51998f34253642d13a8;p=thirdparty%2Fipxe.git [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 --- diff --git a/src/arch/i386/prefix/romprefix.S b/src/arch/i386/prefix/romprefix.S index 19e6a9b38..1eb87c370 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 *