Skip to contentSkip to conversation

ARM: fix BE8 module loading

PATCH New Arnd Bergmann 3 participants 4 messages May 18, 2015 Arm (32-bit)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ARM: fix BE8 module loading

The new veneer support for loadable modules on ARM uses the __opcode_to_mem_thumb32() function to count R_ARM_THM_CALL and R_ARM_THM_JUMP24 relocations.

However, this function is not defined for big-endian kernels on ARMv5 or before, causing a compile-time error:

arch/arm/kernel/module-plts.c: In function 'count_plts':
arch/arm/kernel/module-plts.c:124:9: error: implicit declaration of function '__opcode_to_mem_thumb32' [-Werror=implicit-function-declaration]

         __opcode_to_mem_thumb32(0x07ff2fff)))
         ^

As we know that this part of the function is only needed for Thumb2 kernels, and that those can never happen with BE8, we can avoid the error by enclosing the code in an #ifdef.

Fixes 7d485f647c1 ("ARM: 8220/1: allow modules outside of bl range")

---
Found with the randconfig builder on linux-next.

arch/arm/kernel/module-plts.c +2 -0
index 71a65c49871d..097e2e201b9f 100644
@@ -118,11 +118,13 @@ static unsigned int count_plts(Elf32_Addr base, const Elf32_Rel *rel, int num)
 					   __opcode_to_mem_arm(0x00ffffff)))
 				ret++;
 			break;
+#ifdef CONFIG_THUMB2_KERNEL
 		case R_ARM_THM_CALL:
 		case R_ARM_THM_JUMP24:
 			if (!duplicate_rel(base, rel, i,
 					   __opcode_to_mem_thumb32(0x07ff2fff)))
 				ret++;
+#endif
 		}
 	return ret;
 }
#1 lore raw

PATCH 1/1 ARM: fix BE8 module loading

Quoted 12 lines · Arnd Bergmann

The new veneer support for loadable modules on ARM uses the __opcode_to_mem_thumb32() function to count R_ARM_THM_CALL and R_ARM_THM_JUMP24 relocations.

However, this function is not defined for big-endian kernels on ARMv5 or before, causing a compile-time error:

arch/arm/kernel/module-plts.c: In function 'count_plts':
arch/arm/kernel/module-plts.c:124:9: error: implicit declaration of function '__opcode_to_mem_thumb32' [-Werror=implicit-function-declaration]

         __opcode_to_mem_thumb32(0x07ff2fff)))
         ^
Quoted 9 lines

As we know that this part of the function is only needed for Thumb2 kernels, and that those can never happen with BE8, we can avoid the error by enclosing the code in an #ifdef.

Fixes 7d485f647c1 ("ARM: 8220/1: allow modules outside of bl range")

---
Found with the randconfig builder on linux-next.

Quoted 19 lines
arch/arm/kernel/module-plts.c +2 -0
index 71a65c49871d..097e2e201b9f 100644
@@ -118,11 +118,13 @@ static unsigned int count_plts(Elf32_Addr base, const Elf32_Rel *rel, int num)
                                           __opcode_to_mem_arm(0x00ffffff)))
                                ret++;
                        break;
+#ifdef CONFIG_THUMB2_KERNEL
                case R_ARM_THM_CALL:
                case R_ARM_THM_JUMP24:
                        if (!duplicate_rel(base, rel, i,
                                           __opcode_to_mem_thumb32(0x07ff2fff)))
                                ret++;
+#endif
                }
        return ret;
 }
#2 lore raw

PATCH 1/1 ARM: fix BE8 module loading

In reply to Arnd Bergmann

Hi Arnd,

Quoted 7 lines · Arnd Bergmann

The new veneer support for loadable modules on ARM uses the __opcode_to_mem_thumb32() function to count R_ARM_THM_CALL and R_ARM_THM_JUMP24 relocations.

However, this function is not defined for big-endian kernels on ARMv5 or before, causing a compile-time error:

Quoted 7 lines

arch/arm/kernel/module-plts.c: In function 'count_plts':
arch/arm/kernel/module-plts.c:124:9: error: implicit declaration of function '__opcode_to_mem_thumb32' [-Werror=implicit-function-declaration]

          __opcode_to_mem_thumb32(0x07ff2fff)))
          ^

As we know that this part of the function is only needed for Thumb2 kernels, and that those can never happen with BE8,

Do you mean BE-32 here (and in the title)? That's the obsolete wacky word-invariant one, BE-8 is the sensible* one that modern CPUs support.

Robin.

*as sensible as big-endian could ever be, at any rate :P

Quoted 32 lines

we can avoid the error by enclosing the code in an #ifdef.

Fixes 7d485f647c1 ("ARM: 8220/1: allow modules outside of bl range")

---
Found with the randconfig builder on linux-next.

arch/arm/kernel/module-plts.c +2 -0
index 71a65c49871d..097e2e201b9f 100644
@@ -118,11 +118,13 @@ static unsigned int count_plts(Elf32_Addr base, const Elf32_Rel *rel, int num)
  					   __opcode_to_mem_arm(0x00ffffff)))
  				ret++;
  			break;
+#ifdef CONFIG_THUMB2_KERNEL
  		case R_ARM_THM_CALL:
  		case R_ARM_THM_JUMP24:
  			if (!duplicate_rel(base, rel, i,
  					   __opcode_to_mem_thumb32(0x07ff2fff)))
  				ret++;
+#endif
  		}
  	return ret;
  }

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

#3 lore raw

PATCH 1/1 ARM: fix BE8 module loading

Quoted 8 lines · On Monday 18 May 2015 15:22:44 Robin Murphy wrote:

Do you mean BE-32 here (and in the title)? That's the obsolete wacky word-invariant one, BE-8 is the sensible* one that modern CPUs support.

Robin.

*as sensible as big-endian could ever be, at any rate

You are absolutely right, I've fixed up the changelog accordingly now.

Arnd