aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2011-09-20 19:42:14 -0400
committerKevin O'Connor <kevin@koconnor.net>2011-09-20 19:42:14 -0400
commit9acdc28d5d91f68db3cd6b32509dd1ad9544f145 (patch)
tree9299a8a52b7d3f6e11836b0f5d743667dec76ec6
parent7859edaaba68183d57eba3a166c1a06b187aeef6 (diff)
downloadseabios-9acdc28d5d91f68db3cd6b32509dd1ad9544f145.zip
seabios-9acdc28d5d91f68db3cd6b32509dd1ad9544f145.tar.gz
seabios-9acdc28d5d91f68db3cd6b32509dd1ad9544f145.tar.bz2
Define handle_post as VISIBLE32FLAT as work around for QEmu memory layout.
QEmu only copies the top 128K of the BIOS image to low memory (0xe0000-0xfffff). Images over 128K are only fully mapped in high memory (0xfff00000). However, the SeaBIOS shadow functions (make_bios_writable_intel) will copy up to 256K to low memory. SeaBIOS generally works with 256K roms because they are automatically copied to low memory during the BIOS init. However, this only works if the shadow function code is itself part of the bios image that is placed in low memory by QEmu. Defining handle_post() as VISIBLE32FLAT will make the linker scripts more likely to place the initial shadow code in the last 128K of the image. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/post.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/post.c b/src/post.c
index e195e89..b4ad1fa 100644
--- a/src/post.c
+++ b/src/post.c
@@ -333,10 +333,25 @@ reloc_init(void)
func();
}
-// Start of Power On Self Test (POST) - the BIOS initilization phase.
-// This function does the setup needed for code relocation, and then
-// invokes the relocation and main setup code.
+// Setup for code relocation and then call reloc_init
void VISIBLE32INIT
+dopost(void)
+{
+ HaveRunPost = 1;
+
+ // Detect ram and setup internal malloc.
+ qemu_cfg_port_probe();
+ ram_probe();
+ malloc_setup();
+
+ // Relocate initialization code and call maininit().
+ reloc_init();
+}
+
+// Entry point for Power On Self Test (POST) - the BIOS initilization
+// phase. This function makes the memory at 0xc0000-0xfffff
+// read/writable and then calls dopost().
+void VISIBLE32FLAT
handle_post(void)
{
debug_serial_setup();
@@ -356,13 +371,7 @@ handle_post(void)
// Allow writes to modify bios area (0xf0000)
make_bios_writable();
- HaveRunPost = 1;
-
- // Detect ram and setup internal malloc.
- qemu_cfg_port_probe();
- ram_probe();
- malloc_setup();
- // Relocate initialization code and call maininit().
- reloc_init();
+ // Now that memory is read/writable - start post process.
+ dopost();
}