From: Stephan Baerwolf Date: Mon, 26 Aug 2013 17:46:16 +0000 (+0200) Subject: updater: fix flash addressing BUG possibly reading wring data X-Git-Tag: testing-head~29 X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/commitdiff_plain/ba9a5f3a437dc9273e4459ace7ceb45325b139c8?ds=inline updater: fix flash addressing BUG possibly reading wring data Fix Updater-bug, when linked to position in flash space (FLASHADDRESS > 64K - SIZEOF_new_firmware - "a little more") void* always is 16Bit - for real addresses take FLASADDRESS into account in order to find upper address bit: (http://www.mikrocontroller.net/topic/298174#3186932) Signed-off-by: Stephan Baerwolf --- diff --git a/updater/updater.c b/updater/updater.c index 75f0996..b79c958 100644 --- a/updater/updater.c +++ b/updater/updater.c @@ -130,6 +130,7 @@ typedef uint32_t mypgm_addr_t; typedef void (*mypgm_spminterface)(const uint32_t flash_byteaddress, const uint8_t spmcrval, const uint16_t dataword); #if FLASHEND > 65535 +# define FULLCORRECTFLASHADDRESS(addr) (((mypgm_addr_t)(addr)) | (((mypgm_addr_t)FLASHADDRESS) & ((mypgm_addr_t)0xffff0000))) # define mymemcpy_PF mymemcpy_PF_far void *mymemcpy_PF_far (void *dest, mypgm_addr_t src, size_t n) { uint8_t *pagedata = (void*)dest; @@ -144,6 +145,7 @@ void *mymemcpy_PF_far (void *dest, mypgm_addr_t src, size_t n) { return dest; } #else +# define FULLCORRECTFLASHADDRESS(addr) (addr) # define mymemcpy_PF memcpy_PF #endif @@ -282,10 +284,10 @@ int main(void) for (i=0;i 65535) - a=pgm_read_word_far((void*)&new_firmware[i]); + a=pgm_read_word_far(FULLCORRECTFLASHADDRESS(&new_firmware[i])); b=pgm_read_word_far(NEW_BOOTLOADER_ADDRESS+i); #else - a=pgm_read_word((void*)&new_firmware[i]); + a=pgm_read_word(FULLCORRECTFLASHADDRESS(&new_firmware[i])); b=pgm_read_word(NEW_BOOTLOADER_ADDRESS+i); #endif if (a!=b) { @@ -312,7 +314,7 @@ int main(void) #ifdef CONFIG_UPDATER_CLEANMEMCLEAR memset((void*)buffer, 0xff, sizeof(buffer)); #endif - mymemcpy_PF((void*)buffer, (uint_farptr_t)((void*)&new_firmware[i]), ((SIZEOF_new_firmware-i)>sizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); + mymemcpy_PF((void*)buffer, (uint_farptr_t)(FULLCORRECTFLASHADDRESS(&new_firmware[i])), ((SIZEOF_new_firmware-i)>sizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); mypgm_WRITEpage(NEW_BOOTLOADER_ADDRESS+i, buffer, sizeof(buffer), temp_do_spm); @@ -325,7 +327,7 @@ int main(void) #ifdef CONFIG_UPDATER_CLEANMEMCLEAR memset((void*)buffer, 0xff, sizeof(buffer)); #endif - mymemcpy_PF((void*)buffer, (uint_farptr_t)((void*)&new_firmware[i]), ((SIZEOF_new_firmware-i)>sizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); + mymemcpy_PF((void*)buffer, (uint_farptr_t)(FULLCORRECTFLASHADDRESS(&new_firmware[i])), ((SIZEOF_new_firmware-i)>sizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); mypgm_WRITEpage(NEW_BOOTLOADER_ADDRESS+i, buffer, sizeof(buffer), new_do_spm); @@ -335,4 +337,5 @@ int main(void) } + return 0; }