]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[prefix] Allow prefix to specify an arbitrary maximum address for relocation
authorMichael Brown <mcb30@ipxe.org>
Fri, 11 Nov 2011 23:20:28 +0000 (23:20 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 11 Nov 2011 23:20:52 +0000 (23:20 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/core/relocate.c
src/arch/i386/prefix/exeprefix.S
src/arch/i386/prefix/libprefix.S
src/arch/i386/prefix/romprefix.S
src/arch/i386/prefix/undiloader.S

index 47450e757725088c1629846884871e497c376eda..b9b029443d1aac181759d0e80da2124f9cbbc80d 100644 (file)
@@ -42,7 +42,7 @@ extern char _etextdata[];
  */
 __asmcall void relocate ( struct i386_all_regs *ix86 ) {
        struct memory_map memmap;
-       unsigned long start, end, size, padded_size;
+       unsigned long start, end, size, padded_size, max;
        unsigned long new_start, new_end;
        unsigned i;
 
@@ -57,6 +57,13 @@ __asmcall void relocate ( struct i386_all_regs *ix86 ) {
              "...need %lx bytes for %d-byte alignment\n",
              start, end, padded_size, max_align );
 
+       /* Determine maximum usable address */
+       max = MAX_ADDR;
+       if ( ix86->regs.ebp && ( ix86->regs.ebp < max ) ) {
+               max = ix86->regs.ebp;
+               DBG ( "Limiting relocation to [0,%lx)\n", max );
+       }
+
        /* Walk through the memory map and find the highest address
         * below 4GB that iPXE will fit into.
         */
@@ -67,18 +74,18 @@ __asmcall void relocate ( struct i386_all_regs *ix86 ) {
 
                DBG ( "Considering [%llx,%llx)\n", region->start, region->end);
                
-               /* Truncate block to MAX_ADDR.  This will be less than
-                * 4GB, which means that we can get away with using
-                * just 32-bit arithmetic after this stage.
+               /* Truncate block to maximum address.  This will be
+                * less than 4GB, which means that we can get away
+                * with using just 32-bit arithmetic after this stage.
                 */
-               if ( region->start > MAX_ADDR ) {
-                       DBG ( "...starts after MAX_ADDR=%lx\n", MAX_ADDR );
+               if ( region->start > max ) {
+                       DBG ( "...starts after max=%lx\n", max );
                        continue;
                }
                r_start = region->start;
-               if ( region->end > MAX_ADDR ) {
-                       DBG ( "...end truncated to MAX_ADDR=%lx\n", MAX_ADDR );
-                       r_end = MAX_ADDR;
+               if ( region->end > max ) {
+                       DBG ( "...end truncated to max=%lx\n", max );
+                       r_end = max;
                } else {
                        r_end = region->end;
                }
index c7e57cee508787774b37de4c8209f4a29cc5dba5..5ba0239ab62852033fa48a5b9e4a4054a3737ca2 100644 (file)
@@ -113,7 +113,7 @@ _exe_start:
        call    alloc_basemem
        xorl    %esi, %esi
        movl    $EXE_DECOMPRESS_ADDRESS, %edi
-       clc
+       xorl    %ebp, %ebp
        call    install_prealloc
 
        /* Set up real-mode stack */
index ae3db32a666853de0114a8720175a83d725dfc43..fcf69bd3ebe77d50b883f6d9b2d8d10944b331c8 100644 (file)
@@ -326,7 +326,6 @@ process_bytes:
 #ifndef KEEP_IT_REAL
 
        /* Preserve registers */
-       pushfw
        pushl   %eax
        pushl   %ebp
 
@@ -397,7 +396,6 @@ process_bytes:
        /* Restore registers and return */
        popl    %ebp
        popl    %eax
-       popfw
        ret
 
 #else /* KEEP_IT_REAL */
@@ -614,17 +612,19 @@ install:
        /* Preserve registers */
        pushl   %esi
        pushl   %edi
+       pushl   %ebp
        /* Allocate space for .text16 and .data16 */
        call    alloc_basemem
        /* Image source = %cs:0000 */
        xorl    %esi, %esi
        /* Image destination = default */
        xorl    %edi, %edi
-       /* Allow relocation */
-       clc
+       /* Allow arbitrary relocation */
+       xorl    %ebp, %ebp
        /* Install text and data segments */
        call    install_prealloc
        /* Restore registers and return */
+       popl    %ebp
        popl    %edi
        popl    %esi
        ret
@@ -640,7 +640,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
+ *   %ebp : Maximum end address for relocation (or zero for no maximum)
  * Corrupts:
  *   none
  ****************************************************************************
@@ -655,7 +655,6 @@ install_prealloc:
        pushw   %ds
        pushw   %es
        cld                     /* Sanity: clear the direction flag asap */
-       pushfw
 
        /* Set up %ds for (read-only) access to .prefix */
        pushw   %cs
@@ -791,11 +790,6 @@ payload_death_message:
        movw    %ax, (init_librm_vector+2)
        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.
@@ -818,7 +812,6 @@ payload_death_message:
        /* Initialise librm at new location */
        progress "  init_librm\n"
        lcall   *init_librm_vector
-skip_relocate:
 #endif
 
        /* Close access to payload */
@@ -827,7 +820,6 @@ skip_relocate:
        lcall   *close_payload_vector
 
        /* Restore registers */
-       popfw
        popw    %es
        popw    %ds
        popal
index c85e563d50f8cce920da7688eeec97b746e1c24c..0f92415375eabd4727ce06598e8b6671f78ed3f2 100644 (file)
@@ -414,7 +414,7 @@ no_pmm:
         * picked up by the initial shell prompt, and we will drop
         * into a shell.
         */
-       stc                     /* Inhibit relocation */
+       movl    $0xa0000, %ebp  /* Inhibit relocation during POST */
        pushw   %cs
        call    exec
 2:
@@ -614,7 +614,7 @@ decompress_to:
  * Called by the PnP BIOS when it wants to boot us.
  */
 bev_entry:
-       clc                     /* Allow relocation */
+       xorl    %ebp, %ebp      /* Allow relocation */
        pushw   %cs
        call    exec
        lret
@@ -649,7 +649,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 */
+       xorl    %ebp, %ebp      /* Allow relocation */
        pushw   %cs
        call    exec
 1:     /* Try to call original INT 19 vector */
@@ -681,9 +681,6 @@ 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
@@ -693,8 +690,8 @@ exec:       /* Set %ds = %cs */
 
        /* Store magic word on BIOS stack and remember BIOS %ss:sp */
        pushl   $STACK_MAGIC
-       movw    %ss, %dx
-       movw    %sp, %bp
+       movw    %ss, %cx
+       movw    %sp, %dx
 
        /* Obtain a reasonably-sized temporary stack */
        xorw    %bx, %bx
@@ -702,10 +699,7 @@ exec:      /* Set %ds = %cs */
        movw    $0x7c00, %sp
 
        /* Install iPXE */
-       sahf
-       pushfw
        call    alloc_basemem
-       popfw
        movl    image_source, %esi
        movl    decompress_to, %edi
        call    install_prealloc
@@ -728,14 +722,14 @@ exec:     /* Set %ds = %cs */
        pushl   $main
        pushw   %cs
        call    prot_call
-       popl    %ecx /* discard */
+       popl    %eax /* discard */
 
        /* Uninstall iPXE */
        call    uninstall
 
        /* Restore BIOS stack */
-       movw    %dx, %ss
-       movw    %bp, %sp
+       movw    %cx, %ss
+       movw    %dx, %sp
 
        /* Check magic word on BIOS stack */
        popl    %eax
index 951b5c1ce843bd5ae71ba60c7f57f2e8c3521537..bb3d469be58959c47bb8a6bddae203d0a9c32268 100644 (file)
@@ -14,6 +14,7 @@ undiloader:
        /* Save registers */
        pushl   %esi
        pushl   %edi
+       pushl   %ebp
        pushw   %ds
        pushw   %es
        pushw   %bx
@@ -30,7 +31,7 @@ undiloader:
        movw    %es:14(%di), %ax
        movl    image_source, %esi
        movl    decompress_to, %edi
-       clc                     /* Allow relocation */
+       xorl    %ebp, %ebp              /* Allow relocation */
        call    install_prealloc
        popw    %di
        /* Call UNDI loader C code */
@@ -46,6 +47,7 @@ undiloader:
        popw    %bx
        popw    %es
        popw    %ds
+       popl    %ebp
        popl    %edi
        popl    %esi
        lret