| 
				
			 | 
			
			
				
				@@ -10,14 +10,6 @@ 
			 | 
		
		
	
		
			
			| 
				10
			 | 
			
				10
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				11
			 | 
			
				11
			 | 
			
			
				
				 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); 
			 | 
		
		
	
		
			
			| 
				12
			 | 
			
				12
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				13
			 | 
			
				
			 | 
			
			
				
				-/* 
			 | 
		
		
	
		
			
			| 
				14
			 | 
			
				
			 | 
			
			
				
				- * The linker passes in the symbol _max_align, which is the alignment 
			 | 
		
		
	
		
			
			| 
				15
			 | 
			
				
			 | 
			
			
				
				- * that we must preserve, in bytes. 
			 | 
		
		
	
		
			
			| 
				16
			 | 
			
				
			 | 
			
			
				
				- * 
			 | 
		
		
	
		
			
			| 
				17
			 | 
			
				
			 | 
			
			
				
				- */ 
			 | 
		
		
	
		
			
			| 
				18
			 | 
			
				
			 | 
			
			
				
				-extern char _max_align[]; 
			 | 
		
		
	
		
			
			| 
				19
			 | 
			
				
			 | 
			
			
				
				-#define max_align ( ( size_t ) _max_align ) 
			 | 
		
		
	
		
			
			| 
				20
			 | 
			
				
			 | 
			
			
				
				- 
			 | 
		
		
	
		
			
			| 
				21
			 | 
			
				13
			 | 
			
			
				
				 /* Linker symbols */ 
			 | 
		
		
	
		
			
			| 
				22
			 | 
			
				14
			 | 
			
			
				
				 extern char _textdata[]; 
			 | 
		
		
	
		
			
			| 
				23
			 | 
			
				15
			 | 
			
			
				
				 extern char _etextdata[]; 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -30,6 +22,12 @@ extern char _etextdata[]; 
			 | 
		
		
	
		
			
			| 
				30
			 | 
			
				22
			 | 
			
			
				
				  */ 
			 | 
		
		
	
		
			
			| 
				31
			 | 
			
				23
			 | 
			
			
				
				 #define MAX_ADDR (0xfff00000UL) 
			 | 
		
		
	
		
			
			| 
				32
			 | 
			
				24
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				25
			 | 
			
			
				
				+/* Preserve alignment to a 4kB page 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				26
			 | 
			
			
				
				+ * 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				27
			 | 
			
			
				
				+ * Required for x86_64, and doesn't hurt for i386. 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				28
			 | 
			
			
				
				+ */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				29
			 | 
			
			
				
				+#define ALIGN 4096 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				30
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				33
			 | 
			
				31
			 | 
			
			
				
				 /** 
			 | 
		
		
	
		
			
			| 
				34
			 | 
			
				32
			 | 
			
			
				
				  * Relocate iPXE 
			 | 
		
		
	
		
			
			| 
				35
			 | 
			
				33
			 | 
			
			
				
				  * 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -53,11 +51,11 @@ __asmcall void relocate ( struct i386_all_regs *ix86 ) { 
			 | 
		
		
	
		
			
			| 
				53
			 | 
			
				51
			 | 
			
			
				
				 	start = virt_to_phys ( _textdata ); 
			 | 
		
		
	
		
			
			| 
				54
			 | 
			
				52
			 | 
			
			
				
				 	end = virt_to_phys ( _etextdata ); 
			 | 
		
		
	
		
			
			| 
				55
			 | 
			
				53
			 | 
			
			
				
				 	size = ( end - start ); 
			 | 
		
		
	
		
			
			| 
				56
			 | 
			
				
			 | 
			
			
				
				-	padded_size = ( size + max_align - 1 ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				54
			 | 
			
			
				
				+	padded_size = ( size + ALIGN - 1 ); 
			 | 
		
		
	
		
			
			| 
				57
			 | 
			
				55
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				58
			 | 
			
				56
			 | 
			
			
				
				 	DBG ( "Relocate: currently at [%x,%x)\n" 
			 | 
		
		
	
		
			
			| 
				59
			 | 
			
				
			 | 
			
			
				
				-	      "...need %x bytes for %zd-byte alignment\n", 
			 | 
		
		
	
		
			
			| 
				60
			 | 
			
				
			 | 
			
			
				
				-	      start, end, padded_size, max_align ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				57
			 | 
			
			
				
				+	      "...need %x bytes for %d-byte alignment\n", 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				
				+	      start, end, padded_size, ALIGN ); 
			 | 
		
		
	
		
			
			| 
				61
			 | 
			
				59
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				62
			 | 
			
				60
			 | 
			
			
				
				 	/* Determine maximum usable address */ 
			 | 
		
		
	
		
			
			| 
				63
			 | 
			
				61
			 | 
			
			
				
				 	max = MAX_ADDR; 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -125,7 +123,7 @@ __asmcall void relocate ( struct i386_all_regs *ix86 ) { 
			 | 
		
		
	
		
			
			| 
				125
			 | 
			
				123
			 | 
			
			
				
				 	 * required alignemnt. 
			 | 
		
		
	
		
			
			| 
				126
			 | 
			
				124
			 | 
			
			
				
				 	 */ 
			 | 
		
		
	
		
			
			| 
				127
			 | 
			
				125
			 | 
			
			
				
				 	new_start = new_end - padded_size; 
			 | 
		
		
	
		
			
			| 
				128
			 | 
			
				
			 | 
			
			
				
				-	new_start += ( start - new_start ) & ( max_align - 1 ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				126
			 | 
			
			
				
				+	new_start += ( ( start - new_start ) & ( ALIGN - 1 ) ); 
			 | 
		
		
	
		
			
			| 
				129
			 | 
			
				127
			 | 
			
			
				
				 	new_end = new_start + size; 
			 | 
		
		
	
		
			
			| 
				130
			 | 
			
				128
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				131
			 | 
			
				129
			 | 
			
			
				
				 	DBG ( "Relocating from [%x,%x) to [%x,%x)\n", 
			 |