[SeaBIOS] [PATCH] Default unused UMB areas to be read-only.

Kevin O'Connor kevin at koconnor.net
Sun Jul 21 22:55:24 CEST 2013


It looks like MSDOS 6 wants the UMB area to be read-only in order for
it to use it.  FreeDOS doesn't care, but it always maps a page from
high mem when it does use the area.  So, add an option to control
whether unused UMB ram is marked read-only and default it to read-only
as that seems to be more compatible.

This also fixes an off-by-one bug in the shadow range checking code.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/Kconfig  | 12 ++++++++++++
 src/shadow.c |  8 +++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/Kconfig b/src/Kconfig
index 5e2db8b..3a4d580 100644
--- a/src/Kconfig
+++ b/src/Kconfig
@@ -362,6 +362,18 @@ menu "BIOS interfaces"
         default n
         help
             Disable A20 on 16bit boot.
+
+    config WRITABLE_UPPERMEMORY
+        depends on QEMU
+        bool "Make unused UMB memory read/writeable."
+        default n
+        help
+            When selected, the "Upper Memory Block" area
+            (0x90000-0xa0000) that is not used for option roms will be
+            made writable.  This allows the ram to be directly
+            modified by programs.  However, some old DOS high memory
+            managers may require the UMB region to be read-only.
+
 endmenu
 
 menu "BIOS Tables"
diff --git a/src/shadow.c b/src/shadow.c
index 967eb8e..242f220 100644
--- a/src/shadow.c
+++ b/src/shadow.c
@@ -80,13 +80,15 @@ make_bios_readonly_intel(u16 bdf, u32 pam0)
     wbinvd();
 
     // Write protect roms from 0xc0000-0xf0000
-    u32 romend = rom_get_last(), romtop = rom_get_max();
+    u32 romlast = BUILD_BIOS_ADDR, rommax = rom_get_max();
+    if (CONFIG_WRITABLE_UPPERMEMORY)
+        romlast = rom_get_last();
     int i;
     for (i=0; i<6; i++) {
         u32 mem = BUILD_ROM_START + i * 32*1024;
         u32 pam = pam0 + 1 + i;
-        if (romend <= mem + 16*1024 || romtop <= mem + 32*1024) {
-            if (romend > mem && romtop > mem + 16*1024)
+        if (romlast < mem + 16*1024 || rommax < mem + 32*1024) {
+            if (romlast >= mem && rommax >= mem + 16*1024)
                 pci_config_writeb(bdf, pam, 0x31);
             break;
         }
-- 
1.7.11.7




More information about the SeaBIOS mailing list