forked from mirrors/linux
		
	powerpc/boot: Change the load address for the wrapper to fit the kernel
The wrapper code which uncompresses the kernel in case of a 'ppc' boot is by default loaded at 0x00400000 and the kernel will be uncompressed to fit the location 0-0x00400000. But with dynamic relocations, the size of the kernel may exceed 0x00400000(4M). This would cause an overlap of the uncompressed kernel and the boot wrapper, causing a failure in boot. The message looks like : zImage starting: loaded at 0x00400000 (sp: 0x0065ffb0) Allocating 0x5ce650 bytes for kernel ... Insufficient memory for kernel at address 0! (_start=00400000, uncompressed size=00591a20) This patch shifts the load address of the boot wrapper code to the next higher MB, according to the size of the uncompressed vmlinux. With the patch, we get the following message while building the image : WARN: Uncompressed kernel (size 0x5b0344) overlaps the address of the wrapper(0x400000) WARN: Fixing the link_address of wrapper to (0x600000) Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com> Signed-off-by: Josh Boyer <jwboyer@gmail.com>
This commit is contained in:
		
							parent
							
								
									5b2e478da0
								
							
						
					
					
						commit
						c55aef0e5b
					
				
					 1 changed files with 20 additions and 0 deletions
				
			
		|  | @ -260,6 +260,8 @@ vmz="$tmpdir/`basename \"$kernel\"`.$ext" | ||||||
| if [ -z "$cacheit" -o ! -f "$vmz$gzip" -o "$vmz$gzip" -ot "$kernel" ]; then | if [ -z "$cacheit" -o ! -f "$vmz$gzip" -o "$vmz$gzip" -ot "$kernel" ]; then | ||||||
|     ${CROSS}objcopy $objflags "$kernel" "$vmz.$$" |     ${CROSS}objcopy $objflags "$kernel" "$vmz.$$" | ||||||
| 
 | 
 | ||||||
|  |     strip_size=$(stat -c %s $vmz.$$) | ||||||
|  | 
 | ||||||
|     if [ -n "$gzip" ]; then |     if [ -n "$gzip" ]; then | ||||||
|         gzip -n -f -9 "$vmz.$$" |         gzip -n -f -9 "$vmz.$$" | ||||||
|     fi |     fi | ||||||
|  | @ -269,6 +271,24 @@ if [ -z "$cacheit" -o ! -f "$vmz$gzip" -o "$vmz$gzip" -ot "$kernel" ]; then | ||||||
|     else |     else | ||||||
| 	vmz="$vmz.$$" | 	vmz="$vmz.$$" | ||||||
|     fi |     fi | ||||||
|  | else | ||||||
|  |     # Calculate the vmlinux.strip size | ||||||
|  |     ${CROSS}objcopy $objflags "$kernel" "$vmz.$$" | ||||||
|  |     strip_size=$(stat -c %s $vmz.$$) | ||||||
|  |     rm -f $vmz.$$ | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Round the size to next higher MB limit | ||||||
|  | round_size=$(((strip_size + 0xfffff) & 0xfff00000)) | ||||||
|  | 
 | ||||||
|  | round_size=0x$(printf "%x" $round_size) | ||||||
|  | link_addr=$(printf "%d" $link_address) | ||||||
|  | 
 | ||||||
|  | if [ $link_addr -lt $strip_size ]; then | ||||||
|  |     echo "WARN: Uncompressed kernel (size 0x$(printf "%x\n" $strip_size))" \ | ||||||
|  | 		"overlaps the address of the wrapper($link_address)" | ||||||
|  |     echo "WARN: Fixing the link_address of wrapper to ($round_size)" | ||||||
|  |     link_address=$round_size | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| vmz="$vmz$gzip" | vmz="$vmz$gzip" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Suzuki Poulose
						Suzuki Poulose