It turns out that GNU binutils emits START_SEG_ADDR_RECORD when the start address is within the first megabyte (< 0x100000). Therefore we must handle this record type.
Originally we thought this record type was x86-specific, but binutils also emits it on non-x86 architectures. Based-on: <1527161340-3200-1-git-send-email-suhan...@mails.ucas.ac.cn> Cc: Su Hang <suhan...@mails.ucas.ac.cn> Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> --- Su Hang: Feel free to squash this into the next revision of your hex loader patch. Don't worry about the authorship information. hw/core/loader.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hw/core/loader.c b/hw/core/loader.c index 3c0202caa8..7843b487b2 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -1423,8 +1423,14 @@ static int handle_record_type(HexParser *parser) break; case START_SEG_ADDR_RECORD: - /* TODO: START_SEG_ADDR_RECORD is x86-specific */ - return -1; + if (line->byte_count != 4 && line->address != 0) { + return -1; + } + + /* x86 16-bit CS:IP segmented addressing */ + *(parser->start_addr) = (((line->data[0] << 8) | line->data[1]) << 4) | + (line->data[2] << 8) | line->data[3]; + break; case START_LINEAR_ADDR_RECORD: if (line->byte_count != 4 && line->address != 0) { -- 2.17.1