forked from Minki/linux
be7635e728
KASAN needs to know whether the allocation happens in an IRQ handler. This lets us strip everything below the IRQ entry point to reduce the number of unique stack traces needed to be stored. Move the definition of __irq_entry to <linux/interrupt.h> so that the users don't need to pull in <linux/ftrace.h>. Also introduce the __softirq_entry macro which is similar to __irq_entry, but puts the corresponding functions to the .softirqentry.text section. Signed-off-by: Alexander Potapenko <glider@google.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Christoph Lameter <cl@linux.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Andrey Konovalov <adech.fo@gmail.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com> Cc: Konstantin Serebryany <kcc@google.com> Cc: Dmitry Chernenkov <dmitryc@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
269 lines
4.8 KiB
ArmAsm
269 lines
4.8 KiB
ArmAsm
/*
|
|
* Copyright 2004-2009 Analog Devices Inc.
|
|
*
|
|
* Licensed under the GPL-2 or later
|
|
*/
|
|
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
#include <asm/mem_map.h>
|
|
#include <asm/page.h>
|
|
#include <asm/thread_info.h>
|
|
|
|
OUTPUT_FORMAT("elf32-bfin")
|
|
ENTRY(__start)
|
|
_jiffies = _jiffies_64;
|
|
|
|
SECTIONS
|
|
{
|
|
#ifdef CONFIG_RAMKERNEL
|
|
. = CONFIG_BOOT_LOAD;
|
|
#else
|
|
. = CONFIG_ROM_BASE;
|
|
#endif
|
|
|
|
/* Neither the text, ro_data or bss section need to be aligned
|
|
* So pack them back to back
|
|
*/
|
|
.text :
|
|
{
|
|
__text = .;
|
|
_text = .;
|
|
__stext = .;
|
|
TEXT_TEXT
|
|
#ifndef CONFIG_SCHEDULE_L1
|
|
SCHED_TEXT
|
|
#endif
|
|
LOCK_TEXT
|
|
IRQENTRY_TEXT
|
|
SOFTIRQENTRY_TEXT
|
|
KPROBES_TEXT
|
|
#ifdef CONFIG_ROMKERNEL
|
|
__sinittext = .;
|
|
INIT_TEXT
|
|
__einittext = .;
|
|
EXIT_TEXT
|
|
#endif
|
|
*(.text.*)
|
|
*(.fixup)
|
|
|
|
#if !L1_CODE_LENGTH
|
|
*(.l1.text)
|
|
#endif
|
|
__etext = .;
|
|
}
|
|
|
|
EXCEPTION_TABLE(4)
|
|
NOTES
|
|
|
|
/* Just in case the first read only is a 32-bit access */
|
|
RO_DATA(4)
|
|
__rodata_end = .;
|
|
|
|
#ifdef CONFIG_ROMKERNEL
|
|
. = CONFIG_BOOT_LOAD;
|
|
.bss : AT(__rodata_end)
|
|
#else
|
|
.bss :
|
|
#endif
|
|
{
|
|
. = ALIGN(4);
|
|
___bss_start = .;
|
|
*(.bss .bss.*)
|
|
*(COMMON)
|
|
#if !L1_DATA_A_LENGTH
|
|
*(.l1.bss)
|
|
#endif
|
|
#if !L1_DATA_B_LENGTH
|
|
*(.l1.bss.B)
|
|
#endif
|
|
. = ALIGN(4);
|
|
___bss_stop = .;
|
|
}
|
|
|
|
#if defined(CONFIG_ROMKERNEL)
|
|
.data : AT(LOADADDR(.bss) + SIZEOF(.bss))
|
|
#else
|
|
.data :
|
|
#endif
|
|
{
|
|
__sdata = .;
|
|
/* This gets done first, so the glob doesn't suck it in */
|
|
CACHELINE_ALIGNED_DATA(32)
|
|
|
|
#if !L1_DATA_A_LENGTH
|
|
. = ALIGN(32);
|
|
*(.data_l1.cacheline_aligned)
|
|
*(.l1.data)
|
|
#endif
|
|
#if !L1_DATA_B_LENGTH
|
|
*(.l1.data.B)
|
|
#endif
|
|
#if !L2_LENGTH
|
|
. = ALIGN(32);
|
|
*(.data_l2.cacheline_aligned)
|
|
*(.l2.data)
|
|
#endif
|
|
|
|
DATA_DATA
|
|
CONSTRUCTORS
|
|
|
|
INIT_TASK_DATA(THREAD_SIZE)
|
|
|
|
__edata = .;
|
|
}
|
|
__data_lma = LOADADDR(.data);
|
|
__data_len = SIZEOF(.data);
|
|
|
|
/* The init section should be last, so when we free it, it goes into
|
|
* the general memory pool, and (hopefully) will decrease fragmentation
|
|
* a tiny bit. The init section has a _requirement_ that it be
|
|
* PAGE_SIZE aligned
|
|
*/
|
|
. = ALIGN(PAGE_SIZE);
|
|
___init_begin = .;
|
|
|
|
#ifdef CONFIG_RAMKERNEL
|
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
|
|
|
/* We have to discard exit text and such at runtime, not link time, to
|
|
* handle embedded cross-section references (alt instructions, bug
|
|
* table, eh_frame, etc...). We need all of our .text up front and
|
|
* .data after it for PCREL call issues.
|
|
*/
|
|
.exit.text :
|
|
{
|
|
EXIT_TEXT
|
|
}
|
|
|
|
. = ALIGN(16);
|
|
INIT_DATA_SECTION(16)
|
|
PERCPU_SECTION(32)
|
|
|
|
.exit.data :
|
|
{
|
|
EXIT_DATA
|
|
}
|
|
|
|
.text_l1 L1_CODE_START : AT(LOADADDR(.exit.data) + SIZEOF(.exit.data))
|
|
#else
|
|
.init.data : AT(__data_lma + __data_len + 32)
|
|
{
|
|
__sinitdata = .;
|
|
INIT_DATA
|
|
INIT_SETUP(16)
|
|
INIT_CALLS
|
|
CON_INITCALL
|
|
SECURITY_INITCALL
|
|
INIT_RAM_FS
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
___per_cpu_load = .;
|
|
PERCPU_INPUT(32)
|
|
|
|
EXIT_DATA
|
|
__einitdata = .;
|
|
}
|
|
__init_data_lma = LOADADDR(.init.data);
|
|
__init_data_len = SIZEOF(.init.data);
|
|
__init_data_end = .;
|
|
|
|
.text_l1 L1_CODE_START : AT(__init_data_lma + __init_data_len)
|
|
#endif
|
|
{
|
|
. = ALIGN(4);
|
|
__stext_l1 = .;
|
|
*(.l1.text.head)
|
|
*(.l1.text)
|
|
#ifdef CONFIG_SCHEDULE_L1
|
|
SCHED_TEXT
|
|
#endif
|
|
. = ALIGN(4);
|
|
__etext_l1 = .;
|
|
}
|
|
__text_l1_lma = LOADADDR(.text_l1);
|
|
__text_l1_len = SIZEOF(.text_l1);
|
|
ASSERT (__text_l1_len <= L1_CODE_LENGTH, "L1 text overflow!")
|
|
|
|
.data_l1 L1_DATA_A_START : AT(__text_l1_lma + __text_l1_len)
|
|
{
|
|
. = ALIGN(4);
|
|
__sdata_l1 = .;
|
|
*(.l1.data)
|
|
__edata_l1 = .;
|
|
|
|
. = ALIGN(32);
|
|
*(.data_l1.cacheline_aligned)
|
|
|
|
. = ALIGN(4);
|
|
__sbss_l1 = .;
|
|
*(.l1.bss)
|
|
. = ALIGN(4);
|
|
__ebss_l1 = .;
|
|
}
|
|
__data_l1_lma = LOADADDR(.data_l1);
|
|
__data_l1_len = SIZEOF(.data_l1);
|
|
ASSERT (__data_l1_len <= L1_DATA_A_LENGTH, "L1 data A overflow!")
|
|
|
|
.data_b_l1 L1_DATA_B_START : AT(__data_l1_lma + __data_l1_len)
|
|
{
|
|
. = ALIGN(4);
|
|
__sdata_b_l1 = .;
|
|
*(.l1.data.B)
|
|
__edata_b_l1 = .;
|
|
|
|
. = ALIGN(4);
|
|
__sbss_b_l1 = .;
|
|
*(.l1.bss.B)
|
|
. = ALIGN(4);
|
|
__ebss_b_l1 = .;
|
|
}
|
|
__data_b_l1_lma = LOADADDR(.data_b_l1);
|
|
__data_b_l1_len = SIZEOF(.data_b_l1);
|
|
ASSERT (__data_b_l1_len <= L1_DATA_B_LENGTH, "L1 data B overflow!")
|
|
|
|
.text_data_l2 L2_START : AT(__data_b_l1_lma + __data_b_l1_len)
|
|
{
|
|
. = ALIGN(4);
|
|
__stext_l2 = .;
|
|
*(.l2.text)
|
|
. = ALIGN(4);
|
|
__etext_l2 = .;
|
|
|
|
. = ALIGN(4);
|
|
__sdata_l2 = .;
|
|
*(.l2.data)
|
|
__edata_l2 = .;
|
|
|
|
. = ALIGN(32);
|
|
*(.data_l2.cacheline_aligned)
|
|
|
|
. = ALIGN(4);
|
|
__sbss_l2 = .;
|
|
*(.l2.bss)
|
|
. = ALIGN(4);
|
|
__ebss_l2 = .;
|
|
}
|
|
__l2_lma = LOADADDR(.text_data_l2);
|
|
__l2_len = SIZEOF(.text_data_l2);
|
|
ASSERT (__l2_len <= L2_LENGTH, "L2 overflow!")
|
|
|
|
/* Force trailing alignment of our init section so that when we
|
|
* free our init memory, we don't leave behind a partial page.
|
|
*/
|
|
#ifdef CONFIG_RAMKERNEL
|
|
. = __l2_lma + __l2_len;
|
|
#else
|
|
. = __init_data_end;
|
|
#endif
|
|
. = ALIGN(PAGE_SIZE);
|
|
___init_end = .;
|
|
|
|
__end =.;
|
|
|
|
STABS_DEBUG
|
|
|
|
DWARF_DEBUG
|
|
|
|
DISCARDS
|
|
}
|