summaryrefslogtreecommitdiff
path: root/arch/x86/x15.lds.S
blob: b896a5d64a9158637287435461fa6405bcc349b4 (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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifdef __LP64__
OUTPUT_FORMAT("elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
#else
OUTPUT_FORMAT("elf32-i386")
OUTPUT_ARCH(i386)
#endif /* __LP64__ */

ENTRY(_start)

#include <kern/init.h>
#include <machine/boot.h>
#include <machine/cpu.h>
#include <machine/page.h>
#include <machine/pmap.h>

PHDRS
{
    /* Flags are actually similar to classic Unix permissions */
    boot    PT_LOAD FLAGS(7);
    init    PT_LOAD FLAGS(7);
    percpu  PT_LOAD FLAGS(6);
    text    PT_LOAD FLAGS(5);
    rodata  PT_LOAD FLAGS(4);
    data    PT_LOAD FLAGS(6);
}

SECTIONS
{
    . = BOOT_OFFSET;
    _boot = .;

    .boot ALIGN(PAGE_SIZE) : {
        *(.boot.hdr)
        *(.boot.text)
        *(.boot.data)
    } : boot

    . = ALIGN(PAGE_SIZE);
    _boot_end = .;

    . += PMAP_KERNEL_OFFSET;
    _init = .;

    .init ALIGN(PAGE_SIZE) : AT(BOOT_VTOP(ADDR(.init))) {
        *(.init.text)
        *(.init.data)

        . = ALIGN(INIT_OP_ALIGN);
        _init_ops = .;
        *(.init.ops)
        _init_ops_end = .;

    } : init

    . = ALIGN(PAGE_SIZE);
    _init_end = .;
    _percpu = .;

    .percpu 0 : AT(BOOT_VTOP(_percpu)) {
        *(.percpu*)
    } : percpu

    . = _percpu + SIZEOF(.percpu);
    . = ALIGN(PAGE_SIZE);
    _percpu_end = .;
    _text = .;

    .text ALIGN(PAGE_SIZE) : AT(BOOT_VTOP(ADDR(.text))) {
        *(.text*)
    } : text

    . = ALIGN(PAGE_SIZE);
    _rodata = .;

    .rodata ALIGN(PAGE_SIZE) : AT(BOOT_VTOP(ADDR(.rodata))) {
        *(.rodata*)
    } : rodata

    . = ALIGN(PAGE_SIZE);
    _data = .;

    .data ALIGN(PAGE_SIZE) : AT(BOOT_VTOP(ADDR(.data))) {
        . = ALIGN(CPU_L1_SIZE);
        *(.data.read_mostly)
        . = ALIGN(CPU_L1_SIZE);
        *(.data*)
    } : data

    .bss ALIGN(CPU_DATA_ALIGN) : AT(BOOT_VTOP(ADDR(.bss))) {
        *(.bss*)
    } : data

    . = ALIGN(PAGE_SIZE);
    _end = .;

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