root/arch/csky/kernel/vmlinux.lds.S
/* SPDX-License-Identifier: GPL-2.0 */

#include <asm/vmlinux.lds.h>
#include <asm/page.h>
#include <asm/memory.h>

OUTPUT_ARCH(csky)
ENTRY(_start)

#ifndef __cskyBE__
jiffies = jiffies_64;
#else
jiffies = jiffies_64 + 4;
#endif

#define VBR_BASE \
        . = ALIGN(1024); \
        vec_base = .; \
        . += 512;

SECTIONS
{
        . = PAGE_OFFSET + PHYS_OFFSET_OFFSET;

        _start = .;
        HEAD_TEXT_SECTION
        . = ALIGN(PAGE_SIZE);

        .text : AT(ADDR(.text) - LOAD_OFFSET) {
                _text = .;
                _stext = .;
                VBR_BASE
                IRQENTRY_TEXT
                SOFTIRQENTRY_TEXT
                TEXT_TEXT
                SCHED_TEXT
                LOCK_TEXT
                KPROBES_TEXT
                *(.fixup)
                *(.gnu.warning)
        } = 0
        _etext = .;

        /* __init_begin __init_end must be page aligned for free_initmem */
        . = ALIGN(PAGE_SIZE);
        __init_begin = .;
        INIT_TEXT_SECTION(PAGE_SIZE)
        INIT_DATA_SECTION(PAGE_SIZE)
        PERCPU_SECTION(L1_CACHE_BYTES)
        . = ALIGN(PAGE_SIZE);
        __init_end = .;

        _sdata = .;
        RO_DATA(PAGE_SIZE)
        RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
        _edata = .;

#ifdef CONFIG_HAVE_TCM
        .tcm_start : {
                . = ALIGN(PAGE_SIZE);
                __tcm_start = .;
        }

        .text_data_tcm FIXADDR_TCM : AT(__tcm_start)
        {
                . = ALIGN(4);
                __stcm_text_data = .;
                *(.tcm.text)
                *(.tcm.rodata)
#ifndef CONFIG_HAVE_DTCM
                *(.tcm.data)
#endif
                . = ALIGN(4);
                __etcm_text_data = .;
        }

        . = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_data_tcm);

#ifdef CONFIG_HAVE_DTCM
        #define ITCM_SIZE       CONFIG_ITCM_NR_PAGES * PAGE_SIZE

        .dtcm_start : {
                __dtcm_start = .;
        }

        .data_tcm FIXADDR_TCM + ITCM_SIZE : AT(__dtcm_start)
        {
                . = ALIGN(4);
                __stcm_data = .;
                *(.tcm.data)
                . = ALIGN(4);
                __etcm_data = .;
        }

        . = ADDR(.dtcm_start) + SIZEOF(.data_tcm);

        .tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_tcm)) {
#else
        .tcm_end : AT(ADDR(.tcm_start) + SIZEOF(.text_data_tcm)) {
#endif
                . = ALIGN(PAGE_SIZE);
                __tcm_end = .;
        }
#endif

        EXCEPTION_TABLE(L1_CACHE_BYTES)
        BSS_SECTION(L1_CACHE_BYTES, PAGE_SIZE, L1_CACHE_BYTES)
        _end = . ;

        STABS_DEBUG
        DWARF_DEBUG
        MODINFO
        ELF_DETAILS

        DISCARDS
}