---help---
          Support user-mode Transactional Memory on POWERPC.
 
+config LD_HEAD_STUB_CATCH
+       bool "Reserve 256 bytes to cope with linker stubs in HEAD text" if EXPERT
+       depends on PPC64
+       default n
+       help
+         Very large kernels can cause linker branch stubs to be generated by
+         code in head_64.S, which moves the head text sections out of their
+         specified location. This option can work around the problem.
+
+         If unsure, say "N".
+
 config DISABLE_MPROFILE_KERNEL
        bool "Disable use of mprofile-kernel for kernel tracing"
        depends on PPC64 && CPU_LITTLE_ENDIAN
 
        . = 0x0;                                                \
 start_##sname:
 
+/*
+ * .linker_stub_catch section is used to catch linker stubs from being
+ * inserted in our .text section, above the start_text label (which breaks
+ * the ABS_ADDR calculation). See kernel/vmlinux.lds.S and tools/head_check.sh
+ * for more details. We would prefer to just keep a cacheline (0x80), but
+ * 0x100 seems to be how the linker aligns branch stub groups.
+ */
+#ifdef CONFIG_LD_HEAD_STUB_CATCH
+#define OPEN_TEXT_SECTION(start)                               \
+       .section ".linker_stub_catch","ax",@progbits;           \
+linker_stub_catch:                                             \
+       . = 0x4;                                                \
+       text_start = (start) + 0x100;                           \
+       .section ".text","ax",@progbits;                        \
+       .balign 0x100;                                          \
+start_text:
+#else
 #define OPEN_TEXT_SECTION(start)                               \
        text_start = (start);                                   \
        .section ".text","ax",@progbits;                        \
        . = 0x0;                                                \
 start_text:
+#endif
 
 #define ZERO_FIXED_SECTION(sname, start, end)                  \
        sname##_start = (start);                                \
 
         * section placement to work.
         */
        .text BLOCK(0) : AT(ADDR(.text) - LOAD_OFFSET) {
+#ifdef CONFIG_LD_HEAD_STUB_CATCH
+               *(.linker_stub_catch);
+               . = . ;
+#endif
+
 #else
        .text : AT(ADDR(.text) - LOAD_OFFSET) {
                ALIGN_FUNCTION();