[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] loader: implement START_SEG_ADDR_RECORD
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PATCH] loader: implement START_SEG_ADDR_RECORD |
Date: |
Sat, 9 Jun 2018 17:32:52 +0100 |
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: <address@hidden>
Cc: Su Hang <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
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
- [Qemu-devel] [PATCH] loader: implement START_SEG_ADDR_RECORD,
Stefan Hajnoczi <=