summaryrefslogtreecommitdiffstats
path: root/src/arch
diff options
context:
space:
mode:
authorMichael Brown2016-02-19 03:38:48 +0100
committerMichael Brown2016-02-19 03:39:56 +0100
commitbfe6e3e90e8544452d4d76266fd8a93bfab8f9aa (patch)
tree221403b5c93cd90b8897a75cf750601fc8b4bac1 /src/arch
parent[librm] Transition to protected mode within init_librm() (diff)
downloadipxe-bfe6e3e90e8544452d4d76266fd8a93bfab8f9aa.tar.gz
ipxe-bfe6e3e90e8544452d4d76266fd8a93bfab8f9aa.tar.xz
ipxe-bfe6e3e90e8544452d4d76266fd8a93bfab8f9aa.zip
[relocate] Preserve page alignment during relocation
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/core/relocate.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/src/arch/x86/core/relocate.c b/src/arch/x86/core/relocate.c
index 65a36e00..765d4656 100644
--- a/src/arch/x86/core/relocate.c
+++ b/src/arch/x86/core/relocate.c
@@ -10,14 +10,6 @@
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",