From: Thomas Falcon <hidden> Date: 2014-07-25 17:48:51
The function rtas_flash_firmware passes the address of a data structure,
flash_block_list, when making the update-flash-64-and-reboot rtas call.
While the endianness of the address is handled correctly, the endianness
of the data is not. This patch ensures that the data in flash_block_list
is big endian when passed to rtas on little endian hosts.
Signed-off-by: Thomas Falcon <redacted>
---
arch/powerpc/kernel/rtas_flash.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
@@ -611,17 +611,19 @@ static void rtas_flash_firmware(int reboot_type)for(f=flist;f;f=next){/* Translate data addrs to absolute */for(i=0;i<f->num_blocks;i++){-f->blocks[i].data=(char*)__pa(f->blocks[i].data);+f->blocks[i].data=(char*)cpu_to_be64(__pa(f->blocks[i].data));image_size+=f->blocks[i].length;+f->blocks[i].length=cpu_to_be64(f->blocks[i].length);}next=f->next;/* Don't translate NULL pointer for last entry */if(f->next)-f->next=(structflash_block_list*)__pa(f->next);+f->next=(structflash_block_list*)cpu_to_be64(__pa(f->next));elsef->next=NULL;/* make num_blocks into the version/length field */f->num_blocks=(FLASH_BLOCK_LIST_VERSION<<56)|((f->num_blocks+1)*16);+f->num_blocks=cpu_to_be64(f->num_blocks);}printk(KERN_ALERT"FLASH: flash image is %ld bytes\n",image_size);
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2014-07-28 03:35:33
Hi Thomas,
On Fri, 2014-07-25 at 12:47 -0500, Thomas Falcon wrote:
[PATCH] powerpc: fixing endianness of flash_block_list in rtas_flash
Minor nit, but the commit title should use the imperative mood, so eg:
[PATCH] powerpc: Fix endianness of flash_block_list in rtas_flash
The function rtas_flash_firmware passes the address of a data structure,
flash_block_list, when making the update-flash-64-and-reboot rtas call.
While the endianness of the address is handled correctly, the endianness
of the data is not. This patch ensures that the data in flash_block_list
is big endian when passed to rtas on little endian hosts.
This looks good.
But you can do even better by changing the data types to be explicitly BE, so
eg. length should be __be64 I think.
Then if you build with "make C=2 CF=-D__CHECK_ENDIAN__" and have sparse
installed it will tell you when incorrectly assign from/to the BE types.
cheers
The function rtas_flash_firmware passes the address of a data structure,
flash_block_list, when making the update-flash-64-and-reboot rtas call.
While the endianness of the address is handled correctly, the endianness
of the data is not. This patch ensures that the data in flash_block_list
is big endian when passed to rtas on little endian hosts.
Signed-off-by: Thomas Falcon <redacted>
---
arch/powerpc/kernel/rtas_flash.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
Tom,
In validate_flash rtas call returns update_results in BE.. I think we need
below changes as well.
Rest looks good.
From: Thomas Falcon <hidden> Date: 2014-08-01 17:07:34
On 08/01/2014 04:32 AM, Vasant Hegde wrote:
quoted hunk
On 07/25/2014 11:17 PM, Thomas Falcon wrote:
quoted
The function rtas_flash_firmware passes the address of a data structure,
flash_block_list, when making the update-flash-64-and-reboot rtas call.
While the endianness of the address is handled correctly, the endianness
of the data is not. This patch ensures that the data in
flash_block_list
is big endian when passed to rtas on little endian hosts.
Signed-off-by: Thomas Falcon <redacted>
---
arch/powerpc/kernel/rtas_flash.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
Tom,
In validate_flash rtas call returns update_results in BE.. I think we
need below changes as well.
Rest looks good.
diff --git a/arch/powerpc/kernel/rtas_flash.c
b/arch/powerpc/kernel/rtas_flash.c
index db2b482..1eae0d8 100644