Linker tables for automatic structures
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 20 Jan 2014 22:35:38 +0000 (14:35 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 21 Jan 2014 00:33:33 +0000 (16:33 -0800)
Such as devtab, etc.

kern/arch/riscv/kernel.ld
kern/arch/x86/kernel32.ld
kern/arch/x86/kernel64.ld
kern/linker_tables.ld [new file with mode: 0644]
kern/src/init.c

index e6b4d35..126b8bf 100644 (file)
@@ -14,6 +14,8 @@ SECTIONS
 
        PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
 
+       INCLUDE kern/linker_tables.ld
+
        .rodata : {
                *(.rodata .rodata.* .gnu.linkonce.r.*)
        }
index abd80a6..dca2ddf 100644 (file)
@@ -29,6 +29,8 @@ SECTIONS
 
        PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
 
+       INCLUDE kern/linker_tables.ld
+
        .rodata : {
                *(.rodata .rodata.* .gnu.linkonce.r.*)
        }
index 5a789a5..0656297 100644 (file)
@@ -32,6 +32,8 @@ SECTIONS
 
        PROVIDE(etext = .);     /* Define the 'etext' symbol to this value */
 
+       INCLUDE kern/linker_tables.ld
+
        .rodata : {
                *(.rodata .rodata.* .gnu.linkonce.r.*)
        }
@@ -58,13 +60,6 @@ SECTIONS
                *(COMMON)
        }
 
-       . = ALIGN(4);
-       PROVIDE(devstabstart = .);
-       .devtab : {
-               *(.devtab)
-       }
-       PROVIDE(devtabend = .);
-
        PROVIDE(end = .);
 
        /DISCARD/ : {
diff --git a/kern/linker_tables.ld b/kern/linker_tables.ld
new file mode 100644 (file)
index 0000000..814ff9b
--- /dev/null
@@ -0,0 +1,34 @@
+/* this is INCLUDEd into the arch-specific ld scripts */
+
+       /* Linker-made tables.  Our tables (e.g. devtab) are 2^5 aligned,
+        * independently of us aligning '.'.  We align '.' to get the right start,
+        * e.g.  __devtabstart. */
+       . = ALIGN(32);
+       /* We shouldn't have to use PROVIDE, but if we don't, we get the wrong
+        * value for '.'.  And items with empty tables get the KLA (basically 0) */
+       PROVIDE(__devtabstart = .);
+       .devtab : {
+               *(.devtab)
+       }
+       PROVIDE(__devtabend = .);
+
+       . = ALIGN(32);
+       PROVIDE(__devlinkstart = .);
+       .devlink : {
+               *(.devlink)
+       }
+       PROVIDE(__devlinkend = .);
+
+       . = ALIGN(32);
+       PROVIDE(__etherlinkstart = .);
+       .etherlink : {
+               *(.etherlink)
+       }
+       PROVIDE(__etherlinkend = .);
+
+       . = ALIGN(32);
+       PROVIDE(__mediastart = .);
+       .media : {
+               *(.media)
+       }
+       PROVIDE(__mediaend = .);
index 9ba8984..54153af 100644 (file)
@@ -156,4 +156,27 @@ void _warn(const char *file, int line, const char *fmt,...)
        va_end(ap);
 }
 
+/* You need to reference PROVIDE symbols somewhere, or they won't be included.
+ * Only really a problem for debugging. */
+void debug_linker_tables(void)
+{
+       extern char __devtabstart[];
+       extern char __devtabend[];
+       extern char __devlinkstart[];
+       extern char __devlinkend[];
+       extern char __etherlinkstart[];
+       extern char __etherlinkend[];
+       extern char __mediastart[];
+       extern char __mediaend[];
+       printk("devtab %p %p\ndevlink %p %p\netherlink %p %p\nmedia %p %p\n", 
+              __devtabstart,
+              __devtabend,
+              __devlinkstart,
+              __devlinkend,
+              __etherlinkstart,
+              __etherlinkend,
+              __mediastart,
+              __mediaend);
+}
+
 #endif //Everything For Free