--- gpxe_src/src/arch/i386/prefix/romprefix.S 2010-01-18 21:06:58.000000000 -0500 +++ gpxe_src.int18/src/arch/i386/prefix/romprefix.S 2010-01-20 11:19:31.000000000 -0500 @@ -145,7 +145,7 @@ * Determine whether or not this is a PnP system via a signature * check. If it is PnP, return to the PnP BIOS indicating that we are * a boot-capable device; the BIOS will call our boot execution vector - * if it wants to boot us. If it is not PnP, hook INT 19. + * if it wants to boot us. If it is not PnP, hook INT 18. */ init: /* Preserve registers, clear direction flag, set %ds=%cs */ @@ -273,19 +273,17 @@ testw %ax, %ax je got_bbs no_pnp: /* Not PnP-compliant - therefore cannot be BBS-compliant */ -no_bbs: /* Not BBS-compliant - must hook INT 19 */ - movw $init_message_int19, %si +no_bbs: /* Not BBS-compliant - hooking INT 18 */ + movw $init_message_int18, %si xorw %di, %di call print_message xorw %ax, %ax movw %ax, %es - pushl %es:( 0x19 * 4 ) - popl orig_int19 pushw %gs /* %gs contains runtime %cs */ - pushw $int19_entry - popl %es:( 0x19 * 4 ) + pushw $int18_entry + popl %es:( 0x18 * 4 ) jmp bbs_done -got_bbs: /* BBS compliant - no need to hook INT 19 */ +got_bbs: /* BBS compliant - no need to hook INT 18 */ movw $init_message_bbs, %si xorw %di, %di call print_message @@ -470,9 +468,9 @@ init_message_pmm: .asciz " PMM" .size init_message_pmm, . - init_message_pmm -init_message_int19: - .asciz " INT19" - .size init_message_int19, . - init_message_int19 +init_message_int18: + .asciz " INT18" + .size init_message_int18, . - init_message_int18 init_message_prompt: .asciz "\nPress Ctrl-B to configure " .size init_message_prompt, . - init_message_prompt @@ -517,59 +515,30 @@ lret .size bev_entry, . - bev_entry -/* INT19 entry point +/* INT18 entry point * - * 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). + * Called via the hooked INT 18 if we detected a non-PnP BIOS. + * Use iret to return to firmware */ -int19_entry: - pushw %cs - popw %ds - /* Prompt user to press B to boot */ - movw $int19_message_prompt, %si - xorw %di, %di - call print_message - movw $prodstr, %si - call print_message - movw $int19_message_dots, %si - call print_message - movw $0xdf4e, %bx - call wait_for_key - pushf - xorw %di, %di - call print_kill_line - movw $int19_message_done, %si - call print_message - popf - jz 1f - /* Leave keypress in buffer and start gPXE. The keypress will - * cause the usual initial Ctrl-B prompt to be skipped. - */ +int18_entry: + pushfl + pushal + pushw %gs + pushw %fs + pushw %es + pushw %ds + pushw %cs call exec -1: /* Try to call original INT 19 vector */ - movl %cs:orig_int19, %eax - testl %eax, %eax - je 2f - ljmp *%cs:orig_int19 -2: /* 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 -int19_message_prompt: - .asciz "Press N to skip booting from " - .size int19_message_prompt, . - int19_message_prompt -int19_message_dots: - .asciz "..." - .size int19_message_dots, . - int19_message_dots -int19_message_done: - .asciz "\n\n" - .size int19_message_done, . - int19_message_done - + popw %ds + popw %es + popw %fs + popw %gs + popal + popfl + iret + /* Execute as a boot device * */