xref: /qemu/tests/tcg/xtensa/linker.ld.S (revision 906da882)
1a9c94277SMarkus Armbruster#include "core-isa.h"
220303e42SMax Filippov
3*906da882SMax Filippov#ifndef XCHAL_VECBASE_RESET_VADDR
4*906da882SMax Filippov#define XCHAL_VECBASE_RESET_VADDR XCHAL_WINDOW_VECTORS_VADDR
5*906da882SMax Filippov#define XCHAL_WINDOW_OF4_VECOFS   0x00000000
6*906da882SMax Filippov#define XCHAL_WINDOW_UF4_VECOFS   0x00000040
7*906da882SMax Filippov#define XCHAL_WINDOW_OF8_VECOFS   0x00000080
8*906da882SMax Filippov#define XCHAL_WINDOW_UF8_VECOFS   0x000000C0
9*906da882SMax Filippov#define XCHAL_WINDOW_OF12_VECOFS  0x00000100
10*906da882SMax Filippov#define XCHAL_WINDOW_UF12_VECOFS  0x00000140
11*906da882SMax Filippov#endif
12*906da882SMax Filippov
13*906da882SMax Filippov#define RAM_SIZE 0x08000000  /* 128M */
14*906da882SMax Filippov#define ROM_SIZE 0x00001000  /* 4k */
15*906da882SMax Filippov#define VECTORS_RESERVED_SIZE 0x1000
16*906da882SMax Filippov
17*906da882SMax Filippov#if XCHAL_HAVE_BE
1820303e42SMax FilippovOUTPUT_FORMAT("elf32-xtensa-be")
1920303e42SMax Filippov#else
2020303e42SMax FilippovOUTPUT_FORMAT("elf32-xtensa-le")
2120303e42SMax Filippov#endif
2220303e42SMax FilippovENTRY(_start)
2320303e42SMax Filippov
2420303e42SMax FilippovMEMORY {
25*906da882SMax Filippov    ram : ORIGIN = XCHAL_VECBASE_RESET_VADDR, LENGTH = RAM_SIZE
26*906da882SMax Filippov    rom : ORIGIN = XCHAL_RESET_VECTOR_VADDR, LENGTH = ROM_SIZE
2720303e42SMax Filippov}
2820303e42SMax Filippov
2920303e42SMax FilippovSECTIONS
3020303e42SMax Filippov{
3120303e42SMax Filippov    .init :
3220303e42SMax Filippov    {
3320303e42SMax Filippov        *(.init)
3420303e42SMax Filippov        *(.init.*)
3520303e42SMax Filippov    } > rom
3620303e42SMax Filippov
37f81aa02eSMax Filippov#if XCHAL_HAVE_WINDOWED
38*906da882SMax Filippov    .vector.window XCHAL_WINDOW_VECTORS_VADDR :
39*906da882SMax Filippov    {
4020303e42SMax Filippov    . = XCHAL_WINDOW_OF4_VECOFS;
4120303e42SMax Filippov        *(.vector.window_overflow_4)
4220303e42SMax Filippov    . = XCHAL_WINDOW_UF4_VECOFS;
4320303e42SMax Filippov        *(.vector.window_underflow_4)
4420303e42SMax Filippov    . = XCHAL_WINDOW_OF8_VECOFS;
4520303e42SMax Filippov        *(.vector.window_overflow_8)
4620303e42SMax Filippov    . = XCHAL_WINDOW_UF8_VECOFS;
4720303e42SMax Filippov        *(.vector.window_underflow_8)
4820303e42SMax Filippov    . = XCHAL_WINDOW_OF12_VECOFS;
4920303e42SMax Filippov        *(.vector.window_overflow_12)
5020303e42SMax Filippov    . = XCHAL_WINDOW_UF12_VECOFS;
5120303e42SMax Filippov        *(.vector.window_underflow_12)
52*906da882SMax Filippov    }
53f81aa02eSMax Filippov#endif
5420303e42SMax Filippov#if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 2
55*906da882SMax Filippov    .vector.level2 XCHAL_INTLEVEL2_VECTOR_VADDR :
56*906da882SMax Filippov    {
5720303e42SMax Filippov        *(.vector.level2)
58*906da882SMax Filippov    }
5920303e42SMax Filippov#endif
6020303e42SMax Filippov#if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 3
61*906da882SMax Filippov    .vector.level3 XCHAL_INTLEVEL3_VECTOR_VADDR :
62*906da882SMax Filippov    {
6320303e42SMax Filippov        *(.vector.level3)
64*906da882SMax Filippov    }
6520303e42SMax Filippov#endif
6620303e42SMax Filippov#if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 4
67*906da882SMax Filippov    .vector.level4 XCHAL_INTLEVEL4_VECTOR_VADDR :
68*906da882SMax Filippov    {
6920303e42SMax Filippov        *(.vector.level4)
70*906da882SMax Filippov    }
7120303e42SMax Filippov#endif
7220303e42SMax Filippov#if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 5
73*906da882SMax Filippov    .vector.level5 XCHAL_INTLEVEL5_VECTOR_VADDR :
74*906da882SMax Filippov    {
7520303e42SMax Filippov        *(.vector.level5)
76*906da882SMax Filippov    }
7720303e42SMax Filippov#endif
7820303e42SMax Filippov#if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 6
79*906da882SMax Filippov    .vector.level6 XCHAL_INTLEVEL6_VECTOR_VADDR :
80*906da882SMax Filippov    {
8120303e42SMax Filippov        *(.vector.level6)
82*906da882SMax Filippov    }
8320303e42SMax Filippov#endif
8420303e42SMax Filippov#if XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI >= 7
85*906da882SMax Filippov    .vector.level7 XCHAL_INTLEVEL7_VECTOR_VADDR :
86*906da882SMax Filippov    {
8720303e42SMax Filippov        *(.vector.level7)
88*906da882SMax Filippov    }
8920303e42SMax Filippov#endif
90*906da882SMax Filippov    .vector.kernel XCHAL_KERNEL_VECTOR_VADDR :
91*906da882SMax Filippov    {
9220303e42SMax Filippov        *(.vector.kernel)
93*906da882SMax Filippov    }
94*906da882SMax Filippov    .vector.user XCHAL_USER_VECTOR_VADDR :
95*906da882SMax Filippov    {
9620303e42SMax Filippov        *(.vector.user)
97*906da882SMax Filippov    }
98*906da882SMax Filippov    .vector.double XCHAL_DOUBLEEXC_VECTOR_VADDR :
99*906da882SMax Filippov    {
10020303e42SMax Filippov        *(.vector.double)
101*906da882SMax Filippov    }
102f81aa02eSMax Filippov
103*906da882SMax Filippov    .vector.text XCHAL_VECBASE_RESET_VADDR + VECTORS_RESERVED_SIZE :
104f81aa02eSMax Filippov    {
105f81aa02eSMax Filippov        *(.vector.window_overflow_4.*)
106f81aa02eSMax Filippov        *(.vector.window_underflow_4.*)
107f81aa02eSMax Filippov        *(.vector.window_overflow_8.*)
108f81aa02eSMax Filippov        *(.vector.window_underflow_8.*)
109f81aa02eSMax Filippov        *(.vector.window_overflow_12.*)
110f81aa02eSMax Filippov        *(.vector.window_underflow_12.*)
111f81aa02eSMax Filippov
112f81aa02eSMax Filippov        *(.vector.level2.*)
113f81aa02eSMax Filippov        *(.vector.level3.*)
114f81aa02eSMax Filippov        *(.vector.level4.*)
115f81aa02eSMax Filippov        *(.vector.level5.*)
116f81aa02eSMax Filippov        *(.vector.level6.*)
117f81aa02eSMax Filippov        *(.vector.level7.*)
118f81aa02eSMax Filippov
119f81aa02eSMax Filippov        *(.vector.kernel.*)
120f81aa02eSMax Filippov        *(.vector.user.*)
12120303e42SMax Filippov        *(.vector.double.*)
12220303e42SMax Filippov    } > ram
12320303e42SMax Filippov
12420303e42SMax Filippov    .text :
12520303e42SMax Filippov    {
12620303e42SMax Filippov        _ftext = .;
12720303e42SMax Filippov        *(.text .stub .text.* .gnu.linkonce.t.* .literal .literal.*)
12820303e42SMax Filippov        _etext = .;
12920303e42SMax Filippov    } > ram
13020303e42SMax Filippov
13120303e42SMax Filippov    .rodata :
13220303e42SMax Filippov    {
13320303e42SMax Filippov        . = ALIGN(4);
13420303e42SMax Filippov        _frodata = .;
13520303e42SMax Filippov        *(.rodata .rodata.* .gnu.linkonce.r.*)
13620303e42SMax Filippov        *(.rodata1)
13720303e42SMax Filippov        _erodata = .;
13820303e42SMax Filippov    } > ram
13920303e42SMax Filippov
14020303e42SMax Filippov    .data :
14120303e42SMax Filippov    {
14220303e42SMax Filippov        . = ALIGN(4);
14320303e42SMax Filippov        _fdata = .;
14420303e42SMax Filippov        *(.data .data.* .gnu.linkonce.d.*)
14520303e42SMax Filippov        *(.data1)
14620303e42SMax Filippov        _gp = ALIGN(16);
14720303e42SMax Filippov        *(.sdata .sdata.* .gnu.linkonce.s.*)
14820303e42SMax Filippov        _edata = .;
14920303e42SMax Filippov    } > ram
15020303e42SMax Filippov
15120303e42SMax Filippov    .bss :
15220303e42SMax Filippov    {
15320303e42SMax Filippov        . = ALIGN(4);
15420303e42SMax Filippov        _fbss = .;
15520303e42SMax Filippov        *(.dynsbss)
15620303e42SMax Filippov        *(.sbss .sbss.* .gnu.linkonce.sb.*)
15720303e42SMax Filippov        *(.scommon)
15820303e42SMax Filippov        *(.dynbss)
15920303e42SMax Filippov        *(.bss .bss.* .gnu.linkonce.b.*)
16020303e42SMax Filippov        *(COMMON)
16120303e42SMax Filippov        _ebss = .;
16220303e42SMax Filippov        _end = .;
16320303e42SMax Filippov    } > ram
16420303e42SMax Filippov}
16520303e42SMax Filippov
16620303e42SMax FilippovPROVIDE(_fstack = (ORIGIN(ram) & 0xf0000000) + LENGTH(ram) - 16);
167