From ce0ce9dd8c6162182e5d9d4b1ff91f5b62a03b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Fr=C3=B6schle?= Date: Mon, 24 Oct 2016 06:25:17 +0000 Subject: [PATCH] fix ST RAM header writes Newer compilers refuse to dereference NULL pointers. Fix this with special "no-delete-null-pointer-checks" function attribute --- BaS_gcc/BaS_gcc.files | 1 - BaS_gcc/sys/BaS.c | 36 ++++++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/BaS_gcc/BaS_gcc.files b/BaS_gcc/BaS_gcc.files index 31af8f8..10ad6e5 100644 --- a/BaS_gcc/BaS_gcc.files +++ b/BaS_gcc/BaS_gcc.files @@ -568,7 +568,6 @@ Doxyfile dump.bdm Makefile mcf5474.gdb -svn-commit.tmp tos/pci_test/include/bas_printf.h tos/pci_test/include/bas_string.h tos/pci_test/include/driver_vec.h diff --git a/BaS_gcc/sys/BaS.c b/BaS_gcc/sys/BaS.c index 431b6ae..a090b78 100644 --- a/BaS_gcc/sys/BaS.c +++ b/BaS_gcc/sys/BaS.c @@ -379,6 +379,29 @@ void init_isr(void) } } +/* Jump into the OS */ +typedef void void_func(void); +struct rom_header +{ + void *initial_sp; + void_func *initial_pc; +}; + +/* + * fix ST RAM header (address 0x0 and 0x4). FreeMiNT uses these vectors on CTRL-ALT-DEL. + * + * Beware: Newer compilers refuse to dereference pointers to NULL and abort if the following + * attribute isn't set. + */ +static inline void fix_stram_header() __attribute__((optimize("no-delete-null-pointer-checks"))); +static inline void fix_stram_header() +{ + struct rom_header *bas_header = (struct rom_header *) TARGET_ADDRESS; + struct rom_header *stram_header = (struct rom_header *) 0x0; + + *stram_header = *bas_header; +} + void BaS(void) { uint8_t *src; @@ -473,14 +496,6 @@ void BaS(void) srec_execute("BASFLASH.S19"); - /* Jump into the OS */ - typedef void void_func(void); - struct rom_header - { - void *initial_sp; - void_func *initial_pc; - }; - xprintf("BaS initialization finished, enable interrupts\r\n"); init_isr(); @@ -542,10 +557,7 @@ void BaS(void) * like on original STs (where these values reside in ROM) and uses them on * CTRL-ALT-DELETE reboots. */ - struct rom_header *bas_header = (struct rom_header *) TARGET_ADDRESS; - struct rom_header *stram_header = (struct rom_header *) 0x0; - - *stram_header = *bas_header; + fix_stram_header(); xprintf("call EmuTOS\r\n"); struct rom_header *os_header = (struct rom_header *) TOS;