summaryrefslogtreecommitdiff
path: root/lib_ppc
diff options
context:
space:
mode:
authorWolfgang Denk <wd@denx.de>2009-10-09 00:03:18 +0200
committerWolfgang Denk <wd@denx.de>2009-10-09 00:03:18 +0200
commitcd77dd109c4a439519a78c32eddc42bdebc7a61f (patch)
treec5534647cb1786044ef0f7e4ad4067725eddf11d /lib_ppc
parent95c44ec485b46ffb43dbdaa299f1491a500fdadf (diff)
parentafc3ba0fc4195624e79e21244380ed7cc2fd6969 (diff)
Merge branch 'reloc'
Diffstat (limited to 'lib_ppc')
-rw-r--r--lib_ppc/Makefile6
-rw-r--r--lib_ppc/board.c50
-rw-r--r--lib_ppc/config.mk1
-rw-r--r--lib_ppc/extable.c26
4 files changed, 13 insertions, 70 deletions
diff --git a/lib_ppc/Makefile b/lib_ppc/Makefile
index 60ea0c913..399b41e31 100644
--- a/lib_ppc/Makefile
+++ b/lib_ppc/Makefile
@@ -42,6 +42,12 @@ SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
$(LIB): $(obj).depend $(OBJS)
+ @if ! $(CROSS_COMPILE)readelf -S $(OBJS) | grep -q '\.fixup.*PROGBITS';\
+ then \
+ echo "ERROR: Your compiler doesn't generate .fixup sections!";\
+ echo " Upgrade to a recent toolchain."; \
+ exit 1; \
+ fi;
$(AR) $(ARFLAGS) $@ $(OBJS)
#########################################################################
diff --git a/lib_ppc/board.c b/lib_ppc/board.c
index f9dbdb9a8..8b8ddb534 100644
--- a/lib_ppc/board.c
+++ b/lib_ppc/board.c
@@ -627,13 +627,8 @@ void board_init_f (ulong bootflag)
*/
void board_init_r (gd_t *id, ulong dest_addr)
{
- cmd_tbl_t *cmdtp;
char *s;
bd_t *bd;
- extern void malloc_bin_reloc (void);
-#ifndef CONFIG_ENV_IS_NOWHERE
- extern char * env_name_spec;
-#endif
ulong malloc_start;
#ifndef CONFIG_SYS_NO_FLASH
@@ -646,18 +641,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
/* The Malloc area is immediately below the monitor copy in DRAM */
-#if defined(CONFIG_RELOC_FIXUP_WORKS)
- gd->reloc_off = 0;
malloc_start = dest_addr - TOTAL_MALLOC_LEN;
-#else
- gd->reloc_off = dest_addr - CONFIG_SYS_MONITOR_BASE;
- malloc_start = CONFIG_SYS_MONITOR_BASE + gd->reloc_off -
- TOTAL_MALLOC_LEN;
-#endif
-
-#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
- gd->cpu += gd->reloc_off;
-#endif
#ifdef CONFIG_SERIAL_MULTI
serial_initialize();
@@ -682,38 +666,6 @@ void board_init_r (gd_t *id, ulong dest_addr)
monitor_flash_len = (ulong)&__init_end - dest_addr;
- /*
- * We have to relocate the command table manually
- */
- for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) {
- ulong addr;
- addr = (ulong) (cmdtp->cmd) + gd->reloc_off;
-#if 0
- printf ("Command \"%s\": 0x%08lx => 0x%08lx\n",
- cmdtp->name, (ulong) (cmdtp->cmd), addr);
-#endif
- cmdtp->cmd =
- (int (*)(struct cmd_tbl_s *, int, int, char *[]))addr;
-
- addr = (ulong)(cmdtp->name) + gd->reloc_off;
- cmdtp->name = (char *)addr;
-
- if (cmdtp->usage) {
- addr = (ulong)(cmdtp->usage) + gd->reloc_off;
- cmdtp->usage = (char *)addr;
- }
-#ifdef CONFIG_SYS_LONGHELP
- if (cmdtp->help) {
- addr = (ulong)(cmdtp->help) + gd->reloc_off;
- cmdtp->help = (char *)addr;
- }
-#endif
- }
- /* there are some other pointer constants we must deal with */
-#ifndef CONFIG_ENV_IS_NOWHERE
- env_name_spec += gd->reloc_off;
-#endif
-
WATCHDOG_RESET ();
#ifdef CONFIG_LOGBUFFER
@@ -721,7 +673,6 @@ void board_init_r (gd_t *id, ulong dest_addr)
#endif
#ifdef CONFIG_POST
post_output_backlog ();
- post_reloc ();
#endif
WATCHDOG_RESET();
@@ -752,7 +703,6 @@ void board_init_r (gd_t *id, ulong dest_addr)
asm ("sync ; isync");
mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
- malloc_bin_reloc ();
#if !defined(CONFIG_SYS_NO_FLASH)
puts ("FLASH: ");
diff --git a/lib_ppc/config.mk b/lib_ppc/config.mk
index 010d874da..06a3b107d 100644
--- a/lib_ppc/config.mk
+++ b/lib_ppc/config.mk
@@ -25,6 +25,7 @@ CROSS_COMPILE ?= ppc_8xx-
STANDALONE_LOAD_ADDR = 0x40000
+PLATFORM_RELFLAGS += -mrelocatable
PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__
PLATFORM_LDFLAGS += -n
diff --git a/lib_ppc/extable.c b/lib_ppc/extable.c
index 91e2b3d24..7408d5c96 100644
--- a/lib_ppc/extable.c
+++ b/lib_ppc/extable.c
@@ -53,27 +53,13 @@ search_one_table(const struct exception_table_entry *first,
unsigned long value)
{
long diff;
- if ((ulong) first > CONFIG_SYS_MONITOR_BASE) {
- /* exception occurs in FLASH, before u-boot relocation.
- * No relocation offset is needed.
- */
- while (first <= last) {
- diff = first->insn - value;
- if (diff == 0)
- return first->fixup;
- first++;
- }
- } else {
- /* exception occurs in RAM, after u-boot relocation.
- * A relocation offset should be added.
- */
- while (first <= last) {
- diff = (first->insn + gd->reloc_off) - value;
- if (diff == 0)
- return (first->fixup + gd->reloc_off);
- first++;
- }
+ while (first <= last) {
+ diff = first->insn - value;
+ if (diff == 0)
+ return first->fixup;
+ first++;
}
+
return 0;
}