Accessing global data before relocation needs special handling if link address != load address. Use LINK_OFF to calculate the difference. --- common/cmd_nvedit.c | 2 ++ common/console.c | 12 +++++++++--- common/env_common.c | 2 +- cpu/mpc83xx/cpu.c | 10 +++++----- cpu/mpc83xx/cpu_init.c | 26 ++++++++++++++------------ cpu/mpc83xx/speed.c | 28 +++++++++++----------------- drivers/serial/serial.c | 21 +++++++++++---------- include/common.h | 1 - include/linux/ctype.h | 6 +++--- lib_generic/crc32.c | 7 ++++++- lib_generic/ctype.c | 2 +- lib_generic/display_options.c | 5 +++-- lib_generic/vsprintf.c | 9 ++++++--- lib_ppc/board.c | 5 +++-- tools/updater/ctype.c | 2 +- 15 files changed, 76 insertions(+), 62 deletions(-)
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 9f8d531..182c6fe 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -512,6 +512,7 @@ char *getenv (char *name) { int i, nxt; + name = LINK_OFF(name); WATCHDOG_RESET(); for (i=0; env_get_char(i) != '\0'; i=nxt+1) { @@ -534,6 +535,7 @@ int getenv_r (char *name, char *buf, unsigned len) { int i, nxt; + name = LINK_OFF(name); for (i=0; env_get_char(i) != '\0'; i=nxt+1) { int val, n; diff --git a/common/console.c b/common/console.c index dc0d13b..afda83a 100644 --- a/common/console.c +++ b/common/console.c @@ -346,7 +346,7 @@ void putc(const char c) } } -void puts(const char *s) +static void printf_puts(const char *s) { #ifdef CONFIG_SILENT_CONSOLE if (gd->flags & GD_FLG_SILENT) @@ -367,12 +367,18 @@ void puts(const char *s) } } +void puts(const char *s) +{ + printf_puts(LINK_OFF(s)); +} + void printf(const char *fmt, ...) { va_list args; uint i; char printbuffer[CONFIG_SYS_PBSIZE]; + fmt = LINK_OFF(fmt); va_start(args, fmt); /* For this to work, printbuffer must be larger than @@ -382,7 +388,7 @@ void printf(const char *fmt, ...) va_end(args); /* Print the string */ - puts(printbuffer); + printf_puts(printbuffer); } void vprintf(const char *fmt, va_list args) @@ -396,7 +402,7 @@ void vprintf(const char *fmt, va_list args) i = vsprintf(printbuffer, fmt, args); /* Print the string */ - puts(printbuffer); + printf_puts(printbuffer); } /* test if ctrl-c was pressed */ diff --git a/common/env_common.c b/common/env_common.c index 439a4a9..107e711 100644 --- a/common/env_common.c +++ b/common/env_common.c @@ -153,7 +153,7 @@ static uchar env_get_char_init (int index) { c = env_get_char_spec(index); } else { - c = default_environment[index]; + c = LINK_OFF(default_environment)[index]; } return (c); diff --git a/cpu/mpc83xx/cpu.c b/cpu/mpc83xx/cpu.c index e38a372..12a2a84 100644 --- a/cpu/mpc83xx/cpu.c +++ b/cpu/mpc83xx/cpu.c @@ -51,8 +51,8 @@ int checkcpu(void) char buf[32]; int i; - const struct cpu_type { - char name[15]; + static const struct cpu_type { + char *name; u32 partid; } cpu_type_list [] = { CPU_TYPE_ENTRY(8311), @@ -72,6 +72,7 @@ int checkcpu(void) CPU_TYPE_ENTRY(8378), CPU_TYPE_ENTRY(8379), }; + const struct cpu_type *cpu_ptr = LINK_OFF(cpu_type_list); immr = (immap_t *)CONFIG_SYS_IMMR; @@ -99,11 +100,10 @@ int checkcpu(void) } spridr = immr->sysconf.spridr; - for (i = 0; i < ARRAY_SIZE(cpu_type_list); i++) - if (cpu_type_list[i].partid == PARTID_NO_E(spridr)) { + if (cpu_ptr[i].partid == PARTID_NO_E(spridr)) { puts("MPC"); - puts(cpu_type_list[i].name); + puts(cpu_ptr[i].name); if (IS_E_PROCESSOR(spridr)) puts("E"); if (REVID_MAJOR(spridr) >= 2) diff --git a/cpu/mpc83xx/cpu_init.c b/cpu/mpc83xx/cpu_init.c index 031e8d5..2912dec 100644 --- a/cpu/mpc83xx/cpu_init.c +++ b/cpu/mpc83xx/cpu_init.c @@ -42,13 +42,14 @@ static void config_qe_ioports(void) u8 port, pin; int dir, open_drain, assign; int i; - - for (i = 0; qe_iop_conf_tab[i].assign != QE_IOP_TAB_END; i++) { - port = qe_iop_conf_tab[i].port; - pin = qe_iop_conf_tab[i].pin; - dir = qe_iop_conf_tab[i].dir; - open_drain = qe_iop_conf_tab[i].open_drain; - assign = qe_iop_conf_tab[i].assign; + qe_iop_conf_t *qe_ptr = LINK_OFF(qe_iop_conf_tab); + + for (i = 0; qe_ptr[i].assign != QE_IOP_TAB_END; i++) { + port = qe_ptr[i].port; + pin = qe_ptr[i].pin; + dir = qe_ptr[i].dir; + open_drain = qe_ptr[i].open_drain; + assign = qe_ptr[i].assign; qe_config_iopin(port, pin, dir, open_drain, assign); } } @@ -501,7 +502,7 @@ static int print_83xx_arb_event(int force) */ int prt_83xx_rsr(void) { - static struct { + static const struct reset_type { ulong mask; char *desc; } bits[] = { @@ -515,7 +516,7 @@ int prt_83xx_rsr(void) RSR_SRS, "External/Internal Soft"}, { RSR_HRS, "External/Internal Hard"} }; - static int n = sizeof bits / sizeof bits[0]; + const struct reset_type *bp = LINK_OFF(bits); ulong rsr = gd->reset_status; int i; char *sep; @@ -523,9 +524,10 @@ int prt_83xx_rsr(void) puts("Reset Status:"); sep = " "; - for (i = 0; i < n; i++) - if (rsr & bits[i].mask) { - printf("%s%s", sep, bits[i].desc); + for (i = 0; i < ARRAY_SIZE(bits); i++) + if (rsr & bp[i].mask) { + puts(sep); + puts(bp[i].desc); sep = ", "; } puts("\n"); diff --git a/cpu/mpc83xx/speed.c b/cpu/mpc83xx/speed.c index bde7e92..001387a 100644 --- a/cpu/mpc83xx/speed.c +++ b/cpu/mpc83xx/speed.c @@ -98,7 +98,8 @@ int get_clocks(void) u32 corecnf_tab_index; u8 corepll; u32 lcrr; - + corecnf_t *cnf_tab; + int csb_r; u32 csb_clk; #if defined(CONFIG_MPC834x) || defined(CONFIG_MPC831x) || defined(CONFIG_MPC837x) u32 tsec1_clk; @@ -413,28 +414,21 @@ int get_clocks(void) /* corecnf_tab_index is too high, possibly worng value */ return -11; } - switch (corecnf_tab[corecnf_tab_index].core_csb_ratio) { - case _byp: - case _x1: - case _1x: + cnf_tab = LINK_OFF(corecnf_tab); + csb_r = cnf_tab[corecnf_tab_index].core_csb_ratio; + /* Cannot use a switch stmt here, it uses linked address */ + if (csb_r == _byp || csb_r == _x1 || csb_r == _1x) core_clk = csb_clk; - break; - case _1_5x: + else if (csb_r == _1_5x) core_clk = (3 * csb_clk) / 2; - break; - case _2x: + else if (csb_r == _2x) core_clk = 2 * csb_clk; - break; - case _2_5x: + else if (csb_r == _2_5x) core_clk = (5 * csb_clk) / 2; - break; - case _3x: + else if (csb_r == _3x) core_clk = 3 * csb_clk; - break; - default: - /* unkown core to csb ratio */ + else /* unkown core to csb ratio */ return -13; - } #if defined(CONFIG_MPC8360) || defined(CONFIG_MPC832x) qepmf = (im->reset.rcwl & HRCWL_CEPMF) >> HRCWL_CEPMF_SHIFT; diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index dd5f332..4ccfb56 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -85,9 +85,9 @@ static NS16550_t serial_ports[4] = { #endif }; -#define PORT serial_ports[port-1] +#define PORT (LINK_OFF(serial_ports)[port-1]) #if defined(CONFIG_CONS_INDEX) -#define CONSOLE (serial_ports[CONFIG_CONS_INDEX-1]) +#define CONSOLE (LINK_OFF(serial_ports)[CONFIG_CONS_INDEX-1]) #endif #if defined(CONFIG_SERIAL_MULTI) @@ -159,26 +159,27 @@ static int calc_divisor (NS16550_t port) int serial_init (void) { int clock_divisor; + NS16550_t * sp = LINK_OFF(serial_ports); #ifdef CONFIG_NS87308 initialise_ns87308(); #endif #ifdef CONFIG_SYS_NS16550_COM1 - clock_divisor = calc_divisor(serial_ports[0]); - NS16550_init(serial_ports[0], clock_divisor); + clock_divisor = calc_divisor(sp[0]); + NS16550_init(sp[0], clock_divisor); #endif #ifdef CONFIG_SYS_NS16550_COM2 - clock_divisor = calc_divisor(serial_ports[1]); - NS16550_init(serial_ports[1], clock_divisor); + clock_divisor = calc_divisor(sp[1]); + NS16550_init(sp[1], clock_divisor); #endif #ifdef CONFIG_SYS_NS16550_COM3 - clock_divisor = calc_divisor(serial_ports[2]); - NS16550_init(serial_ports[2], clock_divisor); + clock_divisor = calc_divisor(sp[2]); + NS16550_init(sp[2], clock_divisor); #endif #ifdef CONFIG_SYS_NS16550_COM4 - clock_divisor = calc_divisor(serial_ports[3]); - NS16550_init(serial_ports[3], clock_divisor); + clock_divisor = calc_divisor(sp[3]); + NS16550_init(sp[3], clock_divisor); #endif return (0); diff --git a/include/common.h b/include/common.h index 90c9a13..67add2d 100644 --- a/include/common.h +++ b/include/common.h @@ -99,7 +99,6 @@ const void * link_off(const void *); #define link_off(x) ((const void *)(x)) #endif #define LINK_OFF(x) ((__typeof__(&(x)[0]))link_off(x)) -#define GOT_OFF(x) LINK_OFF(x) #ifdef CONFIG_4xx #include <ppc4xx.h> #endif diff --git a/include/linux/ctype.h b/include/linux/ctype.h index afa3639..5873c55 100644 --- a/include/linux/ctype.h +++ b/include/linux/ctype.h @@ -1,6 +1,6 @@ #ifndef _LINUX_CTYPE_H #define _LINUX_CTYPE_H - +#include <common.h> /* * NOTE! This ctype does not handle EOF like the standard C * library is required to. @@ -15,9 +15,9 @@ #define _X 0x40 /* hex digit */ #define _SP 0x80 /* hard space (0x20) */ -extern unsigned char _ctype[]; +extern const unsigned char _ctype[]; -#define __ismask(x) (_ctype[(int)(unsigned char)(x)]) +#define __ismask(x) (LINK_OFF(_ctype)[(int)(unsigned char)(x)]) #define isalnum(c) ((__ismask(c)&(_U|_L|_D)) != 0) #define isalpha(c) ((__ismask(c)&(_U|_L)) != 0) diff --git a/lib_generic/crc32.c b/lib_generic/crc32.c index b27048c..2e11548 100644 --- a/lib_generic/crc32.c +++ b/lib_generic/crc32.c @@ -148,7 +148,7 @@ const uint32_t * ZEXPORT get_crc_table() #endif /* ========================================================================= */ -#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); +#define DO1(buf) crc = crc_tab[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); #define DO2(buf) DO1(buf); DO1(buf); #define DO4(buf) DO2(buf); DO2(buf); #define DO8(buf) DO4(buf); DO4(buf); @@ -156,6 +156,11 @@ const uint32_t * ZEXPORT get_crc_table() /* ========================================================================= */ uint32_t ZEXPORT crc32 (uint32_t crc, const Bytef *buf, uInt len) { +#ifdef LINK_OFF + const uint32_t *crc_tab = LINK_OFF(crc_table); +#else + const uint32_t *crc_tab = crc_table; +#endif #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); diff --git a/lib_generic/ctype.c b/lib_generic/ctype.c index 6ed0468..dffe563 100644 --- a/lib_generic/ctype.c +++ b/lib_generic/ctype.c @@ -29,7 +29,7 @@ #include <linux/ctype.h> -unsigned char _ctype[] = { +const unsigned char _ctype[] = { _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ _C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ diff --git a/lib_generic/display_options.c b/lib_generic/display_options.c index 2dc2567..6b9fba2 100644 --- a/lib_generic/display_options.c +++ b/lib_generic/display_options.c @@ -31,9 +31,9 @@ int display_options (void) extern char version_string[]; #if defined(BUILD_TAG) - printf ("\n\n%s, Build: %s\n\n", version_string, BUILD_TAG); + printf ("\n\n%s, Build: %s\n\n", LINK_OFF(version_string), LINK_OFF(BUILD_TAG)); #else - printf ("\n\n%s\n\n", version_string); + printf ("\n\n%s\n\n", LINK_OFF(version_string)); #endif return 0; } @@ -49,6 +49,7 @@ void print_size (phys_size_t size, const char *s) phys_size_t d = 1 << 30; /* 1 GB */ char c = 'G'; + s = LINK_OFF(s); if (size < d) { /* try MB */ c = 'M'; d = 1 << 20; diff --git a/lib_generic/vsprintf.c b/lib_generic/vsprintf.c index 3d95728..b779f56 100644 --- a/lib_generic/vsprintf.c +++ b/lib_generic/vsprintf.c @@ -37,8 +37,8 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); const char hex_asc[] = "0123456789abcdef"; -#define hex_asc_lo(x) hex_asc[((x) & 0x0f)] -#define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4] +#define hex_asc_lo(x) LINK_OFF(hex_asc)[((x) & 0x0f)] +#define hex_asc_hi(x) LINK_OFF(hex_asc)[((x) & 0xf0) >> 4] static inline char *pack_hex_byte(char *buf, u8 byte) { @@ -303,7 +303,7 @@ static char *number(char *buf, unsigned NUM_TYPE num, int base, int size, int pr int shift = 3; if (base == 16) shift = 4; do { - tmp[i++] = (digits[((unsigned char)num) & mask] | locase); + tmp[i++] = (LINK_OFF(digits)[((unsigned char)num) & mask] | locase); num >>= shift; } while (num); } else { /* base 10 */ @@ -675,6 +675,7 @@ int sprintf(char * buf, const char *fmt, ...) va_list args; int i; + fmt = LINK_OFF(fmt); va_start(args, fmt); i=vsprintf(buf,fmt,args); va_end(args); @@ -684,6 +685,8 @@ int sprintf(char * buf, const char *fmt, ...) void panic(const char *fmt, ...) { va_list args; + + fmt = LINK_OFF(fmt); va_start(args, fmt); vprintf(fmt, args); putc('\n'); diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 765f97a..f9a7d30 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -384,8 +384,9 @@ void board_init_f (ulong bootflag) memset ((void *) gd, 0, sizeof (gd_t)); #endif - for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { - if ((*init_fnc_ptr) () != 0) { + for (init_fnc_ptr = LINK_OFF(init_sequence); *init_fnc_ptr; + ++init_fnc_ptr) { + if (((init_fnc_t *)link_off(*init_fnc_ptr)) () != 0) { hang (); } } diff --git a/tools/updater/ctype.c b/tools/updater/ctype.c index 6ed0468..dffe563 100644 --- a/tools/updater/ctype.c +++ b/tools/updater/ctype.c @@ -29,7 +29,7 @@ #include <linux/ctype.h> -unsigned char _ctype[] = { +const unsigned char _ctype[] = { _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ _C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ _C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ -- 1.6.4.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot