]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[relocate] Preserve page alignment during relocation
authorMichael Brown <mcb30@ipxe.org>
Fri, 19 Feb 2016 02:38:48 +0000 (02:38 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 19 Feb 2016 02:39:56 +0000 (02:39 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/core/relocate.c

index 65a36e00805962755615169dc809e2e9575467f0..765d465606960430bc38ad6ec92f7de78649bde3 100644 (file)
 
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
-/*
- * The linker passes in the symbol _max_align, which is the alignment
- * that we must preserve, in bytes.
- *
- */
-extern char _max_align[];
-#define max_align ( ( size_t ) _max_align )
-
 /* Linker symbols */
 extern char _textdata[];
 extern char _etextdata[];
@@ -30,6 +22,12 @@ extern char _etextdata[];
  */
 #define MAX_ADDR (0xfff00000UL)
 
+/* Preserve alignment to a 4kB page
+ *
+ * Required for x86_64, and doesn't hurt for i386.
+ */
+#define ALIGN 4096
+
 /**
  * Relocate iPXE
  *
@@ -53,11 +51,11 @@ __asmcall void relocate ( struct i386_all_regs *ix86 ) {
        start = virt_to_phys ( _textdata );
        end = virt_to_phys ( _etextdata );
        size = ( end - start );
-       padded_size = ( size + max_align - 1 );
+       padded_size = ( size + ALIGN - 1 );
 
        DBG ( "Relocate: currently at [%x,%x)\n"
-             "...need %x bytes for %zd-byte alignment\n",
-             start, end, padded_size, max_align );
+             "...need %x bytes for %d-byte alignment\n",
+             start, end, padded_size, ALIGN );
 
        /* Determine maximum usable address */
        max = MAX_ADDR;
@@ -125,7 +123,7 @@ __asmcall void relocate ( struct i386_all_regs *ix86 ) {
         * required alignemnt.
         */
        new_start = new_end - padded_size;
-       new_start += ( start - new_start ) & ( max_align - 1 );
+       new_start += ( ( start - new_start ) & ( ALIGN - 1 ) );
        new_end = new_start + size;
 
        DBG ( "Relocating from [%x,%x) to [%x,%x)\n",