diff --git a/src/arch/i386/prefix/libprefix.S b/src/arch/i386/prefix/libprefix.S index f5f66919..eeed0ada 100644 --- a/src/arch/i386/prefix/libprefix.S +++ b/src/arch/i386/prefix/libprefix.S @@ -443,6 +443,8 @@ install: xorl %esi, %esi /* Image destination = default */ xorl %edi, %edi + /* Allow relocation */ + clc /* Install text and data segments */ call install_prealloc /* Restore registers and return */ @@ -461,6 +463,7 @@ install: * %bx : .data16 segment address * %esi : Image source physical address (or zero for %cs:0000) * %edi : Decompression temporary area physical address (or zero for default) + * CF set : Avoid relocating to top of memory * Corrupts: * none **************************************************************************** @@ -473,9 +476,8 @@ install_prealloc: pushal pushw %ds pushw %es - - /* Sanity: clear the direction flag asap */ - cld + cld /* Sanity: clear the direction flag asap */ + pushfw /* Copy decompression temporary area physical address to %ebp */ movl %edi, %ebp @@ -570,6 +572,11 @@ a20_death_message: movl %ebp, %edi lcall *init_librm_vector + /* Skip relocation if CF was set on entry */ + popfw + pushfw + jc skip_relocate + /* Call relocate() to determine target address for relocation. * relocate() will return with %esi, %edi and %ecx set up * ready for the copy to the new location. @@ -588,9 +595,11 @@ a20_death_message: /* Initialise librm at new location */ lcall *init_librm_vector +skip_relocate: #endif /* Restore registers */ + popfw popw %es popw %ds popal diff --git a/src/arch/i386/prefix/romprefix.S b/src/arch/i386/prefix/romprefix.S index 2858cb3f..27eda346 100644 --- a/src/arch/i386/prefix/romprefix.S +++ b/src/arch/i386/prefix/romprefix.S @@ -407,6 +407,7 @@ no_pmm: * picked up by the initial shell prompt, and we will drop * into a shell. */ + stc /* Inhibit relocation */ pushw %cs call exec 2: @@ -597,6 +598,7 @@ bbs_version: * Called by the PnP BIOS when it wants to boot us. */ bev_entry: + clc /* Allow relocation */ pushw %cs call exec lret @@ -631,6 +633,7 @@ int19_entry: /* Leave keypress in buffer and start iPXE. The keypress will * cause the usual initial Ctrl-B prompt to be skipped. */ + clc /* Allow relocation */ pushw %cs call exec 1: /* Try to call original INT 19 vector */ @@ -662,6 +665,9 @@ exec: /* Set %ds = %cs */ pushw %cs popw %ds + /* Preserve state of CF */ + lahf + /* Print message as soon as possible */ movw $prodstr, %si xorw %di, %di @@ -675,14 +681,17 @@ exec: /* Set %ds = %cs */ movw %sp, %bp /* Obtain a reasonably-sized temporary stack */ - xorw %ax, %ax - movw %ax, %ss + xorw %bx, %bx + movw %bx, %ss movw $0x7c00, %sp /* Install iPXE */ + sahf + pushfw + call alloc_basemem + popfw movl image_source, %esi movl decompress_to, %edi - call alloc_basemem call install_prealloc /* Print message indicating successful installation */ diff --git a/src/arch/i386/prefix/undiloader.S b/src/arch/i386/prefix/undiloader.S index 36c1bef3..6fab3a34 100644 --- a/src/arch/i386/prefix/undiloader.S +++ b/src/arch/i386/prefix/undiloader.S @@ -28,6 +28,7 @@ undiloader: movw %es:14(%di), %ax movl image_source, %esi movl decompress_to, %edi + clc /* Allow relocation */ call install_prealloc popw %di /* Call UNDI loader C code */