aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@kernel.org>2016-06-23 17:22:43 -0700
committerLuis R. Rodriguez <mcgrof@kernel.org>2016-06-27 17:52:55 -0700
commit1e052b4d366436af18e9ec4a27dd309d2dd8cb36 (patch)
treef200b72edbe8919fb7f8343c48e78ec30270634b
parent3d445cd5f5bb09d034c35dd3e0910f9f185e19be (diff)
downloadlinker-tables-1e052b4d366436af18e9ec4a27dd309d2dd8cb36.tar.gz
tables.h: make DECLARE_LINKTABLE() .data by default
Upon review with hpa its better to have the shorter version for what we expect linker tables to be used for mostly, and that is data. DECLARE_LINKTABLE_TEXT() is then required for .text. Expand documentation on that we have then only two declarations also: o DECLARE_LINKTABLE() for data o DECLARE_LINKTABLE_RO() for read-only data The definitions are used to associate these with actual sections on the code that implements support for the table. Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
-rw-r--r--README22
-rw-r--r--arch/x86/include/asm/x86_init_fn.h2
-rw-r--r--include/linux/init.h4
-rw-r--r--include/linux/tables.h51
4 files changed, 45 insertions, 34 deletions
diff --git a/README b/README
index 93e2d7e..f831932 100644
--- a/README
+++ b/README
@@ -69,17 +69,27 @@ SECTION_TYPE_RANGES |.ranges | DECLARE_SECTION_RANGE() | DEFINE_SECTION_RANGE()
SECTION_TYPE_TABLES |.ranges | DECLARE_LINKTABLE*() | DEFINE_LINKTABLE*()
-------------------------------------------------------------------------------
+There are only two declarations for linker tables, which would be used in
+header files:
+
+ o DECLARE_LINKTABLE() for data
+ o DECLARE_LINKTABLE_RO() for read-only data
+
The tables have a series of definitions (DEFINE_LINKTABLE_*()) given to help
-with setup for the different supported Linux sections used. The definitions for
-tables then are:
+with setup for the different supported Linux sections used. The definitions
+would be used in the code defining the use of tables -- the actual
+implementation.
+
+The definitions currently supported for tables are:
-------------------------------------------------------------------------------
Linux section | const-or-not | Definition
-------------------------------------------------------------------------------
-.text | const | DEFINE_LINKTABLE()
-.data | non-const | DEFINE_LINKTABLE_DATA()
-.init | const | LINKTABLE_INIT()
-.init.data | non-const | LINKTABLE_INIT_DATA()
+.data | non-const | DEFINE_LINKTABLE()
+.text | const | DEFINE_LINKTABLE_TEXT()
+.init | const | DEFINE_LINKTABLE_INIT()
+.init.data | non-const | DEFINE_LINKTABLE_INIT_DATA()
+.rodata | const | DEFINE_LINKTABLE_RO()
-------------------------------------------------------------------------------
x86 bzimage parser
diff --git a/arch/x86/include/asm/x86_init_fn.h b/arch/x86/include/asm/x86_init_fn.h
index c035a89..2490dc7 100644
--- a/arch/x86/include/asm/x86_init_fn.h
+++ b/arch/x86/include/asm/x86_init_fn.h
@@ -111,7 +111,7 @@ struct x86_init_fn {
void (*early_init)(void);
};
-DECLARE_LINKTABLE_DATA(struct x86_init_fn, x86_init_fns);
+DECLARE_LINKTABLE(struct x86_init_fn, x86_init_fns);
/* Init order levels, we can start at 0000 but reserve 0000-0999 for now */
diff --git a/include/linux/init.h b/include/linux/init.h
index 14c6422..1951514 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -11,8 +11,8 @@
typedef int (*initcall_t)(void);
typedef void (*exitcall_t)(void);
-DECLARE_LINKTABLE_DATA(initcall_t, init_calls);
-DECLARE_LINKTABLE_DATA(exitcall_t, exit_calls);
+DECLARE_LINKTABLE(initcall_t, init_calls);
+DECLARE_LINKTABLE(exitcall_t, exit_calls);
#define __define_initcall(fn, id) \
static LINKTABLE_INIT_DATA(init_calls, id) \
diff --git a/include/linux/tables.h b/include/linux/tables.h
index 9b161ff..fce59fc 100644
--- a/include/linux/tables.h
+++ b/include/linux/tables.h
@@ -33,14 +33,14 @@
(addr >= (unsigned long) LINUX_SECTION_START(tbl) && \
addr < (unsigned long) LINUX_SECTION_END(tbl))
-#define LINKTABLE_DATA_WEAK(name, level) \
+#define LINKTABLE_WEAK(name, level) \
__typeof__(name[0]) \
__attribute__((used, \
weak, \
__aligned__(LINUX_SECTION_ALIGN_STRUCT), \
section(SECTION_TBL(SECTION_DATA, name, level))))
-#define LINKTABLE_WEAK(name, level) \
+#define LINKTABLE_TEXT_WEAK(name, level) \
const __typeof__(name[0]) \
__attribute__((used, \
weak, \
@@ -70,16 +70,17 @@
section(SECTION_TBL(SECTION_INIT_DATA, name, level))))
#define LINKTABLE(name, level) \
- const __typeof__(name[0]) \
+ __typeof__(name[0]) \
__attribute__((used, \
__aligned__(LINUX_SECTION_ALIGN_FUNC), \
- section(SECTION_TBL(SECTION_TEXT, name, level))))
+ section(SECTION_TBL(SECTION_DATA, name, level))))
-#define LINKTABLE_DATA(name, level) \
- __typeof__(name[0]) \
+#define LINKTABLE_TEXT(name, level) \
+ const __typeof__(name[0]) \
__attribute__((used, \
__aligned__(LINUX_SECTION_ALIGN_FUNC), \
- section(SECTION_TBL(SECTION_DATA, name, level))))
+ section(SECTION_TBL(SECTION_TEXT, name, level))))
+
#define LINKTABLE_RO(name, level) \
const __typeof__(name[0]) \
__attribute__((used, \
@@ -98,11 +99,11 @@
section(SECTION_TBL(SECTION_INIT_DATA, name, level))))
#define DECLARE_LINKTABLE(type, name) \
- DECLARE_LINUX_SECTION_RO(type, name)
-
-#define DECLARE_LINKTABLE_DATA(type, name) \
DECLARE_LINUX_SECTION(type, name)
+#define DECLARE_LINKTABLE_RO(type, name) \
+ DECLARE_LINUX_SECTION_RO(type, name)
+
#define DEFINE_LINKTABLE(type, name) \
DECLARE_LINKTABLE(type, name); \
LINKTABLE_WEAK(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
@@ -110,36 +111,36 @@
LINKTABLE(name, ~) VMLINUX_SYMBOL(name##__end)[0] = {}; \
LTO_REFERENCE_INITCALL(name##__end);
-#define DEFINE_LINKTABLE_DATA(type, name) \
- DECLARE_LINKTABLE_DATA(type, name); \
- LINKTABLE_DATA_WEAK(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
+#define DEFINE_LINKTABLE_TEXT(type, name) \
+ DECLARE_LINKTABLE_RO(type, name); \
+ LINKTABLE_WEAK_TEXT(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
LTO_REFERENCE_INITCALL(name); \
- LINKTABLE_DATA(name, ~) VMLINUX_SYMBOL(name##__end)[0] = {};\
+ LINKTABLE_TEXT(name, ~) VMLINUX_SYMBOL(name##__end)[0] = {}; \
LTO_REFERENCE_INITCALL(name##__end);
#define DEFINE_LINKTABLE_RO(type, name) \
- DECLARE_LINKTABLE(type, name); \
+ DECLARE_LINKTABLE_RO(type, name); \
LINKTABLE_RO_WEAK(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
LTO_REFERENCE_INITCALL(name); \
LINKTABLE_RO(name, ~) VMLINUX_SYMBOL(name##__end)[0] = {}; \
LTO_REFERENCE_INITCALL(name##__end);
-#define DEFINE_LINKTABLE_INIT(type, name) \
- DECLARE_LINKTABLE(type, name); \
- LINKTABLE_INIT_WEAK(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
- LTO_REFERENCE_INITCALL(name); \
+#define DEFINE_LINKTABLE_INIT(type, name) \
+ DECLARE_LINKTABLE(type, name); \
+ LINKTABLE_INIT_WEAK(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
+ LTO_REFERENCE_INITCALL(name); \
LINKTABLE_INIT(name, ~) VMLINUX_SYMBOL(name##__end)[0] = {}; \
LTO_REFERENCE_INITCALL(name##__end);
-#define DEFINE_LINKTABLE_INIT_DATA(type, name) \
- DECLARE_LINKTABLE_DATA(type, name); \
- LINKTABLE_INIT_DATA_WEAK(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
- LTO_REFERENCE_INITCALL(name); \
- LINKTABLE_INIT_DATA(name, ~) VMLINUX_SYMBOL(name##__end)[0] = {}; \
+#define DEFINE_LINKTABLE_INIT_DATA(type, name) \
+ DECLARE_LINKTABLE(type, name); \
+ LINKTABLE_INIT_DATA_WEAK(name, ) VMLINUX_SYMBOL(name)[0] = {}; \
+ LTO_REFERENCE_INITCALL(name); \
+ LINKTABLE_INIT_DATA(name, ~) VMLINUX_SYMBOL(name##__end)[0] = {};\
LTO_REFERENCE_INITCALL(name##__end);
#define LINKTABLE_FOR_EACH(pointer, tbl) \
- for (pointer = LINUX_SECTION_START(tbl); \
+ for (pointer = LINUX_SECTION_START(tbl); \
pointer < LINUX_SECTION_END(tbl); \
pointer++)