From 8d0a6cbd9fa821834ec314e323381ab9b1acbb98 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Fri, 28 Nov 2008 10:16:41 +0000 Subject: [PATCH] qi-add-steppingstone-section-for-putc.patch We need putc even when we are operating entirely from steppingstone. Arrange that the board-specific putc code is in a section that goes into steppingstone, and adapt the utils.c putc() so that it no longer needs to indirect through the board_api struct that is in main memory. Signed-off-by: Andy Green --- qiboot/include/qi.h | 2 ++ qiboot/src/cpu/s3c2442/gta02.c | 2 +- qiboot/src/cpu/s3c2442/qi.lds | 16 ++++++++++------ qiboot/src/cpu/s3c2442/start_qi.c | 1 + qiboot/src/cpu/s3c6410/gta03.c | 2 +- qiboot/src/cpu/s3c6410/qi.lds | 16 +++++++++------- qiboot/src/cpu/s3c6410/start_qi.c | 3 ++- qiboot/src/utils.c | 26 +++++++++++++++----------- 8 files changed, 41 insertions(+), 27 deletions(-) diff --git a/qiboot/include/qi.h b/qiboot/include/qi.h index b9970a4..90d16cf 100644 --- a/qiboot/include/qi.h +++ b/qiboot/include/qi.h @@ -108,5 +108,7 @@ int nand_read_ll(unsigned char *buf, unsigned long start512, int blocks512); extern void memory_test(void * start, unsigned int length); +void set_putc_func(void (*p)(char)); + #endif diff --git a/qiboot/src/cpu/s3c2442/gta02.c b/qiboot/src/cpu/s3c2442/gta02.c index 3f33957..23acefa 100644 --- a/qiboot/src/cpu/s3c2442/gta02.c +++ b/qiboot/src/cpu/s3c2442/gta02.c @@ -341,7 +341,7 @@ const struct board_variant const * get_board_variant_gta02(void) return &board_variants[gta02_get_pcb_revision() & 1]; } -static void putc_gta02(char c) +static __attribute__ (( section (".steppingstone") )) void putc_gta02(char c) { serial_putc_s3c24xx(GTA02_DEBUG_UART, c); } diff --git a/qiboot/src/cpu/s3c2442/qi.lds b/qiboot/src/cpu/s3c2442/qi.lds index 09da8bb..c23b447 100644 --- a/qiboot/src/cpu/s3c2442/qi.lds +++ b/qiboot/src/cpu/s3c2442/qi.lds @@ -37,12 +37,16 @@ SECTIONS . = ALIGN(4); .text : { - src/cpu/s3c2442/start.o (.text .rodata* .data) - src/cpu/s3c2442/lowlevel_init.o (.text .rodata* .data) - src/cpu/s3c2442/start_qi.o (.text .rodata* .data) - src/blink_led.o (.text .rodata* .data) - src/cpu/s3c2442/nand_read.o (.text .rodata* .data) - src/cpu/s3c2442/serial-s3c24xx.o (.text .rodata* .data) + src/cpu/s3c2442/start.o (.text .rodata* .data .bss) + src/cpu/s3c2442/lowlevel_init.o (.text .rodata* .data .bss) + src/cpu/s3c2442/start_qi.o (.text .rodata* .data .bss) +/* src/blink_led.o (.text .rodata* .data .bss) */ + src/cpu/s3c2442/nand_read.o (.text .rodata* .data .bss) + src/cpu/s3c2442/serial-s3c24xx.o (.text .rodata* .data .bss) + src/memory-test.o (.text .rodata* .data .bss) + src/utils.o (.text .rodata* .data .bss) + src/ctype.o (.text .rodata* .data .bss) + * (.steppingstone) } . = ALIGN(4); diff --git a/qiboot/src/cpu/s3c2442/start_qi.c b/qiboot/src/cpu/s3c2442/start_qi.c index 38a95ba..8364a2d 100644 --- a/qiboot/src/cpu/s3c2442/start_qi.c +++ b/qiboot/src/cpu/s3c2442/start_qi.c @@ -98,6 +98,7 @@ void start_qi(void) } this_board->port_init(); + set_putc_func(this_board->putc); /* stick some hello messages on debug console */ diff --git a/qiboot/src/cpu/s3c6410/gta03.c b/qiboot/src/cpu/s3c6410/gta03.c index a6766d8..e925740 100644 --- a/qiboot/src/cpu/s3c6410/gta03.c +++ b/qiboot/src/cpu/s3c6410/gta03.c @@ -166,7 +166,7 @@ int is_this_board_gta03(void) return 1; } -static void putc_gta03(char c) +static __attribute__ (( section (".steppingstone") )) void putc_gta03(char c) { serial_putc_s3c64xx(GTA03_DEBUG_UART, c); } diff --git a/qiboot/src/cpu/s3c6410/qi.lds b/qiboot/src/cpu/s3c6410/qi.lds index d148c86..7a89334 100644 --- a/qiboot/src/cpu/s3c6410/qi.lds +++ b/qiboot/src/cpu/s3c6410/qi.lds @@ -42,13 +42,15 @@ SECTIONS __steppingstone : AT (0) { - src/cpu/s3c6410/start.o (.text .rodata* .data) - src/cpu/s3c6410/start_qi.o (.text .rodata* .data) - src/cpu/s3c6410/serial-s3c64xx.o (.text .rodata* .data) - src/cpu/s3c6410/gta03.o (.text .rodata* .data) - src/cpu/s3c6410/hs_mmc.o (.text .rodata* .data) - src/utils.o (.text .rodata* .data) - src/ctype.o (.text .rodata* .data) + src/cpu/s3c6410/start.o (.text .rodata* .data .bss) + src/cpu/s3c6410/start_qi.o (.text .rodata* .data .bss) + src/cpu/s3c6410/serial-s3c64xx.o (.text .rodata* .data .bss) + src/cpu/s3c6410/gta03.o (.text .rodata* .data .bss) + src/cpu/s3c6410/hs_mmc.o (.text .rodata* .data .bss) + src/utils.o (.text .rodata* .data .bss) + src/memory-test.o (.text .rodata* .data .bss) + src/ctype.o (.text .rodata* .data .bss) + * (.steppingstone) } . = ALIGN(4); diff --git a/qiboot/src/cpu/s3c6410/start_qi.c b/qiboot/src/cpu/s3c6410/start_qi.c index a12a512..ac94b66 100644 --- a/qiboot/src/cpu/s3c6410/start_qi.c +++ b/qiboot/src/cpu/s3c6410/start_qi.c @@ -79,6 +79,7 @@ void start_qi(void) /* okay, do the critical port and serial init for our board */ this_board->port_init(); + set_putc_func(this_board->putc); /* stick some hello messages on debug console */ @@ -97,7 +98,7 @@ void start_qi(void) if (!is_jtag) { /* - * We got the first 4KBytes of the bootloader pulled into the + * We got the first 8KBytes of the bootloader pulled into the * steppingstone SRAM for free. Now we pull the whole bootloader * image into SDRAM. * diff --git a/qiboot/src/utils.c b/qiboot/src/utils.c index ffca1f5..fc1e668 100644 --- a/qiboot/src/utils.c +++ b/qiboot/src/utils.c @@ -23,10 +23,14 @@ #include #include -static u8 malloc_pool[100 * 1024]; -void * malloc_pointer = &malloc_pool[0]; +static void (*putc_func)(char) = NULL; +void set_putc_func(void (*p)(char)) +{ + putc_func = p; +} + size_t strlen(const char *s) { size_t n = 0; @@ -88,7 +92,7 @@ char *strchr(const char *s, int c) int puts(const char *string) { while (*string) - this_board->putc(*string++); + (putc_func)(*string++); return 1; } @@ -97,9 +101,9 @@ int puts(const char *string) void printnybble(unsigned char n) { if (n < 10) - this_board->putc('0' + n); + (putc_func)('0' + n); else - this_board->putc('a' + n - 10); + (putc_func)('a' + n - 10); } void print8(unsigned char n) @@ -122,13 +126,13 @@ void hexdump(unsigned char *start, int len) while (len > 0) { print32((int)start); - this_board->putc(':'); - this_board->putc(' '); + (putc_func)(':'); + (putc_func)(' '); for (n = 0; n < 16; n++) { print8(*start++); - this_board->putc(' '); + (putc_func)(' '); } - this_board->putc('\n'); + (putc_func)('\n'); len -= 16; } } @@ -152,7 +156,7 @@ void printdec(int n) int div = 0; if (n < 0) { - this_board->putc('-'); + (putc_func)('-'); n = -n; } @@ -163,7 +167,7 @@ void printdec(int n) n -= d[div]; } if (r || flag || (d[div] == 1)) { - this_board->putc('0' + r); + (putc_func)('0' + r); flag = 1; } div++;