From 1b2c8936326aa0f31912da76dff96a24102a2711 Mon Sep 17 00:00:00 2001 From: "henryk@ploetzli.ch" Date: Tue, 8 Sep 2009 15:40:22 +0000 Subject: [PATCH] Fix data segement. You may now use stuff like int foo = 1; in global context (as opposed to both int foo = 0; which is bss and const int foo = 1; which is rodata) without having the sky come crashing down --- armsrc/appmain.c | 3 +-- armsrc/apps.h | 2 +- armsrc/ldscript | 23 +++++++++++++++++------ armsrc/start.c | 15 +++++++++++++++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/armsrc/appmain.c b/armsrc/appmain.c index 9a692128..23046b4d 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -692,9 +692,8 @@ void UsbPacketReceived(BYTE *packet, int len) } } -void AppMain(void) +void __attribute__((noreturn)) AppMain(void) { - memset(BigBuf,0,sizeof(BigBuf)); SpinDelay(100); if(common_area.magic != COMMON_AREA_MAGIC || common_area.version != 1) { diff --git a/armsrc/apps.h b/armsrc/apps.h index f07504d2..1cb971bd 100644 --- a/armsrc/apps.h +++ b/armsrc/apps.h @@ -13,7 +13,7 @@ DWORD BigBuf[12000]; /// appmain.h void ReadMem(int addr); -void AppMain(void); +void __attribute__((noreturn)) AppMain(void); void SamyRun(void); void DbpIntegers(int a, int b, int c); void DbpString(char *str); diff --git a/armsrc/ldscript b/armsrc/ldscript index 8e3231c0..cc5ce4e0 100644 --- a/armsrc/ldscript +++ b/armsrc/ldscript @@ -13,15 +13,26 @@ SECTIONS *(.eh_frame) *(.glue_7) *(.glue_7t) - *(.version_information) - } >osimage - .rodata : { *(.rodata) *(.rodata*) + *(.version_information) } >osimage - .data : { *(.data) } >ram - __bss_start__ = .; - .bss : { *(.bss) } >ram + __end_of_text__ = .; + + .data : { + __data_start__ = .; + __data_src_start__ = __end_of_text__; + *(.data) + *(.data.*) + __data_end__ = .; + } >ram AT>osimage + + .bss : { + __bss_start__ = .; + *(.bss) + *(.bss.*) + } >ram + . = ALIGN(32 / 8); __bss_end__ = .; .commonarea (NOLOAD) : { diff --git a/armsrc/start.c b/armsrc/start.c index de2dd2f6..0466a92f 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -6,7 +6,22 @@ #include #include "apps.h" +extern char __data_start__, __data_src_start__, __data_end__, __bss_start__, __bss_end__; void __attribute__((section(".startos"))) Vector(void) { + /* Stack should have been set up by the bootloader */ + char *src, *dst, *end; + + /* Set up (that is: clear) BSS. */ + dst = &__bss_start__; + end = &__bss_end__; + while(dst < end) *dst++ = 0; + + /* Set up data segment: Copy from flash to ram */ + src = &__data_src_start__; + dst = &__data_start__; + end = &__data_end__; + while(dst < end) *dst++ = *src++; + AppMain(); } -- 2.39.2