aboutsummaryrefslogtreecommitdiffstats
path: root/wirish/start_c.c
diff options
context:
space:
mode:
authorMarti Bolivar <mbolivar@leaflabs.com>2012-04-11 16:56:20 -0400
committerMarti Bolivar <mbolivar@leaflabs.com>2012-04-11 16:56:50 -0400
commit71347f8f430e28b5e5ed565bc5c5f5142c2314e0 (patch)
treee5eb0377dcad27bb26155266c0ea7047f8cab671 /wirish/start_c.c
parent33c40cbbf0ea025b7e0bf39a4703cf239cc09e08 (diff)
downloadlibrambutan-71347f8f430e28b5e5ed565bc5c5f5142c2314e0.tar.gz
librambutan-71347f8f430e28b5e5ed565bc5c5f5142c2314e0.zip
Fix linking and C runtime initialization on F1.
Reorder the .data and .rodata sections in common.inc. This seems necessary to get the linker to place the data ROM disk and the pointer to it in the right places. Switch from long long to int in start_c.c. I have no idea why this helps, but it does. F1 will crash if you don't do this. It will probably slow things down unnecessarily on F2, but I don't care. Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Diffstat (limited to 'wirish/start_c.c')
-rw-r--r--wirish/start_c.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/wirish/start_c.c b/wirish/start_c.c
index ae42087..301565c 100644
--- a/wirish/start_c.c
+++ b/wirish/start_c.c
@@ -54,39 +54,40 @@ extern char _data, _edata;
extern char _bss, _ebss;
struct rom_img_cfg {
- long long *img_start;
+ int *img_start;
};
extern char _lm_rom_img_cfgp;
void __attribute__((noreturn)) start_c(void) {
struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp;
- long long *src;
- long long *dst;
+ int *src = img_cfg->img_start;
+ int *dst = (int*)&_data;
int exit_code;
/* Initialize .data, if necessary. */
- src = img_cfg->img_start;
- dst = (long long*)&_data;
if (src != dst) {
- while (dst < (long long*)&_edata) {
+ int *end = (int*)&_edata;
+ while (dst < end) {
*dst++ = *src++;
}
}
/* Zero .bss. */
- dst = (long long*)&_bss;
- while (dst < (long long*)&_ebss) {
+ dst = (int*)&_bss;
+ while (dst < (int*)&_ebss) {
*dst++ = 0;
}
/* Run initializers. */
__libc_init_array();
- exit_code = main(0, NULL, NULL);
+ /* Jump to main. */
+ exit_code = main(0, 0, 0);
if (exit) {
exit(exit_code);
}
+
/* If exit is NULL, make sure we don't return. */
for (;;)
continue;