aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorStefan Roese2020-06-05 10:29:25 +0200
committerDaniel Schwierzeck2020-07-18 14:23:25 +0200
commitc37281310593c01981516bb706242f80295a1308 (patch)
treef120239d1c9ea31f7ea298d2e7f5a85d637e9c9a /arch
parenta02bc1f99275a17e1d29886c8c69398e9313842d (diff)
mips: reloc: Change R_MIPS_NONE to catch pre-reloc BSS usage
This patch changes the R_MIPS_NONE define from 0 to a magic value. This makes it possible to better detect any forbidden pre-relocation usage of BSS variables, as they are often zero'ed and then relocation is stopped too early. Additionally the error message is improved to also print the faulting address. This helps finding the root-cause for this breakage by comparing this address with the values in System.map. This patch helps a lot when working on pre-relocation code, like the Octeon DDR init code, where such variables have hit me multiple times now. Signed-off-by: Stefan Roese <sr@denx.de> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> Cc: Aaron Williams <awilliams@marvell.com> Cc: Chandrakala Chavva <cchavva@marvell.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/mips/include/asm/relocs.h2
-rw-r--r--arch/mips/lib/reloc.c7
2 files changed, 5 insertions, 4 deletions
diff --git a/arch/mips/include/asm/relocs.h b/arch/mips/include/asm/relocs.h
index 0987c4bb136..b9b0261f624 100644
--- a/arch/mips/include/asm/relocs.h
+++ b/arch/mips/include/asm/relocs.h
@@ -8,7 +8,7 @@
#ifndef __ASM_MIPS_RELOCS_H__
#define __ASM_MIPS_RELOCS_H__
-#define R_MIPS_NONE 0
+#define R_MIPS_NONE 0xbeef7531
#define R_MIPS_32 2
#define R_MIPS_26 4
#define R_MIPS_HI16 5
diff --git a/arch/mips/lib/reloc.c b/arch/mips/lib/reloc.c
index ffc8c7a1b72..67c8af2f35a 100644
--- a/arch/mips/lib/reloc.c
+++ b/arch/mips/lib/reloc.c
@@ -67,7 +67,7 @@ static unsigned long read_uint(uint8_t **buf)
* intentionally simple, and does the bare minimum needed to fixup the
* relocated U-Boot - in particular, it does not check for overflows.
*/
-static void apply_reloc(unsigned int type, void *addr, long off)
+static void apply_reloc(unsigned int type, void *addr, long off, uint8_t *buf)
{
uint32_t u32;
@@ -92,7 +92,8 @@ static void apply_reloc(unsigned int type, void *addr, long off)
break;
default:
- panic("Unhandled reloc type %u\n", type);
+ panic("Unhandled reloc type %u (@ %p), bss used before relocation?\n",
+ type, buf);
}
}
@@ -137,7 +138,7 @@ void relocate_code(ulong start_addr_sp, gd_t *new_gd, ulong relocaddr)
break;
addr += read_uint(&buf) << 2;
- apply_reloc(type, (void *)addr, off);
+ apply_reloc(type, (void *)addr, off, buf);
}
/* Ensure the icache is coherent */