diff --git a/src/arch/i386/prefix/romprefix.S b/src/arch/i386/prefix/romprefix.S index e67f476b..c0681607 100644 --- a/src/arch/i386/prefix/romprefix.S +++ b/src/arch/i386/prefix/romprefix.S @@ -9,6 +9,7 @@ #define PNP_SIGNATURE ( '$' + ( 'P' << 8 ) + ( 'n' << 16 ) + ( 'P' << 24 ) ) #define PMM_SIGNATURE ( '$' + ( 'P' << 8 ) + ( 'M' << 16 ) + ( 'M' << 24 ) ) #define STACK_MAGIC ( 'L' + ( 'R' << 8 ) + ( 'E' << 16 ) + ( 'T' << 24 ) ) +#define PNP_GET_BBS_VERSION 0x60 .text .code16 @@ -123,23 +124,41 @@ init: movw $init_message, %si call print_message /* Check for PnP BIOS */ + testw $0x0f, %di /* PnP signature must be aligned - bochs */ + jnz hook_int19 /* uses unalignment to indicate 'fake' PnP. */ cmpl $PNP_SIGNATURE, %es:0(%di) - je ispnp -notpnp: /* Not PnP: hook INT19 */ + jne hook_int19 + /* Is PnP: print PnP message */ + movw $init_message_pnp, %si + call print_message + xchgw %bx, %bx + /* Check for BBS */ + pushw %es:0x1b(%di) /* Real-mode data segment */ + pushw %ds /* &(bbs_version) */ + pushw $bbs_version + pushw $PNP_GET_BBS_VERSION + lcall *%es:0xd(%di) + addw $16, %sp + testw %ax, %ax + jne hook_int19 + movw $init_message_bbs, %si + call print_message + jmp hook_bbs + /* Not BBS-compliant - must hook INT 19 */ +hook_int19: + movw $init_message_int19, %si + call print_message xorw %ax, %ax movw %ax, %es pushw %cs pushw $int19_entry popl %es:( 0x19 * 4 ) - jmp 99f -ispnp: /* Is PnP: print PnP message */ - movw $init_message_pnp, %si - call print_message +hook_bbs: /* Check for PMM */ movw $( 0xe000 - 1 ), %di pmm_scan: incw %di - jz 99f + jz no_pmm movw %di, %es cmpl $PMM_SIGNATURE, %es:0 jne pmm_scan @@ -158,13 +177,13 @@ pmm_scan: pushl $0xffffffff /* No handle */ pushl $( 0x00200000 / 16 ) /* 2MB in paragraphs */ pushw $0x0000 /* pmmAllocate */ - lcall %es:*(7) + lcall *%es:7 addw $12, %sp testw %dx, %dx /* %ax==0 even on success, since align=2MB */ jnz gotpmm movw $init_message_pmm_failed, %si call print_message - jmp 99f + jmp no_pmm gotpmm: /* PMM allocation succeeded: copy ROM to PMM block */ pushal /* PMM presence implies 1kB stack */ movw %ax, %es /* %ax=0 already - see above */ @@ -188,10 +207,10 @@ gotpmm: /* PMM allocation succeeded: copy ROM to PMM block */ loop 1b subb %bl, checksum popal -99: +no_pmm: /* Print CRLF to terminate messages */ - movw $init_message_crlf, %si - call print_message + movw $'\n', %ax + call print_character /* Restore registers */ popw %es popw %ds @@ -202,20 +221,23 @@ gotpmm: /* PMM allocation succeeded: copy ROM to PMM block */ .size init, . - init init_message: - .asciz "gPXE (http://etherboot.org)" + .asciz "gPXE (http://etherboot.org) -" .size init_message, . - init_message init_message_pnp: - .asciz " - PnP BIOS detected" + .asciz " PnP" .size init_message_pnp, . - init_message_pnp +init_message_bbs: + .asciz " BBS" + .size init_message_bbs, . - init_message_bbs init_message_pmm: - .asciz ", using PMM" + .asciz " PMM" .size init_message_pmm, . - init_message_pmm init_message_pmm_failed: - .asciz " (failed)" + .asciz "(failed)" .size init_message_pmm_failed, . - init_message_pmm_failed -init_message_crlf: - .asciz "\n" - .size init_message_crlf, . - init_message_crlf +init_message_int19: + .asciz " INT19" + .size init_message_int19, . - init_message_int19 /* ROM image location * @@ -224,6 +246,7 @@ init_message_crlf: image_source: .long 0 .size image_source, . - image_source + /* Temporary decompression area * * May be either at HIGHMEM_LOADPOINT, or within PMM-allocated block. @@ -232,6 +255,13 @@ decompress_to: .long HIGHMEM_LOADPOINT .size decompress_to, . - decompress_to +/* BBS version + * + * Filled in by BBS BIOS. We ignore the value. + */ +bbs_version: + .word 0 + /* Boot Execution Vector entry point * * Called by the PnP BIOS when it wants to boot us.