Message ID | 20200401193849.14017-1-alex.bennee@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/core: properly terminate loading .hex on EOF record | expand |
On Wed, Apr 01, 2020 at 08:38:49PM +0100, Alex Bennée wrote: > The https://makecode.microbit.org/#editor generates slightly weird > .hex files which work fine on a real microbit but causes QEMU to > choke. The reason is extraneous data after the EOF record which causes > the loader to attempt to write a bigger file than it should to the > "rom". According to the HEX file spec an EOF really should be the last > thing we process so lets do that. > > Reported-by: Ursula Bennée <alex.bennee@linaro.org> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > --- > hw/core/loader.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
On 4/1/20 12:38 PM, Alex Bennée wrote: > The https://makecode.microbit.org/#editor generates slightly weird > .hex files which work fine on a real microbit but causes QEMU to > choke. The reason is extraneous data after the EOF record which causes > the loader to attempt to write a bigger file than it should to the > "rom". According to the HEX file spec an EOF really should be the last > thing we process so lets do that. > > Reported-by: Ursula Bennée <alex.bennee@linaro.org> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > --- > hw/core/loader.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
On 4/1/20 9:38 PM, Alex Bennée wrote: > The https://makecode.microbit.org/#editor generates slightly weird > .hex files which work fine on a real microbit but causes QEMU to > choke. The reason is extraneous data after the EOF record which causes > the loader to attempt to write a bigger file than it should to the > "rom". According to the HEX file spec an EOF really should be the last > thing we process so lets do that. > > Reported-by: Ursula Bennée <alex.bennee@linaro.org> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > --- > hw/core/loader.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/hw/core/loader.c b/hw/core/loader.c > index eeef6da9a1b..8bbb1797a4c 100644 > --- a/hw/core/loader.c > +++ b/hw/core/loader.c > @@ -1447,6 +1447,7 @@ typedef struct { > uint32_t current_rom_index; > uint32_t rom_start_address; > AddressSpace *as; > + bool complete; > } HexParser; > > /* return size or -1 if error */ > @@ -1484,6 +1485,7 @@ static int handle_record_type(HexParser *parser) > parser->current_rom_index, > parser->rom_start_address, parser->as); > } > + parser->complete = true; > return parser->total_size; > case EXT_SEG_ADDR_RECORD: > case EXT_LINEAR_ADDR_RECORD: > @@ -1548,11 +1550,12 @@ static int parse_hex_blob(const char *filename, hwaddr *addr, uint8_t *hex_blob, > .bin_buf = g_malloc(hex_blob_size), > .start_addr = addr, > .as = as, > + .complete = false > }; > > rom_transaction_begin(); > > - for (; hex_blob < end; ++hex_blob) { > + for (; hex_blob < end && !parser.complete; ++hex_blob) { > switch (*hex_blob) { > case '\r': > case '\n': > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
diff --git a/hw/core/loader.c b/hw/core/loader.c index eeef6da9a1b..8bbb1797a4c 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -1447,6 +1447,7 @@ typedef struct { uint32_t current_rom_index; uint32_t rom_start_address; AddressSpace *as; + bool complete; } HexParser; /* return size or -1 if error */ @@ -1484,6 +1485,7 @@ static int handle_record_type(HexParser *parser) parser->current_rom_index, parser->rom_start_address, parser->as); } + parser->complete = true; return parser->total_size; case EXT_SEG_ADDR_RECORD: case EXT_LINEAR_ADDR_RECORD: @@ -1548,11 +1550,12 @@ static int parse_hex_blob(const char *filename, hwaddr *addr, uint8_t *hex_blob, .bin_buf = g_malloc(hex_blob_size), .start_addr = addr, .as = as, + .complete = false }; rom_transaction_begin(); - for (; hex_blob < end; ++hex_blob) { + for (; hex_blob < end && !parser.complete; ++hex_blob) { switch (*hex_blob) { case '\r': case '\n':
The https://makecode.microbit.org/#editor generates slightly weird .hex files which work fine on a real microbit but causes QEMU to choke. The reason is extraneous data after the EOF record which causes the loader to attempt to write a bigger file than it should to the "rom". According to the HEX file spec an EOF really should be the last thing we process so lets do that. Reported-by: Ursula Bennée <alex.bennee@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> --- hw/core/loader.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)