Title: [6851] trunk/arch/blackfin/kernel/module.c: All kernel modules are required to be built with long-jump, and
Revision
6851
Author
rgetz
Date
2009-06-25 10:49:38 -0500 (Thu, 25 Jun 2009)

Log Message

All kernel modules are required to be built with long-jump, and
therefore should not generate these relocations. If they do - it means
the module has not been built properly - so rather than trying to handle
them, and get random run time errors, just error out on module load.

Modified Paths

Diff

Modified: trunk/arch/blackfin/kernel/module.c (6850 => 6851)


--- trunk/arch/blackfin/kernel/module.c	2009-06-25 03:08:01 UTC (rev 6850)
+++ trunk/arch/blackfin/kernel/module.c	2009-06-25 15:49:38 UTC (rev 6851)
@@ -243,40 +243,6 @@
 #endif
 		switch (ELF32_R_TYPE(rel[i].r_info)) {
 
-		case R_BFIN_PCREL24:
-		case R_BFIN_PCREL24_JUMP_L:
-			/* Add the value, subtract its postition */
-			location16 =
-			    (uint16_t *) (sechdrs[sechdrs[relsec].sh_info].
-					  sh_addr + rel[i].r_offset - 2);
-			location32 = (uint32_t *) location16;
-			value -= (uint32_t) location32;
-			value >>= 1;
-			if ((value & 0xFF000000) != 0 &&
-			    (value & 0xFF000000) != 0xFF000000) {
-				printk(KERN_ERR "module %s: relocation overflow\n",
-				       mod->name);
-				return -ENOEXEC;
-			}
-			pr_debug("value is %x, before %x-%x after %x-%x\n", value,
-			       *location16, *(location16 + 1),
-			       (*location16 & 0xff00) | (value >> 16 & 0x00ff),
-			       value & 0xffff);
-			*location16 =
-			    (*location16 & 0xff00) | (value >> 16 & 0x00ff);
-			*(location16 + 1) = value & 0xffff;
-			break;
-		case R_BFIN_PCREL12_JUMP:
-		case R_BFIN_PCREL12_JUMP_S:
-			value -= (uint32_t) location32;
-			value >>= 1;
-			*location16 = (value & 0xfff);
-			break;
-		case R_BFIN_PCREL10:
-			value -= (uint32_t) location32;
-			value >>= 1;
-			*location16 = (value & 0x3ff);
-			break;
 		case R_BFIN_LUIMM16:
 			pr_debug("before %x after %x\n", *location16,
 				       (value & 0xffff));
@@ -302,6 +268,14 @@
 			pr_debug("before %x after %x\n", *location32, value);
 			*location32 = value;
 			break;
+		case R_BFIN_PCREL24:
+		case R_BFIN_PCREL24_JUMP_L:
+		case R_BFIN_PCREL12_JUMP:
+		case R_BFIN_PCREL12_JUMP_S:
+		case R_BFIN_PCREL10:
+			printk(KERN_ERR "module %s: Unsupported relocation: %u not built properly,"
+				" includes relocation: %u", mod->name, ELF32_R_TYPE(rel[i].r_info));
+			return -ENOEXEC;
 		default:
 			printk(KERN_ERR "module %s: Unknown relocation: %u\n",
 			       mod->name, ELF32_R_TYPE(rel[i].r_info));
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to