diff options
Diffstat (limited to 'firmware/target/arm/tms320dm320/crt0.S')
-rwxr-xr-x | firmware/target/arm/tms320dm320/crt0.S | 80 |
1 files changed, 60 insertions, 20 deletions
diff --git a/firmware/target/arm/tms320dm320/crt0.S b/firmware/target/arm/tms320dm320/crt0.S index 8c747f7a51..09f936e808 100755 --- a/firmware/target/arm/tms320dm320/crt0.S +++ b/firmware/target/arm/tms320dm320/crt0.S | |||
@@ -28,9 +28,22 @@ | |||
28 | 28 | ||
29 | .global start | 29 | .global start |
30 | start: | 30 | start: |
31 | msr cpsr, #0xd3 /* enter supervisor mode, disable IRQ */ | 31 | .equ INTC_IRQ0, 0x00030508 |
32 | .equ INTC_IRQ1, 0x0003050A | ||
33 | .equ INTC_IRQ2, 0x0003050C | ||
34 | .equ INTC_FIQ0, 0x00030500 | ||
35 | .equ INTC_FIQ1, 0x00030502 | ||
36 | .equ INTC_FIQ2, 0x00030504 | ||
37 | .equ INTC_EINT0, 0x00030528 | ||
38 | .equ INTC_EINT1, 0x0003052A | ||
39 | .equ INTC_EINT2, 0x0003052C | ||
40 | .equ INTC_FISEL0, 0x00030520 | ||
41 | .equ INTC_FISEL1, 0x00030522 | ||
42 | .equ INTC_FISEL2, 0x00030524 | ||
43 | .equ INTC_MASK, 0xFFFFFFFF | ||
44 | |||
45 | msr cpsr, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */ | ||
32 | 46 | ||
33 | #if !defined(DEBUG) | ||
34 | /* Copy exception handler code to address 0 */ | 47 | /* Copy exception handler code to address 0 */ |
35 | ldr r2, =_vectorsstart | 48 | ldr r2, =_vectorsstart |
36 | ldr r3, =_vectorsend | 49 | ldr r3, =_vectorsend |
@@ -40,13 +53,6 @@ start: | |||
40 | ldrhi r5, [r4], #4 | 53 | ldrhi r5, [r4], #4 |
41 | strhi r5, [r2], #4 | 54 | strhi r5, [r2], #4 |
42 | bhi 1b | 55 | bhi 1b |
43 | #else | ||
44 | ldr r1, =vectors | ||
45 | ldr r0, =irq_handler | ||
46 | str r0, [r1, #24] | ||
47 | ldr r0, =fiq_handler | ||
48 | str r0, [r1, #28] | ||
49 | #endif | ||
50 | 56 | ||
51 | /* Disable data and instruction cache, high vectors (at 0xffff0000 instead of 0x00000000) */ | 57 | /* Disable data and instruction cache, high vectors (at 0xffff0000 instead of 0x00000000) */ |
52 | mrc p15, 0, r0, c1, c0, 0 | 58 | mrc p15, 0, r0, c1, c0, 0 |
@@ -58,9 +64,38 @@ start: | |||
58 | orr r0, r0, #0x00000002 | 64 | orr r0, r0, #0x00000002 |
59 | mcr p15, 0, r0, c1, c0, 0 | 65 | mcr p15, 0, r0, c1, c0, 0 |
60 | 66 | ||
61 | #if !defined(BOOTLOADER) | 67 | #if 0 |
68 | /* mask interrupts */ | ||
69 | ldr r1, =INTC_MASK | ||
70 | ldr r2, =INTC_IRQ0 | ||
71 | strh r1, [r2] | ||
72 | ldr r2, =INTC_IRQ1 | ||
73 | strh r1, [r2] | ||
74 | ldr r2, =INTC_IRQ2 | ||
75 | strh r1, [r2] | ||
76 | ldr r2, =INTC_FIQ0 | ||
77 | strh r1, [r2] | ||
78 | ldr r2, =INTC_FIQ1 | ||
79 | strh r1, [r2] | ||
80 | ldr r2, =INTC_FIQ2 | ||
81 | strh r1, [r2] | ||
62 | 82 | ||
63 | #if !defined(STUB) | 83 | mov r1, #0 |
84 | ldr r2, =INTC_EINT0 | ||
85 | strh r1, [r2] | ||
86 | ldr r2, =INTC_EINT1 | ||
87 | strh r1, [r2] | ||
88 | ldr r2, =INTC_EINT2 | ||
89 | strh r1, [r2] | ||
90 | ldr r2, =INTC_FISEL0 | ||
91 | strh r1, [r2] | ||
92 | ldr r2, =INTC_FISEL1 | ||
93 | strh r1, [r2] | ||
94 | ldr r2, =INTC_FISEL2 | ||
95 | strh r1, [r2] | ||
96 | #endif | ||
97 | |||
98 | #if !defined(BOOTLOADER) && !defined(STUB) | ||
64 | /* Zero out IBSS */ | 99 | /* Zero out IBSS */ |
65 | ldr r2, =_iedata | 100 | ldr r2, =_iedata |
66 | ldr r3, =_iend | 101 | ldr r3, =_iend |
@@ -79,8 +114,7 @@ start: | |||
79 | ldrhi r5, [r2], #4 | 114 | ldrhi r5, [r2], #4 |
80 | strhi r5, [r3], #4 | 115 | strhi r5, [r3], #4 |
81 | bhi 1b | 116 | bhi 1b |
82 | #endif /* !STUB */ | 117 | #endif /* !BOOTLOADER,!STUB */ |
83 | #endif /* !BOOTLOADER */ | ||
84 | 118 | ||
85 | /* Initialise bss section to zero */ | 119 | /* Initialise bss section to zero */ |
86 | ldr r2, =_edata | 120 | ldr r2, =_edata |
@@ -90,28 +124,31 @@ start: | |||
90 | cmp r3, r2 | 124 | cmp r3, r2 |
91 | strhi r4, [r2], #4 | 125 | strhi r4, [r2], #4 |
92 | bhi 1b | 126 | bhi 1b |
93 | 127 | ||
128 | /* Load stack munge value */ | ||
129 | ldr r4, =0xdeadbeef | ||
130 | |||
94 | /* Set up some stack and munge it with 0xdeadbeef */ | 131 | /* Set up some stack and munge it with 0xdeadbeef */ |
95 | ldr r3, =stackend | ||
96 | ldr r2, =stackbegin | 132 | ldr r2, =stackbegin |
97 | ldr r4, =0xdeadbeef | 133 | ldr r3, =stackend |
98 | 1: | 134 | 1: |
99 | cmp r3, r2 | 135 | cmp r3, r2 |
100 | strhi r4, [r2], #4 | 136 | strhi r4, [r2], #4 |
101 | bhi 1b | 137 | bhi 1b |
102 | 138 | ||
103 | /* Set up stack for IRQ mode */ | 139 | /* Set up stack for IRQ mode */ |
104 | msr cpsr_c, #0xd2 | 140 | msr cpsr_c, #0x92 /* IRQ disabled, FIQ enabled */ |
105 | ldr sp, =irq_stack | 141 | ldr sp, =irq_stack |
106 | /* Set up stack for FIQ mode */ | 142 | /* Set up stack for FIQ mode */ |
107 | msr cpsr_c, #0xd1 | 143 | msr cpsr_c, #0xd1 /* IRQ/FIQ disabled */ |
108 | ldr sp, =fiq_stack | 144 | ldr sp, =fiq_stack |
109 | 145 | ||
110 | /* Let abort and undefined modes use IRQ stack */ | 146 | /* Let abort and undefined modes use IRQ stack */ |
111 | msr cpsr_c, #0xd7 | 147 | msr cpsr_c, #0xd7 /* IRQ/FIQ disabled */ |
112 | ldr sp, =irq_stack | 148 | ldr sp, =irq_stack |
113 | msr cpsr_c, #0xdb | 149 | msr cpsr_c, #0xdb /* IRQ/FIQ disabled */ |
114 | ldr sp, =irq_stack | 150 | ldr sp, =irq_stack |
151 | |||
115 | /* Switch to supervisor mode (no IRQ) */ | 152 | /* Switch to supervisor mode (no IRQ) */ |
116 | msr cpsr_c, #0xd3 | 153 | msr cpsr_c, #0xd3 |
117 | ldr sp, =stackend | 154 | ldr sp, =stackend |
@@ -203,6 +240,9 @@ UIE: | |||
203 | b UIE | 240 | b UIE |
204 | #endif | 241 | #endif |
205 | 242 | ||
243 | /* Align stacks to cache line boundary */ | ||
244 | .balign 16 | ||
245 | |||
206 | /* 256 words of IRQ stack */ | 246 | /* 256 words of IRQ stack */ |
207 | .space 256*4 | 247 | .space 256*4 |
208 | irq_stack: | 248 | irq_stack: |