Skip to contentSkip to conversation

ARM: trusted_foundations: Maintain CPU endianness

PATCH In review Dmitry Osipenko 3 participants 5 messages Mar 20, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index 3fb1b5a..865103a 100644
@@ -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
#1 lore raw

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
#2 lore raw
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

#3 lore raw
In reply to Dmitry Osipenko
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.

#4 lore raw

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