summaryrefslogtreecommitdiffstats
path: root/src/arch
diff options
context:
space:
mode:
authorMichael Brown2012-06-19 19:54:22 +0200
committerMichael Brown2012-06-19 20:35:48 +0200
commitb9ef880c8d50ccb89aef7e820aa737f66b63fd90 (patch)
treeed87b0b95fe7bc4c082e33b4787341a3906c0a1b /src/arch
parent[util] Update mergerom.pl to handle .mrom images (diff)
downloadipxe-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.S22
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