Commit fc4e188789b01dc9f18c80869c43fdd7d1a51378

Authored by Joakim Tjernlund
Committed by Wolfgang Denk
1 parent 2903ad33a7

ppc: Loose GOT access in IRQ

Using the GOT in IRQ handlers requires r14 to be -ffixed-r14.
Avoid this by relocatate transfer_to_handler too.
This will allow to free up r14 later on.

Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>

Showing 15 changed files with 108 additions and 407 deletions Side-by-side Diff

cpu/74xx_7xx/start.S
... ... @@ -132,28 +132,15 @@
132 132 mfspr r5,DSISR
133 133 stw r5,_DSISR(r21)
134 134 addi r3,r1,STACK_FRAME_OVERHEAD
135   - li r20,MSR_KERNEL
136   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
137   - lwz r6,GOT(transfer_to_handler)
138   - mtlr r6
139   - blrl
140   -.L_Alignment:
141   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
142   - .long int_return - _start + EXC_OFF_SYS_RESET
  135 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
143 136  
144 137 /* Program check exception */
145 138 . = 0x700
146 139 ProgramCheck:
147 140 EXCEPTION_PROLOG(SRR0, SRR1)
148 141 addi r3,r1,STACK_FRAME_OVERHEAD
149   - li r20,MSR_KERNEL
150   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
151   - lwz r6,GOT(transfer_to_handler)
152   - mtlr r6
153   - blrl
154   -.L_ProgramCheck:
155   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
156   - .long int_return - _start + EXC_OFF_SYS_RESET
  142 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  143 + MSR_KERNEL, COPY_EE)
157 144  
158 145 /* No FPU on MPC8xx. This exception is not supposed to happen.
159 146 */
... ... @@ -835,23 +822,6 @@
835 822 mtmsr r7
836 823  
837 824 mtlr r4 /* restore link register */
838   - blr
839   -
840   - /*
841   - * Function: relocate entries for one exception vector
842   - */
843   -trap_reloc:
844   - lwz r0, 0(r7) /* hdlr ... */
845   - add r0, r0, r3 /* ... += dest_addr */
846   - stw r0, 0(r7)
847   -
848   - lwz r0, 4(r7) /* int_return ... */
849   - add r0, r0, r3 /* ... += dest_addr */
850   - stw r0, 4(r7)
851   -
852   - sync
853   - isync
854   -
855 825 blr
856 826  
857 827 #ifdef CONFIG_SYS_INIT_RAM_LOCK
... ... @@ -127,30 +127,15 @@
127 127 mfspr r5,DSISR
128 128 stw r5,_DSISR(r21)
129 129 addi r3,r1,STACK_FRAME_OVERHEAD
130   - li r20,MSR_KERNEL
131   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
132   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
133   - lwz r6,GOT(transfer_to_handler)
134   - mtlr r6
135   - blrl
136   -.L_Alignment:
137   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
138   - .long int_return - _start + EXC_OFF_SYS_RESET
  130 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
139 131  
140 132 /* Program check exception */
141 133 . = 0x700
142 134 ProgramCheck:
143 135 EXCEPTION_PROLOG(SRR0, SRR1)
144 136 addi r3,r1,STACK_FRAME_OVERHEAD
145   - li r20,MSR_KERNEL
146   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
147   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
148   - lwz r6,GOT(transfer_to_handler)
149   - mtlr r6
150   - blrl
151   -.L_ProgramCheck:
152   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
153   - .long int_return - _start + EXC_OFF_SYS_RESET
  137 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  138 + MSR_KERNEL, COPY_EE)
154 139  
155 140 /* Floating Point Unit unavailable exception */
156 141 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
... ... @@ -722,19 +707,5 @@
722 707 SYNC
723 708  
724 709 mtlr r4 /* restore link register */
725   - blr
726   -
727   - /*
728   - * Function: relocate entries for one exception vector
729   - */
730   -trap_reloc:
731   - lwz r0, 0(r7) /* hdlr ... */
732   - add r0, r0, r3 /* ... += dest_addr */
733   - stw r0, 0(r7)
734   -
735   - lwz r0, 4(r7) /* int_return ... */
736   - add r0, r0, r3 /* ... += dest_addr */
737   - stw r0, 4(r7)
738   -
739 710 blr
... ... @@ -217,28 +217,15 @@
217 217 mfspr r5,DSISR
218 218 stw r5,_DSISR(r21)
219 219 addi r3,r1,STACK_FRAME_OVERHEAD
220   - li r20,MSR_KERNEL
221   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
222   - lwz r6,GOT(transfer_to_handler)
223   - mtlr r6
224   - blrl
225   -.L_Alignment:
226   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
227   - .long int_return - _start + EXC_OFF_SYS_RESET
  220 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
228 221  
229 222 /* Program check exception */
230 223 . = 0x700
231 224 ProgramCheck:
232 225 EXCEPTION_PROLOG(SRR0, SRR1)
233 226 addi r3,r1,STACK_FRAME_OVERHEAD
234   - li r20,MSR_KERNEL
235   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
236   - lwz r6,GOT(transfer_to_handler)
237   - mtlr r6
238   - blrl
239   -.L_ProgramCheck:
240   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
241   - .long int_return - _start + EXC_OFF_SYS_RESET
  227 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  228 + MSR_KERNEL, COPY_EE)
242 229  
243 230 /* FPU on MPC5xx available. We will use it later.
244 231 */
... ... @@ -562,24 +549,6 @@
562 549  
563 550 mtlr r4 /* restore link register */
564 551 blr
565   -
566   - /*
567   - * Function: relocate entries for one exception vector
568   - */
569   -trap_reloc:
570   - lwz r0, 0(r7) /* hdlr ... */
571   - add r0, r0, r3 /* ... += dest_addr */
572   - stw r0, 0(r7)
573   -
574   - lwz r0, 4(r7) /* int_return ... */
575   - add r0, r0, r3 /* ... += dest_addr */
576   - stw r0, 4(r7)
577   -
578   - sync
579   - isync
580   -
581   - blr
582   -
583 552  
584 553 #if defined(CONFIG_PATI)
585 554 /* Program the PLL */
... ... @@ -215,30 +215,15 @@
215 215 mfspr r5,DSISR
216 216 stw r5,_DSISR(r21)
217 217 addi r3,r1,STACK_FRAME_OVERHEAD
218   - li r20,MSR_KERNEL
219   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
220   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
221   - lwz r6,GOT(transfer_to_handler)
222   - mtlr r6
223   - blrl
224   -.L_Alignment:
225   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
226   - .long int_return - _start + EXC_OFF_SYS_RESET
  218 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
227 219  
228 220 /* Program check exception */
229 221 . = 0x700
230 222 ProgramCheck:
231 223 EXCEPTION_PROLOG(SRR0, SRR1)
232 224 addi r3,r1,STACK_FRAME_OVERHEAD
233   - li r20,MSR_KERNEL
234   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
235   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
236   - lwz r6,GOT(transfer_to_handler)
237   - mtlr r6
238   - blrl
239   -.L_ProgramCheck:
240   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
241   - .long int_return - _start + EXC_OFF_SYS_RESET
  225 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  226 + MSR_KERNEL, COPY_EE)
242 227  
243 228 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
244 229  
... ... @@ -796,19 +781,5 @@
796 781 SYNC
797 782  
798 783 mtlr r4 /* restore link register */
799   - blr
800   -
801   - /*
802   - * Function: relocate entries for one exception vector
803   - */
804   -trap_reloc:
805   - lwz r0, 0(r7) /* hdlr ... */
806   - add r0, r0, r3 /* ... += dest_addr */
807   - stw r0, 0(r7)
808   -
809   - lwz r0, 4(r7) /* int_return ... */
810   - add r0, r0, r3 /* ... += dest_addr */
811   - stw r0, 4(r7)
812   -
813 784 blr
... ... @@ -176,30 +176,15 @@
176 176 mfspr r5,DSISR
177 177 stw r5,_DSISR(r21)
178 178 addi r3,r1,STACK_FRAME_OVERHEAD
179   - li r20,MSR_KERNEL
180   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
181   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
182   - lwz r6,GOT(transfer_to_handler)
183   - mtlr r6
184   - blrl
185   -.L_Alignment:
186   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
187   - .long int_return - _start + EXC_OFF_SYS_RESET
  179 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
188 180  
189 181 /* Program check exception */
190 182 . = 0x700
191 183 ProgramCheck:
192 184 EXCEPTION_PROLOG(SRR0, SRR1)
193 185 addi r3,r1,STACK_FRAME_OVERHEAD
194   - li r20,MSR_KERNEL
195   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
196   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
197   - lwz r6,GOT(transfer_to_handler)
198   - mtlr r6
199   - blrl
200   -.L_ProgramCheck:
201   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
202   - .long int_return - _start + EXC_OFF_SYS_RESET
  186 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  187 + MSR_KERNEL, COPY_EE)
203 188  
204 189 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
205 190  
... ... @@ -761,19 +746,5 @@
761 746 SYNC
762 747  
763 748 mtlr r4 /* restore link register */
764   - blr
765   -
766   - /*
767   - * Function: relocate entries for one exception vector
768   - */
769   -trap_reloc:
770   - lwz r0, 0(r7) /* hdlr ... */
771   - add r0, r0, r3 /* ... += dest_addr */
772   - stw r0, 0(r7)
773   -
774   - lwz r0, 4(r7) /* int_return ... */
775   - add r0, r0, r3 /* ... += dest_addr */
776   - stw r0, 4(r7)
777   -
778 749 blr
... ... @@ -227,28 +227,15 @@
227 227 mfspr r5,DSISR
228 228 stw r5,_DSISR(r21)
229 229 addi r3,r1,STACK_FRAME_OVERHEAD
230   - li r20,MSR_KERNEL
231   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
232   - lwz r6,GOT(transfer_to_handler)
233   - mtlr r6
234   - blrl
235   -.L_Alignment:
236   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
237   - .long int_return - _start + EXC_OFF_SYS_RESET
  230 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
238 231  
239 232 /* Program check exception */
240 233 . = EXC_OFF_PROGRAM
241 234 ProgramCheck:
242 235 EXCEPTION_PROLOG(SRR0, SRR1)
243 236 addi r3,r1,STACK_FRAME_OVERHEAD
244   - li r20,MSR_KERNEL
245   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
246   - lwz r6,GOT(transfer_to_handler)
247   - mtlr r6
248   - blrl
249   -.L_ProgramCheck:
250   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
251   - .long int_return - _start + EXC_OFF_SYS_RESET
  237 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  238 + MSR_KERNEL, COPY_EE)
252 239  
253 240 /* No FPU on MPC8xx. This exception is not supposed to happen.
254 241 */
... ... @@ -693,20 +680,6 @@
693 680 blt 4b
694 681  
695 682 mtlr r4 /* restore link register */
696   - blr
697   -
698   - /*
699   - * Function: relocate entries for one exception vector
700   - */
701   -trap_reloc:
702   - lwz r0, 0(r7) /* hdlr ... */
703   - add r0, r0, r3 /* ... += dest_addr */
704   - stw r0, 0(r7)
705   -
706   - lwz r0, 4(r7) /* int_return ... */
707   - add r0, r0, r3 /* ... += dest_addr */
708   - stw r0, 4(r7)
709   -
710 683 blr
711 684  
712 685 /* Setup the BAT registers.
... ... @@ -286,30 +286,15 @@
286 286 mfspr r5,DSISR
287 287 stw r5,_DSISR(r21)
288 288 addi r3,r1,STACK_FRAME_OVERHEAD
289   - li r20,MSR_KERNEL
290   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
291   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
292   - lwz r6,GOT(transfer_to_handler)
293   - mtlr r6
294   - blrl
295   -.L_Alignment:
296   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
297   - .long int_return - _start + EXC_OFF_SYS_RESET
  289 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
298 290  
299 291 /* Program check exception */
300 292 . = 0x700
301 293 ProgramCheck:
302 294 EXCEPTION_PROLOG(SRR0, SRR1)
303 295 addi r3,r1,STACK_FRAME_OVERHEAD
304   - li r20,MSR_KERNEL
305   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
306   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
307   - lwz r6,GOT(transfer_to_handler)
308   - mtlr r6
309   - blrl
310   -.L_ProgramCheck:
311   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
312   - .long int_return - _start + EXC_OFF_SYS_RESET
  296 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  297 + MSR_KERNEL, COPY_EE)
313 298  
314 299 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
315 300  
... ... @@ -1032,19 +1017,5 @@
1032 1017 SYNC
1033 1018  
1034 1019 mtlr r4 /* restore link register */
1035   - blr
1036   -
1037   - /*
1038   - * Function: relocate entries for one exception vector
1039   - */
1040   -trap_reloc:
1041   - lwz r0, 0(r7) /* hdlr ... */
1042   - add r0, r0, r3 /* ... += dest_addr */
1043   - stw r0, 0(r7)
1044   -
1045   - lwz r0, 4(r7) /* int_return ... */
1046   - add r0, r0, r3 /* ... += dest_addr */
1047   - stw r0, 4(r7)
1048   -
1049 1020 blr
... ... @@ -338,30 +338,15 @@
338 338 mfspr r5,DSISR
339 339 stw r5,_DSISR(r21)
340 340 addi r3,r1,STACK_FRAME_OVERHEAD
341   - li r20,MSR_KERNEL
342   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
343   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
344   - lwz r6,GOT(transfer_to_handler)
345   - mtlr r6
346   - blrl
347   -.L_Alignment:
348   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
349   - .long int_return - _start + EXC_OFF_SYS_RESET
  341 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
350 342  
351 343 /* Program check exception */
352 344 . = 0x700
353 345 ProgramCheck:
354 346 EXCEPTION_PROLOG(SRR0, SRR1)
355 347 addi r3,r1,STACK_FRAME_OVERHEAD
356   - li r20,MSR_KERNEL
357   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
358   - rlwimi r20,r23,0,25,25 /* copy IP bit from saved MSR */
359   - lwz r6,GOT(transfer_to_handler)
360   - mtlr r6
361   - blrl
362   -.L_ProgramCheck:
363   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
364   - .long int_return - _start + EXC_OFF_SYS_RESET
  348 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  349 + MSR_KERNEL, COPY_EE)
365 350  
366 351 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
367 352  
... ... @@ -1086,19 +1071,6 @@
1086 1071 mtlr r4 /* restore link register */
1087 1072 blr
1088 1073  
1089   - /*
1090   - * Function: relocate entries for one exception vector
1091   - */
1092   -trap_reloc:
1093   - lwz r0, 0(r7) /* hdlr ... */
1094   - add r0, r0, r3 /* ... += dest_addr */
1095   - stw r0, 0(r7)
1096   -
1097   - lwz r0, 4(r7) /* int_return ... */
1098   - add r0, r0, r3 /* ... += dest_addr */
1099   - stw r0, 4(r7)
1100   -
1101   - blr
1102 1074 #endif /* !CONFIG_NAND_SPL */
1103 1075  
1104 1076 #ifdef CONFIG_SYS_INIT_RAM_LOCK
... ... @@ -415,28 +415,15 @@
415 415 mfspr r5,DSISR
416 416 stw r5,_DSISR(r21)
417 417 addi r3,r1,STACK_FRAME_OVERHEAD
418   - li r20,MSR_KERNEL
419   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
420   - lwz r6,GOT(transfer_to_handler)
421   - mtlr r6
422   - blrl
423   -.L_Alignment:
424   - .long AlignmentException - _start + _START_OFFSET
425   - .long int_return - _start + _START_OFFSET
  418 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
426 419  
427 420 /* Program check exception */
428 421 . = 0x0700
429 422 ProgramCheck:
430 423 EXCEPTION_PROLOG(SRR0, SRR1)
431 424 addi r3,r1,STACK_FRAME_OVERHEAD
432   - li r20,MSR_KERNEL
433   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
434   - lwz r6,GOT(transfer_to_handler)
435   - mtlr r6
436   - blrl
437   -.L_ProgramCheck:
438   - .long ProgramCheckException - _start + _START_OFFSET
439   - .long int_return - _start + _START_OFFSET
  425 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  426 + MSR_KERNEL, COPY_EE)
440 427  
441 428 /* No FPU on MPC85xx. This exception is not supposed to happen.
442 429 */
... ... @@ -1087,20 +1074,6 @@
1087 1074 mtspr IVPR,r7
1088 1075  
1089 1076 mtlr r4 /* restore link register */
1090   - blr
1091   -
1092   - /*
1093   - * Function: relocate entries for one exception vector
1094   - */
1095   -trap_reloc:
1096   - lwz r0,0(r7) /* hdlr ... */
1097   - add r0,r0,r3 /* ... += dest_addr */
1098   - stw r0,0(r7)
1099   -
1100   - lwz r0,4(r7) /* int_return ... */
1101   - add r0,r0,r3 /* ... += dest_addr */
1102   - stw r0,4(r7)
1103   -
1104 1077 blr
1105 1078  
1106 1079 .globl unlock_ram_in_cache
... ... @@ -121,28 +121,15 @@
121 121 mfspr r5,DSISR
122 122 stw r5,_DSISR(r21)
123 123 addi r3,r1,STACK_FRAME_OVERHEAD
124   - li r20,MSR_KERNEL
125   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
126   - lwz r6,GOT(transfer_to_handler)
127   - mtlr r6
128   - blrl
129   -.L_Alignment:
130   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
131   - .long int_return - _start + EXC_OFF_SYS_RESET
  124 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
132 125  
133 126 /* Program check exception */
134 127 . = 0x700
135 128 ProgramCheck:
136 129 EXCEPTION_PROLOG(SRR0, SRR1)
137 130 addi r3,r1,STACK_FRAME_OVERHEAD
138   - li r20,MSR_KERNEL
139   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
140   - lwz r6,GOT(transfer_to_handler)
141   - mtlr r6
142   - blrl
143   -.L_ProgramCheck:
144   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
145   - .long int_return - _start + EXC_OFF_SYS_RESET
  131 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  132 + MSR_KERNEL, COPY_EE)
146 133  
147 134 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
148 135  
... ... @@ -846,23 +833,6 @@
846 833 mtmsr r7
847 834  
848 835 mtlr r4 /* restore link register */
849   - blr
850   -
851   - /*
852   - * Function: relocate entries for one exception vector
853   - */
854   -trap_reloc:
855   - lwz r0, 0(r7) /* hdlr ... */
856   - add r0, r0, r3 /* ... += dest_addr */
857   - stw r0, 0(r7)
858   -
859   - lwz r0, 4(r7) /* int_return ... */
860   - add r0, r0, r3 /* ... += dest_addr */
861   - stw r0, 4(r7)
862   -
863   - sync
864   - isync
865   -
866 836 blr
867 837  
868 838 .globl enable_ext_addr
... ... @@ -231,28 +231,15 @@
231 231 mfspr r5,DSISR
232 232 stw r5,_DSISR(r21)
233 233 addi r3,r1,STACK_FRAME_OVERHEAD
234   - li r20,MSR_KERNEL
235   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
236   - lwz r6,GOT(transfer_to_handler)
237   - mtlr r6
238   - blrl
239   -.L_Alignment:
240   - .long AlignmentException - _start + EXC_OFF_SYS_RESET
241   - .long int_return - _start + EXC_OFF_SYS_RESET
  234 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
242 235  
243 236 /* Program check exception */
244 237 . = 0x700
245 238 ProgramCheck:
246 239 EXCEPTION_PROLOG(SRR0, SRR1)
247 240 addi r3,r1,STACK_FRAME_OVERHEAD
248   - li r20,MSR_KERNEL
249   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
250   - lwz r6,GOT(transfer_to_handler)
251   - mtlr r6
252   - blrl
253   -.L_ProgramCheck:
254   - .long ProgramCheckException - _start + EXC_OFF_SYS_RESET
255   - .long int_return - _start + EXC_OFF_SYS_RESET
  241 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  242 + MSR_KERNEL, COPY_EE)
256 243  
257 244 /* No FPU on MPC8xx. This exception is not supposed to happen.
258 245 */
... ... @@ -693,22 +680,5 @@
693 680 blt 4b
694 681  
695 682 mtlr r4 /* restore link register */
696   - blr
697   -
698   - /*
699   - * Function: relocate entries for one exception vector
700   - */
701   -trap_reloc:
702   - lwz r0, 0(r7) /* hdlr ... */
703   - add r0, r0, r3 /* ... += dest_addr */
704   - stw r0, 0(r7)
705   -
706   - lwz r0, 4(r7) /* int_return ... */
707   - add r0, r0, r3 /* ... += dest_addr */
708   - stw r0, 4(r7)
709   -
710   - sync
711   - isync
712   -
713 683 blr
... ... @@ -574,28 +574,15 @@
574 574 mfspr r5,DSISR
575 575 stw r5,_DSISR(r21)
576 576 addi r3,r1,STACK_FRAME_OVERHEAD
577   - li r20,MSR_KERNEL
578   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
579   - lwz r6,GOT(transfer_to_handler)
580   - mtlr r6
581   - blrl
582   -.L_Alignment:
583   - .long AlignmentException - _start + _START_OFFSET
584   - .long int_return - _start + _START_OFFSET
  577 + EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
585 578  
586 579 /* Program check exception */
587 580 . = 0x700
588 581 ProgramCheck:
589 582 EXCEPTION_PROLOG(SRR0, SRR1)
590 583 addi r3,r1,STACK_FRAME_OVERHEAD
591   - li r20,MSR_KERNEL
592   - rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
593   - lwz r6,GOT(transfer_to_handler)
594   - mtlr r6
595   - blrl
596   -.L_ProgramCheck:
597   - .long ProgramCheckException - _start + _START_OFFSET
598   - .long int_return - _start + _START_OFFSET
  584 + EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
  585 + MSR_KERNEL, COPY_EE)
599 586  
600 587 #ifdef CONFIG_440
601 588 STD_EXCEPTION(0x800, FPUnavailable, UnknownException)
... ... @@ -1740,20 +1727,6 @@
1740 1727 #endif
1741 1728  
1742 1729 mtlr r4 /* restore link register */
1743   - blr
1744   -
1745   - /*
1746   - * Function: relocate entries for one exception vector
1747   - */
1748   -trap_reloc:
1749   - lwz r0, 0(r7) /* hdlr ... */
1750   - add r0, r0, r3 /* ... += dest_addr */
1751   - stw r0, 0(r7)
1752   -
1753   - lwz r0, 4(r7) /* int_return ... */
1754   - add r0, r0, r3 /* ... += dest_addr */
1755   - stw r0, 4(r7)
1756   -
1757 1730 blr
1758 1731  
1759 1732 #if defined(CONFIG_440)
include/ppc_asm.tmpl
... ... @@ -257,47 +257,44 @@
257 257 * OFFSET values only; they must be relocated first before they can
258 258 * be used!
259 259 */
260   -#define STD_EXCEPTION(n, label, hdlr) \
261   - . = n; \
262   -label: \
263   - EXCEPTION_PROLOG(SRR0, SRR1); \
264   - lwz r3,GOT(transfer_to_handler); \
265   - mtlr r3; \
266   - addi r3,r1,STACK_FRAME_OVERHEAD; \
267   - li r20,MSR_KERNEL; \
  260 +#define COPY_EE(d, s) rlwimi d,s,0,16,16
  261 +#define NOCOPY(d, s)
  262 +#define EXC_XFER_TEMPLATE(label, hdlr, msr, copyee) \
  263 + bl 1f; \
  264 +1: mflr r20; \
  265 + lwz r20,(.L_ ## label)-1b+8(r20); \
  266 + mtlr r20; \
  267 + li r20,msr; \
  268 + copyee(r20,r23); \
268 269 rlwimi r20,r23,0,25,25; \
269 270 blrl; \
270 271 .L_ ## label : \
271 272 .long hdlr - _start + _START_OFFSET; \
272   - .long int_return - _start + _START_OFFSET
  273 + .long int_return - _start + _START_OFFSET; \
  274 + .long transfer_to_handler - _start + _START_OFFSET
273 275  
  276 +#define STD_EXCEPTION(n, label, hdlr) \
  277 + . = n; \
  278 +label: \
  279 + EXCEPTION_PROLOG(SRR0, SRR1); \
  280 + addi r3,r1,STACK_FRAME_OVERHEAD; \
  281 + EXC_XFER_TEMPLATE(label, hdlr, MSR_KERNEL, NOCOPY) \
  282 +
274 283 #define CRIT_EXCEPTION(n, label, hdlr) \
275 284 . = n; \
276 285 label: \
277 286 EXCEPTION_PROLOG(CSRR0, CSRR1); \
278   - lwz r3,GOT(transfer_to_handler); \
279   - mtlr r3; \
280 287 addi r3,r1,STACK_FRAME_OVERHEAD; \
281   - li r20,(MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)); \
282   - rlwimi r20,r23,0,25,25; \
283   - blrl; \
284   -.L_ ## label : \
285   - .long hdlr - _start + _START_OFFSET; \
286   - .long crit_return - _start + _START_OFFSET
  288 + EXC_XFER_TEMPLATE(label, hdlr, \
  289 + MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY) \
287 290  
288 291 #define MCK_EXCEPTION(n, label, hdlr) \
289 292 . = n; \
290 293 label: \
291 294 EXCEPTION_PROLOG(MCSRR0, MCSRR1); \
292   - lwz r3,GOT(transfer_to_handler); \
293   - mtlr r3; \
294 295 addi r3,r1,STACK_FRAME_OVERHEAD; \
295   - li r20,(MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)); \
296   - rlwimi r20,r23,0,25,25; \
297   - blrl; \
298   -.L_ ## label : \
299   - .long hdlr - _start + _START_OFFSET; \
300   - .long mck_return - _start + _START_OFFSET
  296 + EXC_XFER_TEMPLATE(label, hdlr, \
  297 + MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY) \
301 298  
302 299 #endif /* __PPC_ASM_TMPL__ */
... ... @@ -28,6 +28,7 @@
28 28 SOBJS-y += ppccache.o
29 29 SOBJS-y += ppcstring.o
30 30 SOBJS-y += ticks.o
  31 +SOBJS-y += reloc.o
31 32  
32 33 COBJS-y += bat_rw.o
33 34 COBJS-y += board.o
  1 +/*
  2 + * Copyright (C) 2009 Wolfgang Denk <wd@denx.de>
  3 + *
  4 + * See file CREDITS for list of people who contributed to this
  5 + * project.
  6 + *
  7 + * This program is free software; you can redistribute it and/or
  8 + * modify it under the terms of the GNU General Public License as
  9 + * published by the Free Software Foundation; either version 2 of
  10 + * the License, or (at your option) any later version.
  11 + *
  12 + * This program is distributed in the hope that it will be useful,
  13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 + * GNU General Public License for more details.
  16 + *
  17 + * You should have received a copy of the GNU General Public License
  18 + * along with this program; if not, write to the Free Software
  19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20 + * MA 02111-1307 USA
  21 + */
  22 +
  23 +#include <ppc_asm.tmpl>
  24 +
  25 + .file "reloc.S"
  26 +
  27 + .text
  28 +#ifndef CONFIG_NAND_SPL
  29 + /*
  30 + * Function: relocate entries for one exception vector
  31 + */
  32 + .globl trap_reloc
  33 + .type trap_reloc, @function
  34 +trap_reloc:
  35 + lwz r0, 0(r7) /* hdlr ... */
  36 + add r0, r0, r3 /* ... += dest_addr */
  37 + stw r0, 0(r7)
  38 +
  39 + lwz r0, 4(r7) /* int_return ... */
  40 + add r0, r0, r3 /* ... += dest_addr */
  41 + stw r0, 4(r7)
  42 +
  43 + lwz r0, 8(r7) /* transfer_to_handler ...*/
  44 + add r0, r0, r3 /* ... += dest_addr */
  45 + stw r0, 8(r7)
  46 +
  47 + blr
  48 + .size trap_reloc, .-trap_reloc
  49 +#endif