From 13be9f14d7ef8136ea225eaecc5ad17ef203686a Mon Sep 17 00:00:00 2001 From: Jörg Hohensohn Date: Tue, 23 Aug 2005 07:26:40 +0000 Subject: allow the flash plugin to verify the RomBox link address git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7388 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/rockbox_flash.c | 33 +++++++++++++++++++++++++++++++-- firmware/rom.lds | 8 ++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/apps/plugins/rockbox_flash.c b/apps/plugins/rockbox_flash.c index 9a403197dd..4c552622e5 100644 --- a/apps/plugins/rockbox_flash.c +++ b/apps/plugins/rockbox_flash.c @@ -82,6 +82,7 @@ typedef enum eNotUCL, eWrongAlgorithm, eMultiBlocks, + eBadRomLink } tCheckResult; typedef struct @@ -438,10 +439,31 @@ tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader, rb->close(fd); return eReadErr; } - pHeader->execute = reset_vector; - if (reset_vector != ROCKBOX_EXEC) /* nonstandard address? */ + if (reset_vector >= (UINT32)FB + && reset_vector < (UINT32)FB+512*1024) /* ROM address? */ + { /* assume in-place, executing directly in flash */ pHeader->destination = (UINT32)(pos + sizeof(tImageHeader)); + + /* for new RomBox, this isn't the reset vector, + but the link address, for us to check the position */ + if(pHeader->destination != reset_vector) /* compare link addr. */ + { + rb->close(fd); + return eBadRomLink; /* not matching the start address */ + } + + /* read the now following reset vector */ + read = rb->read(fd, &reset_vector, sizeof(reset_vector)); + fileread += read; + if (read != sizeof(reset_vector)) + { + rb->close(fd); + return eReadErr; + } + } + + pHeader->execute = reset_vector; } /* check if we can read the whole file */ @@ -737,6 +759,10 @@ void DoUserDialog(char* filename) rb->lcd_puts(0, 2, "Blocksize"); rb->lcd_puts(0, 3, " too small?"); break; + case eBadRomLink: + rb->lcd_puts(0, 1, "RomBox mismatch."); + rb->lcd_puts(0, 2, "Wrong ROM position"); + break; default: rb->lcd_puts(0, 1, "Check failed."); break; @@ -906,6 +932,9 @@ void DoUserDialog(char* filename) case eMultiBlocks: rb->lcd_puts_scroll(0, 1, "File invalid. Blocksize too small?"); break; + case eBadRomLink: + rb->lcd_puts_scroll(0, 1, "BootBox mismatch"); + break; default: rb->lcd_puts_scroll(0, 1, "Check failed."); break; diff --git a/firmware/rom.lds b/firmware/rom.lds index 632a69ed9e..8781873f45 100644 --- a/firmware/rom.lds +++ b/firmware/rom.lds @@ -40,6 +40,14 @@ MEMORY } SECTIONS { + .flashheader : + { + /* place flash link address first, so the plugin can check */ + LONG(FLASHORIG); + /* followed by the start address, the first vector takes care of this. */ + /* If we ever place the table elsewhere, put a constant here. */ + } > FLASH + .vectors : { _datacopy = .; -- cgit v1.2.3