Define handle_post as VISIBLE32FLAT as work around for QEmu memory layout.
authorKevin O'Connor <kevin@koconnor.net>
Tue, 20 Sep 2011 23:42:14 +0000 (19:42 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 20 Sep 2011 23:42:14 +0000 (19:42 -0400)
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>
src/post.c

index e195e891fcab8bf1fd0c24f4bec1467d4a6e3469..b4ad1fa07b3dde5ec9c7d8870bf18315c116af8f 100644 (file)
@@ -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();
 }