]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/asm-generic/vmlinux.lds.h
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
[linux.git] / include / asm-generic / vmlinux.lds.h
index a9c4e47214340f3b9b170041e17b897412594c9f..e00f41aa8ec4f1ef955db01e7a9a8d0c1cfdec61 100644 (file)
  *     _etext = .;
  *
  *      _sdata = .;
- *     RO_DATA_SECTION(PAGE_SIZE)
- *     RW_DATA_SECTION(...)
+ *     RO_DATA(PAGE_SIZE)
+ *     RW_DATA(...)
  *     _edata = .;
  *
  *     EXCEPTION_TABLE(...)
- *     NOTES
  *
  *     BSS_SECTION(0, 0, 0)
  *     _end = .;
 #define LOAD_OFFSET 0
 #endif
 
+/*
+ * Only some architectures want to have the .notes segment visible in
+ * a separate PT_NOTE ELF Program Header. When this happens, it needs
+ * to be visible in both the kernel text's PT_LOAD and the PT_NOTE
+ * Program Headers. In this case, though, the PT_LOAD needs to be made
+ * the default again so that all the following sections don't also end
+ * up in the PT_NOTE Program Header.
+ */
+#ifdef EMITS_PT_NOTE
+#define NOTES_HEADERS          :text :note
+#define NOTES_HEADERS_RESTORE  __restore_ph : { *(.__restore_ph) } :text
+#else
+#define NOTES_HEADERS
+#define NOTES_HEADERS_RESTORE
+#endif
+
+/*
+ * Some architectures have non-executable read-only exception tables.
+ * They can be added to the RO_DATA segment by specifying their desired
+ * alignment.
+ */
+#ifdef RO_EXCEPTION_TABLE_ALIGN
+#define RO_EXCEPTION_TABLE     EXCEPTION_TABLE(RO_EXCEPTION_TABLE_ALIGN)
+#else
+#define RO_EXCEPTION_TABLE
+#endif
+
 /* Align . to a 8 byte boundary equals to maximum function alignment. */
 #define ALIGN_FUNCTION()  . = ALIGN(8)
 
  * compiler option used. A given kernel image will only use one, AKA
  * FTRACE_CALLSITE_SECTION. We capture all of them here to avoid header
  * dependencies for FTRACE_CALLSITE_SECTION's definition.
+ *
+ * Need to also make ftrace_stub_graph point to ftrace_stub
+ * so that the same stub location may have different protocols
+ * and not mess up with C verifiers.
  */
 #define MCOUNT_REC()   . = ALIGN(8);                           \
                        __start_mcount_loc = .;                 \
                        KEEP(*(__mcount_loc))                   \
                        KEEP(*(__patchable_function_entries))   \
-                       __stop_mcount_loc = .;
+                       __stop_mcount_loc = .;                  \
+                       ftrace_stub_graph = ftrace_stub;
 #else
-#define MCOUNT_REC()
+# ifdef CONFIG_FUNCTION_TRACER
+#  define MCOUNT_REC() ftrace_stub_graph = ftrace_stub;
+# else
+#  define MCOUNT_REC()
+# endif
 #endif
 
 #ifdef CONFIG_TRACE_BRANCH_PROFILING
 /*
  * Read only Data
  */
-#define RO_DATA_SECTION(align)                                         \
+#define RO_DATA(align)                                                 \
        . = ALIGN((align));                                             \
        .rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {           \
                __start_rodata = .;                                     \
                __start___modver = .;                                   \
                KEEP(*(__modver))                                       \
                __stop___modver = .;                                    \
-               . = ALIGN((align));                                     \
-               __end_rodata = .;                                       \
        }                                                               \
-       . = ALIGN((align));
-
-/* RODATA & RO_DATA provided for backward compatibility.
- * All archs are supposed to use RO_DATA() */
-#define RODATA          RO_DATA_SECTION(4096)
-#define RO_DATA(align)  RO_DATA_SECTION(align)
+                                                                       \
+       RO_EXCEPTION_TABLE                                              \
+       NOTES                                                           \
+                                                                       \
+       . = ALIGN((align));                                             \
+       __end_rodata = .;
 
 /*
  * .text section. Map to function alignment to avoid address changes
                __start_notes = .;                                      \
                KEEP(*(.note.*))                                        \
                __stop_notes = .;                                       \
-       }
+       } NOTES_HEADERS                                                 \
+       NOTES_HEADERS_RESTORE
 
 #define INIT_SETUP(initsetup_align)                                    \
                . = ALIGN(initsetup_align);                             \
  * matches the requirement of PAGE_ALIGNED_DATA.
  *
  * use 0 as page_align if page_aligned data is not used */
-#define RW_DATA_SECTION(cacheline, pagealigned, inittask)              \
+#define RW_DATA(cacheline, pagealigned, inittask)                      \
        . = ALIGN(PAGE_SIZE);                                           \
        .data : AT(ADDR(.data) - LOAD_OFFSET) {                         \
                INIT_TASK_DATA(inittask)                                \