isapc: Shadow ISA BIOS by default
PATCH 1/1 isapc: Shadow ISA BIOS by default
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)
hw/pc_sysfw.c +9 -4
@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;
@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios);memory_region_add_subregion_overlap (rom_memory,0x100000 - isa_bios_size, isa_bios,1 ); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,
Signature · 1 line
1.7.3.4
Quoted 3 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
We've a long-standing bug --
http://bugs.debian.org/605525
https://bugs.launchpad.net/qemu/+bug/1024248
(qemu-system-x86_64 -M isapc shows blank guest screen)
I assume this patch fixes it for qemu/tcg case, but not for qemu/kvm case right?
I just tested this patch on qemu 1.1 (it applies cleanly), and it appears to work as expected, ie, the issue mentioned above is fixed by it. But I also noticed that kvm mode is not affected -- at least the sympthoms mentioned above does not apply.
Quoted 5 lines
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
Can you clarify please, -- referring to the above? :)
Thanks,
/mjt
Quoted 5 lines · Michael Tokarev
Quoted 3 lines
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
Can you clarify please, -- referring to the above? :)
kvm only works due to a bug. Once the kvm bug is fixed, isapc will break, unless the patch above is applied.
Signature · 1 line
error compiling committee.c: too many arguments to function
[forgot to CC stable: this one apparently qualifies for older QEMU releases as well but would require some adaptions for < 1.1]
Quoted 54 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)hw/pc_sysfw.c +9
-4@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios);memory_region_add_subregion_overlap (rom_memory,0x100000 - isa_bios_size, isa_bios,1 ); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,
Signature · 2 lines
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux
Quoted 44 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)hw/pc_sysfw.c +5
-3@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios); memory_region_add_subregion_overlap(rom_memory, 0x100000 - isa_bios_size,
hw/pc_sysfw.c static void old_pc_system_rom_init(MemoryRegion *rom_memory) · line 190
Quoted 10 lines
hw/pc_sysfw.c +4
-1isa_bios, 1); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,
Ping. Or already queued?
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux
Quoted 52 lines · Jan Kiszka
Quoted 51 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)hw/pc_sysfw.c +9
-4@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios);memory_region_add_subregion_overlap (rom_memory,0x100000 - isa_bios_size, isa_bios,1 ); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);
Quoted 5 lines
hw/pc_sysfw.c static void old_pc_system_rom_init(MemoryRegion *rom_memory) · line 190
Quoted 3 lines
hw/pc_sysfw.c +0
-0/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,Ping. Or already queued?
I've got it queued now. Thanks.
Regards,
Anthony Liguori
Quoted 6 lines
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux
Quoted 54 lines · Anthony Liguori
Quoted 52 lines · Jan Kiszka
Quoted 51 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)hw/pc_sysfw.c +9
-4@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios);memory_region_add_subregion_overlap (rom_memory,0x100000 - isa_bios_size, isa_bios,1 ); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);
Quoted 7 lines
Quoted 5 lines
hw/pc_sysfw.c static void old_pc_system_rom_init(MemoryRegion *rom_memory) · line 190
Quoted 3 lines
hw/pc_sysfw.c +0
-0/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,Ping. Or already queued?
I've got it queued now. Thanks.
I'm withdrawing it: This breaks Windows 95 booting. For unknown reasons, this nice OS decided to overwrite the F-segment during boot. That is fine as long as it is properly protected. But it breaks under current KVM and with the patch above for the isapc. So we need a firmware interface to enable/disable write protection for this segment in isapc mode, specifically as that machine targets these old OSes.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux
Quoted 61 lines · Jan Kiszka
Quoted 60 lines · Anthony Liguori
Quoted 57 lines · Jan Kiszka
Quoted 44 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)hw/pc_sysfw.c +5
-3@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios); memory_region_add_subregion_overlap(rom_memory, 0x100000 - isa_bios_size,hw/pc_sysfw.c static void old_pc_system_rom_init(MemoryRegion *rom_memory) · line 190
Quoted 10 lines
hw/pc_sysfw.c +4
-1isa_bios, 1); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,Ping. Or already queued?
Quoted 8 lines
Quoted 1 line
I've got it queued now. Thanks.
I'm withdrawing it: This breaks Windows 95 booting. For unknown reasons, this nice OS decided to overwrite the F-segment during boot. That is fine as long as it is properly protected. But it breaks under current KVM and with the patch above for the isapc. So we need a firmware interface to enable/disable write protection for this segment in isapc mode, specifically as that machine targets these old OSes.
Ah, if it wasn't for a build break caused by one of the pull requests, I would have pushed last night. Thanks for the heads up, I'll remove it from my queue.
Is fw_cfg the right interface? I presume this is i440fx specific? How does q35 handle this? Presumably there's a second window for the BIOS mapping. There's got to be some way to do shadowing of it I would think.
Regards,
Anthony Liguori
Quoted 6 lines
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux
Quoted 72 lines · Anthony Liguori
Quoted 61 lines · Jan Kiszka
Quoted 60 lines · Anthony Liguori
Quoted 57 lines · Jan Kiszka
Quoted 44 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)hw/pc_sysfw.c +5
-3@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios); memory_region_add_subregion_overlap(rom_memory, 0x100000 - isa_bios_size,hw/pc_sysfw.c static void old_pc_system_rom_init(MemoryRegion *rom_memory) · line 190
Quoted 10 lines
hw/pc_sysfw.c +4
-1isa_bios, 1); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,Ping. Or already queued?
Quoted 8 lines
Quoted 1 line
I've got it queued now. Thanks.
I'm withdrawing it: This breaks Windows 95 booting. For unknown reasons, this nice OS decided to overwrite the F-segment during boot. That is fine as long as it is properly protected. But it breaks under current KVM and with the patch above for the isapc. So we need a firmware interface to enable/disable write protection for this segment in isapc mode, specifically as that machine targets these old OSes.
Quoted 6 lines
Ah, if it wasn't for a build break caused by one of the pull requests, I would have pushed last night. Thanks for the heads up, I'll remove it from my queue.
Is
fw_cfgthe right interface? I presume this is i440fx specific? How does q35 handle this?
No, there is no i440fx or q35 in that case. There are discrete chips and wiring on an undefined ISA motherboard. As Seabios depends on a writable E&F-segments (maybe only on E, still need to find out) for a certain period, we need to invent a pv channel (probably via fw_cfg) to provide the necessary control knob.
Quoted 3 lines
Presumably there's a second window for the BIOS
mapping. There's got to be some way to do shadowing of it I would think.
Not sure what you mean here. This is only about shadowing the top 128K of the BIOS into the E/F-segment and providing a write-enable knob for it.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux
Quoted 77 lines · Jan Kiszka
Quoted 76 lines · Anthony Liguori
Quoted 61 lines · Jan Kiszka
Quoted 60 lines · Anthony Liguori
Quoted 57 lines · Jan Kiszka
Quoted 44 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
hw/pc_sysfw.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)hw/pc_sysfw.c +5
-3@@ -136,6 +136,7 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory) {char *filename;MemoryRegion *bios, *isa_bios; +void *isa_bios_ptr;int bios_size, isa_bios_size;int ret;@@ -167,19 +168,23 @@ static void old_pc_system_rom_init(MemoryRegion *rom_memory)g_free (filename); } -/* map the last 128KB of the BIOS in ISA space */ +/* Shadow the last 128KB of the BIOS in ISA space as RAM - +* Seabios depends on this */ isa_bios_size = bios_size;if (isa_bios_size > (128 *1024 )) { isa_bios_size =128 *1024 ; } isa_bios =g_malloc (sizeof (*isa_bios)); -memory_region_init_alias (isa_bios,"isa-bios" , bios, - bios_size - isa_bios_size, isa_bios_size); +memory_region_init_ram (isa_bios,"isa-bios" , isa_bios_size); +vmstate_register_ram_global (isa_bios); memory_region_add_subregion_overlap(rom_memory, 0x100000 - isa_bios_size,hw/pc_sysfw.c static void old_pc_system_rom_init(MemoryRegion *rom_memory) · line 190
Quoted 10 lines
hw/pc_sysfw.c +4
-1isa_bios, 1); -memory_region_set_readonly (isa_bios, true); + +/* copy ISA rom image from top of the ROM */ + isa_bios_ptr =memory_region_get_ram_ptr (isa_bios); +rom_copy (isa_bios_ptr, (uint32_t )(-isa_bios_size), isa_bios_size);/* map all the bios at the top of memory */ memory_region_add_subregion(rom_memory,Ping. Or already queued?
Quoted 8 lines
Quoted 1 line
I've got it queued now. Thanks.
I'm withdrawing it: This breaks Windows 95 booting. For unknown reasons, this nice OS decided to overwrite the F-segment during boot. That is fine as long as it is properly protected. But it breaks under current KVM and with the patch above for the isapc. So we need a firmware interface to enable/disable write protection for this segment in isapc mode, specifically as that machine targets these old OSes.
Ah, if it wasn't for a build break caused by one of the pull requests, I would have pushed last night. Thanks for the heads up, I'll remove it from my queue.
Quoted 8 lines
Quoted 2 lines
Is
fw_cfgthe right interface? I presume this is i440fx specific? How does q35 handle this?No, there is no i440fx or q35 in that case. There are discrete chips and wiring on an undefined ISA motherboard. As Seabios depends on a writable E&F-segments (maybe only on E, still need to find out) for a certain period, we need to invent a pv channel (probably via
fw_cfg) to provide the necessary control knob.
I see, I thought this was primarily for shadowing. But it's a SeaBIOS-ism. fw_cfg is the right answer.
Regards,
Anthony Liguori
Quoted 13 lines
Quoted 4 lines
Presumably there's a second window for the BIOS
mapping. There's got to be some way to do shadowing of it I would think.Not sure what you mean here. This is only about shadowing the top 128K of the BIOS into the E/F-segment and providing a write-enable knob for it.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE Corporate Competence Center Embedded Linux
Quoted 13 lines · Jan Kiszka
Quoted 12 lines · Anthony Liguori
Quoted 10 lines · Jan Kiszka
Quoted 9 lines · Jan Kiszka
Our one and only BIOS depends on a writable shadowed BIOS in the ISA range. As we have no interface to control the write property, make that region writable by default.
Signed-off-by Jan Kiszka <[email protected]>---
This unbreaks isapc for TCG, and keep it working for KVM once it starts supporting read-only memslots.
[...]
Quoted 10 lines
Quoted 3 lines
Quoted 1 line
Ping. Or already queued?
I've got it queued now. Thanks.
I'm withdrawing it: This breaks Windows 95 booting. For unknown reasons, this nice OS decided to overwrite the F-segment during boot. That is fine as long as it is properly protected. But it breaks under current KVM and with the patch above for the isapc. So we need a firmware interface to enable/disable write protection for this segment in isapc mode, specifically as that machine targets these old OSes.
Why withdraw the patch? With the patch and when not using isapc, seabios will write protect the f-segment and nothing will change. Without the patch and with isapc the machine wont boot at all, so will never get far enough along to have Win95 crash.
That is, the patch has no harm as it only impacts isapc and with isapc today the machine doesn't boot at all.
-Kevin