aboutsummaryrefslogtreecommitdiff
path: root/rv64cpu/sw/common/link.ld
blob: 705a25dbe73329bea4c825b52498c42dcf3b338d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* ═══════════════════════════════════════════════════════════════════════════════
 * richard-cpu Linker Script
 *
 * Memory map matches rtl/soc/mem_map.sv
 * ═══════════════════════════════════════════════════════════════════════════════ */

OUTPUT_ARCH("riscv")
ENTRY(_start)

MEMORY
{
    /* Boot ROM / SRAM — 256 MB total addressable, practical limit is FPGA BRAM */
    ROM  (rx)  : ORIGIN = 0x00000000, LENGTH = 64K
    RAM  (rwx) : ORIGIN = 0x00010000, LENGTH = 256M - 64K
}

SECTIONS
{
    /* ── Code ──────────────────────────────────────────────────────────────── */
    .text : ALIGN(4)
    {
        *(.text.init)       /* _start / trap vector MUST be first */
        *(.text .text.*)
    } > ROM

    /* ── Read-only data ───────────────────────────────────────────────────── */
    .rodata : ALIGN(8)
    {
        *(.rodata .rodata.*)
        *(.srodata .srodata.*)
    } > ROM

    /* ── Initialized data (load from ROM, copy to RAM) ────────────────────── */
    .data : ALIGN(8)
    {
        _data_start = .;
        *(.data .data.*)
        *(.sdata .sdata.*)
        _data_end = .;
    } > RAM AT > ROM

    _data_load = LOADADDR(.data);

    /* ── BSS (zero-initialized) ──────────────────────────────────────────── */
    .bss (NOLOAD) : ALIGN(8)
    {
        _bss_start = .;
        *(.bss .bss.*)
        *(.sbss .sbss.*)
        *(COMMON)
        _bss_end = .;
    } > RAM

    /* ── Stack (grows downward) ──────────────────────────────────────────── */
    . = ALIGN(16);
    _stack_bottom = .;
    . = . + 8K;
    _stack_top = .;

    /* ── Heap ────────────────────────────────────────────────────────────── */
    _heap_start = .;

    /* ── tohost / fromhost (Compliance test interface) ────────────────────── */
    .tohost (NOLOAD) : ALIGN(8)
    {
        PROVIDE(tohost   = .); . += 8;
        PROVIDE(fromhost = .); . += 8;
    } > RAM

    /DISCARD/ :
    {
        *(.comment)
        *(.note.*)
        *(.eh_frame*)
    }
}