[SeaBIOS] [PATCH] Update EFI_COMPATIBILITY16_TABLE to match 0.98 spec update

Kevin O'Connor kevin at koconnor.net
Mon Dec 2 18:46:04 CET 2013


On Mon, Dec 02, 2013 at 04:02:59PM +0000, David Woodhouse wrote:
> We expect to use the space between the top of option ROMs and the bottom
> of our own BIOS code as a stack. OVMF was previously marking the whole
> region from 0xC0000 to 0xFFFFF read-only before invoking our Legacy16Boot
> method. Read-only stack considered harmful.
> 
> Version 0.98 of the CSM spec adds the UmaAddress and UmaSize fields, which
> allow the CSM to specify a memory region that needs to be writable.

Excellent!

> --- a/src/fw/csm.c
> +++ b/src/fw/csm.c
> @@ -34,6 +34,8 @@ EFI_COMPATIBILITY16_TABLE csm_compat_table VARFSEG __aligned(16) = {
>      .Compatibility16CallOffset = 0 /* Filled in by checkrom.py */,
>      .OemIdStringPointer = (u32)"SeaBIOS",
>      .AcpiRsdPtrPointer = (u32)&csm_rsdp,
> +    .UmaAddress = 0xe0000,
> +    .UmaSize = 0x10000,

I think we can be a little more accurate here.  See the incremental
patch (untested) below and let me know if I've missed anything.

-Kevin


diff --git a/src/fw/csm.c b/src/fw/csm.c
index b7a4211..ae3a786 100644
--- a/src/fw/csm.c
+++ b/src/fw/csm.c
@@ -34,8 +34,10 @@ EFI_COMPATIBILITY16_TABLE csm_compat_table VARFSEG __aligned(16) = {
     .Compatibility16CallOffset = 0 /* Filled in by checkrom.py */,
     .OemIdStringPointer = (u32)"SeaBIOS",
     .AcpiRsdPtrPointer = (u32)&csm_rsdp,
-    .UmaAddress = 0xe0000,
+#if CONFIG_MALLOC_UPPERMEMORY
+    .UmaAddress = (u32)zonelow_base,
     .UmaSize = 0x10000,
+#endif
 };
 
 EFI_TO_COMPATIBILITY16_INIT_TABLE *csm_init_table;
@@ -48,11 +50,12 @@ extern void __csm_return(struct bregs *regs) __noreturn;
 static void
 csm_return(struct bregs *regs)
 {
-    u32 top = rom_get_max();
-
     PICMask = pic_irqmask_read();
-    csm_compat_table.UmaAddress = top;
-    csm_compat_table.UmaSize = 0xf0000 - top;
+    if (CONFIG_MALLOC_UPPERMEMORY) {
+        u32 top = rom_get_max();
+        csm_compat_table.UmaAddress = top;
+        csm_compat_table.UmaSize = (u32)zonelow_base + 0x10000 - top;
+    }
     __csm_return(regs);
 }
 



More information about the SeaBIOS mailing list