[SeaBIOS] [PATCH 3/4] Add VARVERIFY32INIT attribute for variables only available during "init".

Kevin O'Connor kevin at koconnor.net
Sat Mar 9 01:53:41 CET 2013


Add a build check to verify certain variables are only reachable via
the 32bit "init" code.  This can be used as a mechanism to enforce
certain data (and code that accesses that data) as only available
during POST.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/types.h        |  4 ++++
 tools/layoutrom.py | 18 +++++++++---------
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/types.h b/src/types.h
index 03104a2..84582ac 100644
--- a/src/types.h
+++ b/src/types.h
@@ -59,6 +59,8 @@ extern void __force_link_error__only_in_16bit(void) __noreturn;
 # define VARLOW __section(".discard.varlow." UNIQSEC) __VISIBLE __weak
 // Designate a variable as visible and located in the f-segment.
 # define VARFSEG __section(".discard.varfseg." UNIQSEC) __VISIBLE __weak
+// Verify a variable is only accessable via 32bit "init" functions
+# define VARVERIFY32INIT __section(".discard.varinit." UNIQSEC)
 // Designate top-level assembler as 16bit only.
 # define ASM16(code) __ASM(code)
 // Designate top-level assembler as 32bit flat only.
@@ -77,6 +79,7 @@ extern void __force_link_error__only_in_16bit(void) __noreturn;
 # define VAR32SEG __section(".data32seg." UNIQSEC)
 # define VARLOW __section(".discard.varlow." UNIQSEC) __VISIBLE __weak
 # define VARFSEG __section(".discard.varfseg." UNIQSEC) __VISIBLE __weak
+# define VARVERIFY32INIT __section(".discard.varinit." UNIQSEC)
 # define ASM16(code)
 # define ASM32FLAT(code)
 # define ASSERT16() __force_link_error__only_in_16bit()
@@ -92,6 +95,7 @@ extern void __force_link_error__only_in_16bit(void) __noreturn;
 # define VAR32SEG __section(".discard.var32seg." UNIQSEC)
 # define VARLOW __section(".data.varlow." UNIQSEC) __VISIBLE __weak
 # define VARFSEG __section(".data.varfseg." UNIQSEC) __VISIBLE
+# define VARVERIFY32INIT __section(".data.varinit." UNIQSEC)
 # define ASM16(code)
 # define ASM32FLAT(code) __ASM(code)
 # define ASSERT16() __force_link_error__only_in_16bit()
diff --git a/tools/layoutrom.py b/tools/layoutrom.py
index e8b32a7..20b9716 100755
--- a/tools/layoutrom.py
+++ b/tools/layoutrom.py
@@ -432,16 +432,20 @@ PHDRS
 # Detection of init code
 ######################################################################
 
-def markRuntime(section, sections):
+def markRuntime(section, sections, chain=[]):
     if (section is None or not section.keep or section.category is not None
         or '.init.' in section.name or section.fileid != '32flat'):
         return
+    if '.data.varinit.' in section.name:
+        print "ERROR: %s is VARVERIFY32INIT but used from %s" % (
+            section.name, chain)
+        sys.exit(1)
     section.category = '32flat'
     # Recursively mark all sections this section points to
     for reloc in section.relocs:
-        markRuntime(reloc.symbol.section, sections)
+        markRuntime(reloc.symbol.section, sections, chain + [section.name])
 
-def findInit(sections):
+def findInit(sections, genreloc):
     # Recursively find and mark all "runtime" sections.
     for section in sections:
         if ('.data.varlow.' in section.name or '.data.varfseg.' in section.name
@@ -450,7 +454,7 @@ def findInit(sections):
     for section in sections:
         if section.category is not None:
             continue
-        if section.fileid == '32flat':
+        if section.fileid == '32flat' and genreloc:
             section.category = '32init'
         else:
             section.category = section.fileid
@@ -635,11 +639,7 @@ def main():
 
     # Separate 32bit flat into runtime and init parts
     genreloc = '_reloc_abs_start' in info32flat[1]
-    if genreloc:
-        findInit(sections)
-    else:
-        for section in sections:
-            section.category = section.fileid
+    findInit(sections, genreloc)
 
     # Note "low memory" and "fseg memory" parts
     for section in getSectionsPrefix(sections, '.data.varlow.'):
-- 
1.7.11.7




More information about the SeaBIOS mailing list