diff options
Diffstat (limited to 'lib_ppc')
| -rw-r--r-- | lib_ppc/Makefile | 6 | ||||
| -rw-r--r-- | lib_ppc/board.c | 50 | ||||
| -rw-r--r-- | lib_ppc/config.mk | 1 | ||||
| -rw-r--r-- | lib_ppc/extable.c | 26 | 
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;  } |