diff options
author | Michael Brown | 2016-02-19 03:38:48 +0100 |
---|---|---|
committer | Michael Brown | 2016-02-19 03:39:56 +0100 |
commit | bfe6e3e90e8544452d4d76266fd8a93bfab8f9aa (patch) | |
tree | 221403b5c93cd90b8897a75cf750601fc8b4bac1 /src/arch | |
parent | [librm] Transition to protected mode within init_librm() (diff) | |
download | ipxe-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.c | 22 |
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", |