ARM: trusted_foundations: Maintain CPU endianness
Subsystems (2)
PATCH 1/1 ARM: trusted_foundations: Maintain CPU endianness
Convert CPU reset vector address to LE to support big-endian kernel.
--- arch/arm/firmware/trusted_foundations.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/firmware/trusted_foundations.c +1 -1
@@ -50,7 +50,7 @@ static void __naked tf_generic_smc(u32 type, u32 arg1, u32 arg2)static int tf_set_cpu_boot_addr (int cpu,unsigned long boot_addr) { - cpu_boot_addr = boot_addr; + cpu_boot_addr =cpu_to_le32 (boot_addr);tf_generic_smc (TF_SET_CPU_BOOT_ADDR_SMC , cpu_boot_addr,0 );return 0 ;
Signature · 1 line
2.3.3
This patch not tested. I assume that firmware save/restore cp15 context, i.e. it doesn't require switching to LE before smc call and restore endianness after.
Signature · 1 line
Dmitry
Quoted 3 lines · Dmitry Osipenko
This patch not tested. I assume that firmware save/restore cp15 context, i.e. it doesn't require switching to LE before smc call and restore endianness after.
That assumption should be valid.
However, I think this patch must be tested before assuming it is correct. If the arguments were passed in memory then there might force LE order for that data block, but there should not be a need for this if the values are in registers.
Cheers
---Dave
Quoted 1 line · Dmitry Osipenko
Convert CPU reset vector address to LE to support big-endian kernel.
Naively this sounds a little odd; the value here is in a CPU register all the time, not in memory, so I'm not sure why endianness is relevant? Presumably the CPU doesn't end up byte-swapping values in registers when running in BE mode or it takes an SMC? If it does, why don't we need cpu_to_le32(TF_SET_CPU_BOOT_ADDR_SMC) too?
Sorry if this is a silly question; I haven't followed any of the BE kernel patches.
20.03.2015 19:07, Stephen Warren ?????:
Quoted 10 lines · Dmitry Osipenko
Quoted 1 line
Convert CPU reset vector address to LE to support big-endian kernel.
Naively this sounds a little odd; the value here is in a CPU register all the time, not in memory, so I'm not sure why endianness is relevant? Presumably the CPU doesn't end up byte-swapping values in registers when running in BE mode or it takes an SMC? If it does, why don't we need
cpu_to_le32(TF_SET_CPU_BOOT_ADDR_SMC)too?Sorry if this is a silly question; I haven't followed any of the BE kernel patches.
You absolutely right. I goofed it by replacing 'smc' with 'str' without adding reg reverse for BE when was testing and then blindly made patch. Please ignore it and sorry for the noise.
Signature · 1 line
Dmitry