diff options
| author | Michael Brown | 2012-06-19 19:54:22 +0200 |
|---|---|---|
| committer | Michael Brown | 2012-06-19 20:35:48 +0200 |
| commit | b9ef880c8d50ccb89aef7e820aa737f66b63fd90 (patch) | |
| tree | ed87b0b95fe7bc4c082e33b4787341a3906c0a1b /src/arch | |
| parent | [util] Update mergerom.pl to handle .mrom images (diff) | |
| download | ipxe-b9ef880c8d50ccb89aef7e820aa737f66b63fd90.tar.gz ipxe-b9ef880c8d50ccb89aef7e820aa737f66b63fd90.tar.xz ipxe-b9ef880c8d50ccb89aef7e820aa737f66b63fd90.zip | |
[romprefix] Treat 0xffffffff as an error return from PMM
PMM defines the return code 0xffffffff as meaning "unsupported
function". It's hard to imagine a PMM BIOS that doesn't support
pmmAllocate(), but apparently such things do exist.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/i386/prefix/romprefix.S | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/arch/i386/prefix/romprefix.S b/src/arch/i386/prefix/romprefix.S index 950e08452..2719a70aa 100644 --- a/src/arch/i386/prefix/romprefix.S +++ b/src/arch/i386/prefix/romprefix.S @@ -342,7 +342,7 @@ pmm_scan: movw $get_pmm_image_source, %bp call get_pmm movl %esi, image_source - jc 1f + jz 1f /* Copy ROM to image source PMM block */ pushw %es xorw %ax, %ax @@ -448,7 +448,7 @@ no_pmm: * %es:0000 : PMM structure * Returns: * %ebx : PMM handle - * %esi : allocated block address, or zero (with CF set) if allocation failed + * %esi : allocated block address, or zero (with ZF set) if allocation failed */ get_pmm: /* Preserve registers */ @@ -464,7 +464,10 @@ get_pmm_find: pushw %dx pushw %ax popl %esi - testl %esi, %esi + /* Treat 0xffffffff (not supported) as 0x00000000 (not found) */ + incl %esi + jz get_pmm_allocate + decl %esi jz get_pmm_allocate /* Block found - check acceptability */ call *%bp @@ -484,19 +487,20 @@ get_pmm_allocate: pushw %ax popl %esi movw $( '+' ), %di /* Indicate allocation attempt */ - testl %esi, %esi - jnz get_pmm_done - stc get_pmm_done: /* Print block address */ - pushfw movw %di, %ax xorw %di, %di call print_character movl %esi, %eax call print_hex_dword - popfw - /* Restore registers and return */ + /* Treat 0xffffffff (not supported) as 0x00000000 (allocation + * failed), and set ZF to indicate a zero result. + */ + incl %esi + jz 1f + decl %esi +1: /* Restore registers and return */ popw %di popl %eax ret |
