diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/target/arm/as3525/app.lds | 41 | ||||
-rw-r--r-- | firmware/target/arm/crt0.S | 32 |
2 files changed, 56 insertions, 17 deletions
diff --git a/firmware/target/arm/as3525/app.lds b/firmware/target/arm/as3525/app.lds index 08b119eb3f..c2d3ed83ee 100644 --- a/firmware/target/arm/as3525/app.lds +++ b/firmware/target/arm/as3525/app.lds | |||
@@ -38,20 +38,11 @@ SECTIONS | |||
38 | { | 38 | { |
39 | loadaddress = 0x30000000; | 39 | loadaddress = 0x30000000; |
40 | 40 | ||
41 | .vectors DRAMORIG : | ||
42 | { | ||
43 | _vectorstart = .; | ||
44 | *(.vectors*); | ||
45 | *(.init.text) | ||
46 | . = ALIGN(0x4); | ||
47 | } > DRAM | ||
48 | |||
49 | .text : | 41 | .text : |
50 | { | 42 | { |
51 | _textstart = .; | 43 | _textstart = .; |
52 | *(.text) | 44 | *(.text) |
53 | *(.text*) | 45 | *(.text*) |
54 | *(.icode) | ||
55 | *(.glue_7) | 46 | *(.glue_7) |
56 | *(.glue_7t) | 47 | *(.glue_7t) |
57 | . = ALIGN(0x4); | 48 | . = ALIGN(0x4); |
@@ -63,14 +54,12 @@ SECTIONS | |||
63 | *(.rodata*) | 54 | *(.rodata*) |
64 | *(.rodata.str1.1) | 55 | *(.rodata.str1.1) |
65 | *(.rodata.str1.4) | 56 | *(.rodata.str1.4) |
66 | *(.irodata*) | ||
67 | . = ALIGN(0x4); | 57 | . = ALIGN(0x4); |
68 | } > DRAM | 58 | } > DRAM |
69 | 59 | ||
70 | .data : | 60 | .data : |
71 | { | 61 | { |
72 | *(.data*) | 62 | *(.data*) |
73 | *(.idata*) | ||
74 | . = ALIGN(0x4); | 63 | . = ALIGN(0x4); |
75 | } > DRAM | 64 | } > DRAM |
76 | 65 | ||
@@ -93,12 +82,40 @@ SECTIONS | |||
93 | { | 82 | { |
94 | _edata = .; | 83 | _edata = .; |
95 | *(.bss*) | 84 | *(.bss*) |
96 | *(.ibss*) | ||
97 | *(COMMON) | 85 | *(COMMON) |
98 | . = ALIGN(0x4); | 86 | . = ALIGN(0x4); |
99 | _end = .; | 87 | _end = .; |
100 | } > DRAM | 88 | } > DRAM |
101 | 89 | ||
90 | .vectors IRAMORIG: | ||
91 | { | ||
92 | _vectors_start = .; | ||
93 | *(.init.text) | ||
94 | } > IRAM AT > DRAM | ||
95 | |||
96 | _vectorscopy = LOADADDR(.vectors); | ||
97 | |||
98 | .ibss (NOLOAD) : | ||
99 | { | ||
100 | _iedata = .; | ||
101 | *(.qharray) | ||
102 | *(.ibss) | ||
103 | . = ALIGN(0x4); | ||
104 | _iend = .; | ||
105 | } > IRAM | ||
106 | |||
107 | .iram _iend : | ||
108 | { | ||
109 | _iramstart = .; | ||
110 | *(.icode) | ||
111 | *(.irodata) | ||
112 | *(.idata) | ||
113 | . = ALIGN(0x4); | ||
114 | _iramend = .; | ||
115 | } > IRAM AT> DRAM | ||
116 | |||
117 | _iramcopy = LOADADDR(.iram); | ||
118 | |||
102 | .audiobuf (NOLOAD) : | 119 | .audiobuf (NOLOAD) : |
103 | { | 120 | { |
104 | . = ALIGN(4); | 121 | . = ALIGN(4); |
diff --git a/firmware/target/arm/crt0.S b/firmware/target/arm/crt0.S index 829004193f..35d0aecccb 100644 --- a/firmware/target/arm/crt0.S +++ b/firmware/target/arm/crt0.S | |||
@@ -50,22 +50,43 @@ start: | |||
50 | .word irq_handler | 50 | .word irq_handler |
51 | .word fiq_handler | 51 | .word fiq_handler |
52 | 52 | ||
53 | vectors_end: | 53 | _vectorsend: |
54 | 54 | ||
55 | .text | 55 | .text |
56 | 56 | ||
57 | newstart: | 57 | newstart: |
58 | msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */ | 58 | msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */ |
59 | 59 | ||
60 | #if CONFIG_CPU==AS3525 && !defined(BOOTLOADER) /* relocate vectors */ | 60 | #if CONFIG_CPU==AS3525 && !defined(BOOTLOADER) |
61 | |||
62 | /* relocate vectors */ | ||
61 | mov r1, #0 @ destination | 63 | mov r1, #0 @ destination |
62 | ldr r2, =start @ source | 64 | ldr r2, =_vectorscopy @ source |
63 | ldr r3, =vectors_end @ end | 65 | ldr r3, =_vectorsend @ end |
64 | 66 | ||
65 | 1: ldr r0, [r2], #4 | 67 | 1: ldr r0, [r2], #4 |
66 | str r0, [r1], #4 | 68 | str r0, [r1], #4 |
67 | cmp r3, r2 | 69 | cmp r1, r3 |
68 | bne 1b | 70 | bne 1b |
71 | |||
72 | /* Zero out IBSS */ | ||
73 | ldr r2, =_iedata | ||
74 | ldr r3, =_iend | ||
75 | mov r4, #0 | ||
76 | 1: | ||
77 | cmp r3, r2 | ||
78 | strhi r4, [r2], #4 | ||
79 | bhi 1b | ||
80 | |||
81 | /* Copy the IRAM */ | ||
82 | ldr r2, =_iramcopy | ||
83 | ldr r3, =_iramstart | ||
84 | ldr r4, =_iramend | ||
85 | 1: | ||
86 | cmp r4, r3 | ||
87 | ldrhi r5, [r2], #4 | ||
88 | strhi r5, [r3], #4 | ||
89 | bhi 1b | ||
69 | #endif | 90 | #endif |
70 | 91 | ||
71 | /* Initialise bss section to zero */ | 92 | /* Initialise bss section to zero */ |
@@ -102,6 +123,7 @@ newstart: | |||
102 | 123 | ||
103 | /* Switch back to supervisor mode */ | 124 | /* Switch back to supervisor mode */ |
104 | msr cpsr_c, #0xd3 | 125 | msr cpsr_c, #0xd3 |
126 | |||
105 | bl main | 127 | bl main |
106 | 128 | ||
107 | 129 | ||