[PATCH 1/3] Support BE8 mode kernel modules relocation
STALE5733d
From: Stanley.Miao <hidden>
Date: 2011-01-19 06:21:00
2011/1/18 Catalin Marinas [off-list ref]:
On 18 January 2011 01:22, Stanley.Miao [off-list ref] wrote:quoted
2011/1/17 Catalin Marinas [off-list ref]:quoted
On 17 January 2011 08:42, Stanley.Miao [off-list ref] wrote:quoted
The code section in BE8 kernel modules is in little-endian while data section is in big-endian. When reading code from memory in the relocation procedure, these instructions are read according to big-endian, so they need to be inverted before writing to memory and after reading from memory.[...]quoted
--- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h@@ -233,6 +233,18 @@ extern void _memset_io(volatile void __iomem *, int, size_t);?#endif /* __mem_pci */ +#ifdef CONFIG_CPU_ENDIAN_BE8 +#define read_instr32(c) ? ? ? ? ? ? ? ? ? ? ? ?__swab32(*(u32 *)c) +#define read_instr16(c) ? ? ? ? ? ? ? ? ? ? ? ?__swab16(*(u16 *)c) +#define write_instr32(v,a) ? ? ? ? ? ? (*(u32 *)(a) = __swab32((__force __u32)(v))) +#define write_instr16(v,a) ? ? ? ? ? ? (*(u16 *)(a) = __swab16((__force __u16)(v))) +#else +#define read_instr32(c) ? ? ? ? ? ? ? ? ? ? ? ?(*(u32 *)c) +#define read_instr16(c) ? ? ? ? ? ? ? ? ? ? ? ?(*(u16 *)c) +#define write_instr32(v,a) ? ? ? ? ? ? (*(u32 *)(a) = (v)) +#define write_instr16(v,a) ? ? ? ? ? ? (*(u16 *)(a) = (v)) +#endifCan we not use cpu_to_le32 etc in here (and as Russell said, they are not really IO)?Except moving these definition to arch/arm/kernel/module.c, do I need to do other modifications ?Just personal preference (not important), I'd rather have a "u32 instr" variable set by read_instr32() than this kind of functional style (in C code, I'm fine with it otherwise):
upper, lower and offset are used. It looks we don't need another "instr".
quoted
+ ? ? ? ? ? ? ? ? ? ? ? write_instr32((read_instr32(loc) & 0xff000000) | + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (offset & 0x00ffffff), loc);BTW (not related to modules, but since you are looking at this), when we copy the sigreturn_codes to the vectors page in early_trap_init(), do they get there in little endian form (as required by BE8)?
No, they get there in big endian.They are read as data in the function setup_return(). retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb; Stanley.
-- Catalin