Skip to content

Commit 1e66180

Browse files
d0k3devinshoemaker
authored andcommitted
Cleaned up linker.ld / start.s
... thanks to @AuroraWright
1 parent 224232f commit 1e66180

3 files changed

Lines changed: 65 additions & 350 deletions

File tree

source/arm9/bootstrap.ld

Lines changed: 9 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,130 +1,12 @@
1-
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
2-
OUTPUT_ARCH(arm)
31
ENTRY(_start)
4-
5-
MEMORY
6-
{
7-
ram : ORIGIN = 0x23F00000, LENGTH = 0x100000
8-
}
9-
102
SECTIONS
113
{
12-
.init :
13-
{
14-
__text_start = . ;
15-
KEEP (*(.init))
16-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
17-
} >ram = 0xff
18-
.plt : { *(.plt) } >ram = 0xff
19-
20-
.text : /* ALIGN (4): */
21-
{
22-
*(.text .stub .text.* .gnu.linkonce.t.*)
23-
KEEP (*(.text.*personality*))
24-
/* .gnu.warning sections are handled specially by elf32.em. */
25-
*(.gnu.warning)
26-
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)
27-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
28-
} >ram = 0xff
29-
30-
.fini :
31-
{
32-
KEEP (*(.fini))
33-
} >ram =0xff
34-
35-
__text_end = . ;
36-
37-
.rodata :
38-
{
39-
*(.rodata)
40-
*all.rodata*(*)
41-
*(.roda)
42-
*(.rodata.*)
43-
*(.gnu.linkonce.r*)
44-
SORT(CONSTRUCTORS)
45-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
46-
} >ram = 0xff
47-
48-
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >ram
49-
__exidx_start = .;
50-
.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >ram
51-
__exidx_end = .;
52-
53-
/* Ensure the __preinit_array_start label is properly aligned. We
54-
could instead move the label definition inside the section, but
55-
the linker would then create the section even if it turns out to
56-
be empty, which isn't pretty. */
57-
. = ALIGN(32 / 8);
58-
PROVIDE (__preinit_array_start = .);
59-
.preinit_array : { KEEP (*(.preinit_array)) } >ram = 0xff
60-
PROVIDE (__preinit_array_end = .);
61-
PROVIDE (__init_array_start = .);
62-
.init_array : { KEEP (*(.init_array)) } >ram = 0xff
63-
PROVIDE (__init_array_end = .);
64-
PROVIDE (__fini_array_start = .);
65-
.fini_array : { KEEP (*(.fini_array)) } >ram = 0xff
66-
PROVIDE (__fini_array_end = .);
67-
68-
.ctors :
69-
{
70-
/* gcc uses crtbegin.o to find the start of the constructors, so
71-
we make sure it is first. Because this is a wildcard, it
72-
doesn't matter if the user does not actually link against
73-
crtbegin.o; the linker won't look for a file to match a
74-
wildcard. The wildcard also means that it doesn't matter which
75-
directory crtbegin.o is in. */
76-
KEEP (*crtbegin.o(.ctors))
77-
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
78-
KEEP (*(SORT(.ctors.*)))
79-
KEEP (*(.ctors))
80-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
81-
} >ram = 0xff
82-
83-
.dtors :
84-
{
85-
KEEP (*crtbegin.o(.dtors))
86-
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
87-
KEEP (*(SORT(.dtors.*)))
88-
KEEP (*(.dtors))
89-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
90-
} >ram = 0xff
91-
92-
.eh_frame :
93-
{
94-
KEEP (*(.eh_frame))
95-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
96-
} >ram = 0xff
97-
98-
.gcc_except_table :
99-
{
100-
*(.gcc_except_table)
101-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
102-
} >ram = 0xff
103-
.jcr : { KEEP (*(.jcr)) } >ram = 0
104-
.got : { *(.got.plt) *(.got) } >ram = 0
105-
106-
.data ALIGN(4) : {
107-
__data_start = ABSOLUTE(.);
108-
*(.data)
109-
*(.data.*)
110-
*(.gnu.linkonce.d*)
111-
CONSTRUCTORS
112-
. = ALIGN(4);
113-
__data_end = ABSOLUTE(.) ;
114-
} >ram = 0xff
115-
116-
.bss ALIGN(4) :
117-
{
118-
__bss_start = ABSOLUTE(.);
119-
__bss_start__ = ABSOLUTE(.);
120-
*(.dynbss)
121-
*(.gnu.linkonce.b*)
122-
*(.bss*)
123-
*(COMMON)
124-
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
125-
__bss_end__ = ABSOLUTE(.);
126-
__end__ = ABSOLUTE(.);
127-
} >ram
128-
129-
.stack 0x80000 : { _stack = .; *(.stack) }
130-
}
4+
. = 0x23F00000;
5+
.text.start : { *(.text.start) }
6+
.text : { *(.text) }
7+
.data : { *(.data) }
8+
.bss : { *(.bss COMMON) }
9+
.rodata : { *(.rodata) }
10+
. = ALIGN(4);
11+
__end__ = ABSOLUTE(.);
12+
}

source/arm9/source/bs-start.s

Lines changed: 48 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,63 @@
11
#ifdef EXEC_BOOTSTRAP
22

3-
.section ".init"
4-
.global _start
5-
.extern main
3+
.section .text.start
64
.align 4
7-
.arm
8-
9-
#define SIZE_32KB 0b01110
10-
#define SIZE_128KB 0b10000
11-
#define SIZE_512KB 0b10010
12-
#define SIZE_2MB 0b10100
13-
#define SIZE_128MB 0b11010
14-
#define SIZE_256MB 0b11011
15-
#define SIZE_4GB 0b11111
16-
17-
@ Makes a MPU partition value
18-
#define MAKE_PARTITION(offset, size_enum) \
19-
(((offset) >> 12 << 12) | ((size_enum) << 1) | 1)
20-
21-
5+
.global _start
226
_start:
23-
b _init
24-
25-
@ required, don't move :)
26-
@ will be set to FIRM ARM9 entry point by BRAHMA
27-
arm9ep_backup: .long 0xFFFF0000
28-
29-
_mpu_partition_table:
30-
.word MAKE_PARTITION(0x00000000, SIZE_4GB) @ 0: Background region
31-
.word MAKE_PARTITION(0x00000000, SIZE_128MB) @ 1: Instruction TCM (mirrored every 32KB)
32-
.word MAKE_PARTITION(0x08000000, SIZE_2MB) @ 2: ARM9 internal memory
33-
.word MAKE_PARTITION(0x10000000, SIZE_128MB) @ 3: IO region
34-
.word MAKE_PARTITION(0x18000000, SIZE_128MB) @ 4: external device memory
35-
.word MAKE_PARTITION(0x1FF80000, SIZE_512KB) @ 5: AXI WRAM
36-
.word MAKE_PARTITION(0x20000000, SIZE_256MB) @ 6: FCRAM
37-
.word 0 @ 7: Unused
38-
39-
_populate_mpu:
40-
push {r4-r5, lr}
41-
ldr r4, =_mpu_partition_table
42-
43-
ldr r5, [r4, #0x0] @ mmu_partition_table[0] load
44-
mcr p15, 0, r5, c6, c0, 0 @ mmu_partition_table[0] write
45-
ldr r5, [r4, #0x4]
46-
mcr p15, 0, r5, c6, c1, 0
47-
ldr r5, [r4, #0x8]
48-
mcr p15, 0, r5, c6, c2, 0
49-
ldr r5, [r4, #0xC]
50-
mcr p15, 0, r5, c6, c3, 0
51-
ldr r5, [r4, #0x10]
52-
mcr p15, 0, r5, c6, c4, 0
53-
ldr r5, [r4, #0x14]
54-
mcr p15, 0, r5, c6, c5, 0
55-
ldr r5, [r4, #0x18]
56-
mcr p15, 0, r5, c6, c6, 0
57-
ldr r5, [r4, #0x1C]
58-
mcr p15, 0, r5, c6, c7, 0
7+
@ Change the stack pointer
8+
mov sp, #0x27000000
599

6010
@ Give read/write access to all the memory regions
61-
ldr r5, =0x03333333
62-
mcr p15, 0, r5, c5, c0, 2 @ data access
63-
ldr r5, =0x03300330
64-
mcr p15, 0, r5, c5, c0, 3 @ instruction access
65-
66-
mov r5, #0x66
67-
mcr p15, 0, r5, c2, c0, 0 @ data cachable
68-
mcr p15, 0, r5, c2, c0, 1 @ instruction cachable
69-
70-
mov r5, #0x10
71-
mcr p15, 0, r5, c3, c0, 0 @ data bufferable
72-
73-
pop {r4-r5, pc}
74-
75-
_enable_caches:
76-
push {r4-r5, lr}
77-
78-
bl _populate_mpu
11+
ldr r5, =0x33333333
12+
mcr p15, 0, r5, c5, c0, 2 @ write data access
13+
mcr p15, 0, r5, c5, c0, 3 @ write instruction access
14+
15+
@ Sets MPU permissions and cache settings
16+
ldr r0, =0xFFFF001D @ ffff0000 32k
17+
ldr r1, =0x01FF801D @ 01ff8000 32k
18+
ldr r2, =0x08000027 @ 08000000 1M
19+
ldr r3, =0x10000021 @ 10000000 128k
20+
ldr r4, =0x10100025 @ 10100000 512k
21+
ldr r5, =0x20000035 @ 20000000 128M
22+
ldr r6, =0x1FF00027 @ 1FF00000 1M
23+
ldr r7, =0x1800002D @ 18000000 8M
24+
mov r10, #0x25
25+
mov r11, #0x25
26+
mov r12, #0x25
27+
mcr p15, 0, r0, c6, c0, 0
28+
mcr p15, 0, r1, c6, c1, 0
29+
mcr p15, 0, r2, c6, c2, 0
30+
mcr p15, 0, r3, c6, c3, 0
31+
mcr p15, 0, r4, c6, c4, 0
32+
mcr p15, 0, r5, c6, c5, 0
33+
mcr p15, 0, r6, c6, c6, 0
34+
mcr p15, 0, r7, c6, c7, 0
35+
mcr p15, 0, r10, c3, c0, 0 @ Write bufferable 0, 2, 5
36+
mcr p15, 0, r11, c2, c0, 0 @ Data cacheable 0, 2, 5
37+
mcr p15, 0, r12, c2, c0, 1 @ Inst cacheable 0, 2, 5
38+
39+
@ Enable caches
40+
mrc p15, 0, r4, c1, c0, 0 @ read control register
41+
orr r4, r4, #(1<<18) @ - itcm enable
42+
orr r4, r4, #(1<<12) @ - instruction cache enable
43+
orr r4, r4, #(1<<2) @ - data cache enable
44+
orr r4, r4, #(1<<0) @ - mpu enable
45+
mcr p15, 0, r4, c1, c0, 0 @ write control register
46+
47+
@ Flush caches
7948
mov r5, #0
8049
mcr p15, 0, r5, c7, c5, 0 @ flush I-cache
8150
mcr p15, 0, r5, c7, c6, 0 @ flush D-cache
51+
mcr p15, 0, r5, c7, c10, 4 @ drain write buffer
8252

83-
mrc p15, 0, r4, c1, c0, 0
84-
orr r4, r4, #(1<<12) @ instruction cache enable
85-
orr r4, r4, #(1<<2) @ data cache enable
86-
orr r4, r4, #(1<<0) @ mpu enable
87-
mcr p15, 0, r4, c1, c0, 0
88-
89-
pop {r4-r5, pc}
90-
91-
_init:
92-
push {r0-r12, lr}
53+
@ Fixes mounting of SDMC
54+
ldr r0, =0x10000020
55+
mov r1, #0x340
56+
str r1, [r0]
9357

94-
bl _enable_caches
9558
bl main
9659

97-
mrc p15, 0, r4, c1, c0, 0
98-
bic r4, r4, #(1<<0) @ mpu disable
99-
mcr p15, 0, r4, c1, c0, 0
100-
101-
pop {r0-r12, lr}
102-
103-
@ return control to FIRM
104-
ldr pc, arm9ep_backup
60+
.die:
61+
b .die
10562

10663
#endif // EXEC_BOOTSTRAP

0 commit comments

Comments
 (0)