]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - include/ppc_asm.tmpl
ppc: Loose GOT access in IRQ
[karo-tx-uboot.git] / include / ppc_asm.tmpl
index 0019d460902c107a361cf059e634234999bfc976..fa5c5f66c1c257fae223ce5b871fbca4a022031b 100644 (file)
  * OFFSET values only; they must be relocated first before they can
  * be used!
  */
-#define STD_EXCEPTION(n, label, hdlr)                  \
-       . = n;                                          \
-label:                                                 \
-       EXCEPTION_PROLOG(SRR0, SRR1);                   \
-       lwz     r3,GOT(transfer_to_handler);            \
-       mtlr    r3;                                     \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
-       li      r20,MSR_KERNEL;                         \
+#define COPY_EE(d, s)          rlwimi d,s,0,16,16
+#define NOCOPY(d, s)
+#define EXC_XFER_TEMPLATE(label, hdlr, msr, copyee)    \
+       bl      1f;                                     \
+1:     mflr    r20;                                    \
+       lwz     r20,(.L_ ## label)-1b+8(r20);           \
+       mtlr    r20;                                    \
+       li      r20,msr;                                \
+       copyee(r20,r23);                                \
        rlwimi  r20,r23,0,25,25;                        \
        blrl;                                           \
 .L_ ## label :                                         \
        .long   hdlr - _start + _START_OFFSET;          \
-       .long   int_return - _start + _START_OFFSET
+       .long   int_return - _start + _START_OFFSET;    \
+       .long   transfer_to_handler - _start + _START_OFFSET
+
+#define STD_EXCEPTION(n, label, hdlr)                          \
+       . = n;                                                  \
+label:                                                         \
+       EXCEPTION_PROLOG(SRR0, SRR1);                           \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       EXC_XFER_TEMPLATE(label, hdlr, MSR_KERNEL, NOCOPY)      \
 
 #define CRIT_EXCEPTION(n, label, hdlr)                         \
        . = n;                                                  \
 label:                                                         \
        EXCEPTION_PROLOG(CSRR0, CSRR1);                         \
-       lwz     r3,GOT(transfer_to_handler);                    \
-       mtlr    r3;                                             \
        addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
-       li      r20,(MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE));     \
-       rlwimi  r20,r23,0,25,25;                                \
-       blrl;                                                   \
-.L_ ## label :                                                 \
-       .long   hdlr - _start + _START_OFFSET;                  \
-       .long   crit_return - _start + _START_OFFSET
+       EXC_XFER_TEMPLATE(label, hdlr,                          \
+       MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY)           \
 
 #define MCK_EXCEPTION(n, label, hdlr)                          \
        . = n;                                                  \
 label:                                                         \
        EXCEPTION_PROLOG(MCSRR0, MCSRR1);                       \
-       lwz     r3,GOT(transfer_to_handler);                    \
-       mtlr    r3;                                             \
        addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
-       li      r20,(MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE));     \
-       rlwimi  r20,r23,0,25,25;                                \
-       blrl;                                                   \
-.L_ ## label :                                                 \
-       .long   hdlr - _start + _START_OFFSET;                  \
-       .long   mck_return - _start + _START_OFFSET
+       EXC_XFER_TEMPLATE(label, hdlr,                          \
+       MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY)           \
 
 #endif /* __PPC_ASM_TMPL__ */