Message ID | 1383935832-20865-10-git-send-email-ben.dooks@codethink.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 11/08/2013 08:37 PM, Ben Dooks wrote: > Currently the <asm/opcodes.h> header uses .work and .short to build > instructions. This means the output data does not get marked as an > instruction which can cause issues such as BE8 code failures. > > Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk> > --- > arch/arm/include/asm/opcodes.h | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/arch/arm/include/asm/opcodes.h b/arch/arm/include/asm/opcodes.h > index e796c59..4c7cac1 100644 > --- a/arch/arm/include/asm/opcodes.h > +++ b/arch/arm/include/asm/opcodes.h > @@ -103,9 +103,15 @@ extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); > #define __opcode_to_mem_arm(x) ___opcode_swab32(x) > #define __opcode_to_mem_thumb16(x) ___opcode_swab16(x) > #define __opcode_to_mem_thumb32(x) ___opcode_swahb32(x) > +#ifdef ARM_HAVE_INST > #define ___asm_opcode_to_mem_arm(x) ___asm_opcode_swab32(x) > #define ___asm_opcode_to_mem_thumb16(x) ___asm_opcode_swab16(x) > #define ___asm_opcode_to_mem_thumb32(x) ___asm_opcode_swahb32(x) > +#else > +#define ___asm_opcode_to_mem_arm(x) ___asm_opcode_identity32(x) > +#define ___asm_opcode_to_mem_thumb16(x) ___asm_opcode_identity16(x) > +#define ___asm_opcode_to_mem_thumb32(x) ___asm_opcode_identity32(x) > +#endif /* !ARM_HAVE_INST */ > > #else /* ! CONFIG_CPU_ENDIAN_BE8 */ > > @@ -218,14 +224,27 @@ extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); > > /* Helpers for the helpers. Don't use these directly. */ > #ifdef __ASSEMBLY__ > +#ifdef ARM_HAVE_INST > +#define ___inst_arm(x) .inst x > +#define ___inst_thumb16(x) .inst.w x > +#define ___inst_thumb32(first, second) .inst.w first, second > +#else > #define ___inst_arm(x) .long x > #define ___inst_thumb16(x) .short x > #define ___inst_thumb32(first, second) .short first, second > +#endif /* !ARM_HAVE_INST */ > +#else > +#ifdef ARM_HAVE_INST > +#define ___inst_arm(x) ".inst " __stringify(x) "\n\t" > +#define ___inst_thumb16(x) ".inst.w " __stringify(x) "\n\t" It should be .inst.n instead of .inst.w > +#define ___inst_thumb32(first, second) \ > + ".inst.w " __stringify(first) ", " __stringify(second) "\n\t" I have not checked, but I think .inst.w will not combine two 16-bit arguments into one 32-bit instruction, but instead it will generate two wrong 32-bit instructions here. > #else > #define ___inst_arm(x) ".long " __stringify(x) "\n\t" > #define ___inst_thumb16(x) ".short " __stringify(x) "\n\t" > #define ___inst_thumb32(first, second) \ > ".short " __stringify(first) ", " __stringify(second) "\n\t" > +#endif /* !ARM_HAVE_INST */ > #endif > > #endif /* __ASM_ARM_OPCODES_H */ >
diff --git a/arch/arm/include/asm/opcodes.h b/arch/arm/include/asm/opcodes.h index e796c59..4c7cac1 100644 --- a/arch/arm/include/asm/opcodes.h +++ b/arch/arm/include/asm/opcodes.h @@ -103,9 +103,15 @@ extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); #define __opcode_to_mem_arm(x) ___opcode_swab32(x) #define __opcode_to_mem_thumb16(x) ___opcode_swab16(x) #define __opcode_to_mem_thumb32(x) ___opcode_swahb32(x) +#ifdef ARM_HAVE_INST #define ___asm_opcode_to_mem_arm(x) ___asm_opcode_swab32(x) #define ___asm_opcode_to_mem_thumb16(x) ___asm_opcode_swab16(x) #define ___asm_opcode_to_mem_thumb32(x) ___asm_opcode_swahb32(x) +#else +#define ___asm_opcode_to_mem_arm(x) ___asm_opcode_identity32(x) +#define ___asm_opcode_to_mem_thumb16(x) ___asm_opcode_identity16(x) +#define ___asm_opcode_to_mem_thumb32(x) ___asm_opcode_identity32(x) +#endif /* !ARM_HAVE_INST */ #else /* ! CONFIG_CPU_ENDIAN_BE8 */ @@ -218,14 +224,27 @@ extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr); /* Helpers for the helpers. Don't use these directly. */ #ifdef __ASSEMBLY__ +#ifdef ARM_HAVE_INST +#define ___inst_arm(x) .inst x +#define ___inst_thumb16(x) .inst.w x +#define ___inst_thumb32(first, second) .inst.w first, second +#else #define ___inst_arm(x) .long x #define ___inst_thumb16(x) .short x #define ___inst_thumb32(first, second) .short first, second +#endif /* !ARM_HAVE_INST */ +#else +#ifdef ARM_HAVE_INST +#define ___inst_arm(x) ".inst " __stringify(x) "\n\t" +#define ___inst_thumb16(x) ".inst.w " __stringify(x) "\n\t" +#define ___inst_thumb32(first, second) \ + ".inst.w " __stringify(first) ", " __stringify(second) "\n\t" #else #define ___inst_arm(x) ".long " __stringify(x) "\n\t" #define ___inst_thumb16(x) ".short " __stringify(x) "\n\t" #define ___inst_thumb32(first, second) \ ".short " __stringify(first) ", " __stringify(second) "\n\t" +#endif /* !ARM_HAVE_INST */ #endif #endif /* __ASM_ARM_OPCODES_H */
Currently the <asm/opcodes.h> header uses .work and .short to build instructions. This means the output data does not get marked as an instruction which can cause issues such as BE8 code failures. Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk> --- arch/arm/include/asm/opcodes.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)