All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Dufour <ldufour@linux.vnet.ibm.com>
To: Simon Horman <horms@verge.net.au>
Cc: kexec@lists.infradead.org
Subject: Re: [PATCH] kexec/fs2dt: fix endianess conversion
Date: Wed, 16 Oct 2013 11:33:43 +0200	[thread overview]
Message-ID: <525E5D77.8090109@linux.vnet.ibm.com> (raw)
In-Reply-To: <20131016072826.GC29696@verge.net.au>

On 16/10/2013 09:28, Simon Horman wrote:
> On Tue, Oct 15, 2013 at 07:05:28PM +0200, Laurent Dufour wrote:
>> While reviewing fs2dt.c in the common kexec directory, in order to use it to
>> support little endian ppc64 architecture, I found some endianess
>> conversion's issues.
>>
>> In dt_reserve, dt_base is a pointer and thus should not be converted.
>>
>> In checkprop, values read from the device tree are big endian encoded and
>> should be converted if CPU is running in little endian mode.
>>
>> In add_dyn_reconf_usable_mem_property__, fix extraneous endianess conversion
>> of rlen which should be natively used to increase the dt pointer.
> 
> These changes seem logical to me.
> 
> However, I'm unsure how the code might have worked as-is.
> In particular I'm pretty sure ARM was running in little endian
> mode when I worked on DT support for it. Perhaps these code
> paths were not executed. Or the errors cancelled themselves out somehow?

I've to admit that I don't know how this has worked for ARM.
I run this patch with a set of change I'm working on to support PPC64
little endian architecture. My tests were done with kexec-tools built in
little endian mode, using this fs2dt.c file and I need this fix to build
a valid device tree.

The fix is dt_reserve is hit unless the device tree is large enough. I
had to reduce INIT_TREE_WORDS to hit it.

I think the ones in checkprop, add_dyn_reconf_usable_mem_property__  are
Power specific since RTAS and 'ibm,dynamic-memory' are required to hit them.

This may explain why this issue are not seen in ARM mode.

This being said, I wondering if the files fs2dt.c defined in the
arch/ppc64 and arch/ppc directories need to be kept. What do you think
about removing those files and belong on the common kexec/fs2dt.c file
for all the supported architecture ?

Cheers,
Laurent.

>>
>> Signed-off-by: Laurent Dufour <ldufour@linux.vnet.ibm.com>
>> ---
>>  kexec/fs2dt.c |   19 +++++++++++--------
>>  1 file changed, 11 insertions(+), 8 deletions(-)
>>
>> diff --git a/kexec/fs2dt.c b/kexec/fs2dt.c
>> index 242a15e..5d774ae 100644
>> --- a/kexec/fs2dt.c
>> +++ b/kexec/fs2dt.c
>> @@ -84,7 +84,7 @@ static void dt_reserve(unsigned **dt_ptr, unsigned words)
>>  		offset = *dt_ptr - dt_base;
>>  		dt_base = new_dt;
>>  		dt_cur_size = new_size;
>> -		*dt_ptr = cpu_to_be32((unsigned)dt_base + offset);
>> +		*dt_ptr = dt_base + offset;
>>  		memset(*dt_ptr, 0, (new_size - offset)*4);
>>  	}
>>  }
>> @@ -112,19 +112,22 @@ static void checkprop(char *name, unsigned *data, int len)
>>  	if ((data == NULL) && (base || size || end))
>>  		die("unrecoverable error: no property data");
>>  	else if (!strcmp(name, "linux,rtas-base"))
>> -		base = *data;
>> +		base = be32_to_cpu(*data);
>>  	else if (!strcmp(name, "linux,tce-base"))
>> -		base = *(unsigned long long *) data;
>> +		base = be64_to_cpu(*(unsigned long long *) data);
>>  	else if (!strcmp(name, "rtas-size") ||
>>  			!strcmp(name, "linux,tce-size"))
>> -		size = *data;
>> +		size = be32_to_cpu(*data);
>>  	else if (reuse_initrd && !strcmp(name, "linux,initrd-start"))
>>  		if (len == 8)
>> -			base = *(unsigned long long *) data;
>> +			base = be64_to_cpu(*(unsigned long long *) data);
>>  		else
>> -			base = *data;
>> +			base = be32_to_cpu(*data);
>>  	else if (reuse_initrd && !strcmp(name, "linux,initrd-end"))
>> -		end = *(unsigned long long *) data;
>> +		if (len == 8)
>> +			end = be64_to_cpu(*(unsigned long long *) data);
>> +		else
>> +			end = be32_to_cpu(*data);
>>  
>>  	if (size && end)
>>  		die("unrecoverable error: size and end set at same time\n");
>> @@ -267,7 +270,7 @@ static void add_dyn_reconf_usable_mem_property__(int fd)
>>  	pad_structure_block(rlen);
>>  	memcpy(dt, ranges, rlen);
>>  	free(ranges);
>> -	dt += cpu_to_be32((rlen + 3)/4);
>> +	dt += (rlen + 3)/4;
>>  }
>>  
>>  static void add_dyn_reconf_usable_mem_property(struct dirent *dp, int fd)
>>
> 


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

  reply	other threads:[~2013-10-16  9:34 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-15 17:05 [PATCH] kexec/fs2dt: fix endianess conversion Laurent Dufour
2013-10-16  7:28 ` Simon Horman
2013-10-16  9:33   ` Laurent Dufour [this message]
2013-10-17  1:42     ` Simon Horman
2013-10-17  1:44       ` Simon Horman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=525E5D77.8090109@linux.vnet.ibm.com \
    --to=ldufour@linux.vnet.ibm.com \
    --cc=horms@verge.net.au \
    --cc=kexec@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.