[PATCH] kexec/fs2dt : Fix endianess issue with initrd base and size

Simon Horman horms at verge.net.au
Sun Apr 13 19:19:51 PDT 2014


On Fri, Apr 11, 2014 at 12:10:30PM +0200, Laurent Dufour wrote:
> The initrd values exposed in the device tree of the kexeced kernel must be
> encoded in Big Endian format.
> 
> Without this patch, kexeced LE kernel are expected to panic when dealing
> with the initrd image.
> 
> Signed-off-by: Laurent Dufour <ldufour at linux.vnet.ibm.com>

Thanks, applied.

> ---
>  kexec/fs2dt.c |    9 +++++----
>  1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/kexec/fs2dt.c b/kexec/fs2dt.c
> index 5e6b98d..2a90979 100644
> --- a/kexec/fs2dt.c
> +++ b/kexec/fs2dt.c
> @@ -531,7 +531,7 @@ static void putnode(void)
>  	/* Add initrd entries to the second kernel */
>  	if (initrd_base && initrd_size && !strcmp(basename,"chosen/")) {
>  		int len = 8;
> -		unsigned long long initrd_end;
> +		uint64_t bevalue;
>  
>  		dt_reserve(&dt, 12); /* both props, of 6 words ea. */
>  		*dt++ = cpu_to_be32(3);
> @@ -539,7 +539,8 @@ static void putnode(void)
>  		*dt++ = cpu_to_be32(propnum("linux,initrd-start"));
>  		pad_structure_block(len);
>  
> -		memcpy(dt,&initrd_base,len);
> +		bevalue = cpu_to_be64(initrd_base);
> +		memcpy(dt, &bevalue, len);
>  		dt += (len + 3)/4;
>  
>  		len = 8;
> @@ -547,10 +548,10 @@ static void putnode(void)
>  		*dt++ = cpu_to_be32(len);
>  		*dt++ = cpu_to_be32(propnum("linux,initrd-end"));
>  
> -		initrd_end = initrd_base + initrd_size;
> +		bevalue = cpu_to_be64(initrd_base + initrd_size);
>  		pad_structure_block(len);
>  
> -		memcpy(dt,&initrd_end,len);
> +		memcpy(dt, &bevalue, len);
>  		dt += (len + 3)/4;
>  
>  		reserve(initrd_base, initrd_size);
> 



More information about the kexec mailing list