summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S')
-rw-r--r--c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S74
1 files changed, 32 insertions, 42 deletions
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S
index 7a137a526d..c131bf0de0 100644
--- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S
+++ b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_async_normal.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2016 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2011, 2017 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -40,19 +40,9 @@
#define SCRATCH_3_OFFSET GPR10_OFFSET
#define SCRATCH_4_OFFSET GPR11_OFFSET
#define SCRATCH_5_OFFSET GPR12_OFFSET
-
-/*
- * The register 2 slot is free, since this is the read-only small data anchor.
- */
-#define FRAME_OFFSET GPR2_OFFSET
+#define FRAME_OFFSET PPC_EXC_INTERRUPT_FRAME_OFFSET
#ifdef RTEMS_PROFILING
-/*
- * The CPU_INTERRUPT_FRAME_SIZE is enough to store this additional register.
- */
-#define ENTRY_INSTANT_REGISTER r15
-#define ENTRY_INSTANT_OFFSET GPR13_OFFSET
-
.macro GET_TIME_BASE REG
#if defined(__PPC_CPU_E6500__)
mfspr \REG, FSL_EIS_ATBL
@@ -88,17 +78,15 @@ ppc_exc_min_prolog_async_tmpl_normal:
ppc_exc_interrupt:
-#ifdef RTEMS_PROFILING
- /* Save non-volatile ENTRY_INSTANT_REGISTER */
- stw ENTRY_INSTANT_REGISTER, ENTRY_INSTANT_OFFSET(r1)
+ /* Save non-volatile FRAME_REGISTER */
+ PPC_REG_STORE FRAME_REGISTER, FRAME_OFFSET(r1)
+#ifdef RTEMS_PROFILING
/* Get entry instant */
- GET_TIME_BASE ENTRY_INSTANT_REGISTER
+ GET_TIME_BASE FRAME_REGISTER
+ stw FRAME_REGISTER, PPC_EXC_INTERRUPT_ENTRY_INSTANT_OFFSET(r1)
#endif /* RTEMS_PROFILING */
- /* Save non-volatile FRAME_REGISTER */
- stw FRAME_REGISTER, FRAME_OFFSET(r1)
-
#ifdef __SPE__
/* Enable SPE */
mfmsr FRAME_REGISTER
@@ -162,25 +150,29 @@ ppc_exc_interrupt:
lwzx HANDLER_REGISTER, HANDLER_REGISTER, SCRATCH_0_REGISTER
#endif /* PPC_EXC_CONFIG_USE_FIXED_HANDLER */
+#ifdef __powerpc64__
+ PPC_GPR_STORE r2, GPR2_OFFSET(r1)
+ LA32 r2, .TOC.
+#endif
PPC_GPR_STORE SCRATCH_1_REGISTER, SCRATCH_1_OFFSET(r1)
PPC_GPR_STORE SCRATCH_2_REGISTER, SCRATCH_2_OFFSET(r1)
PPC_GPR_STORE SCRATCH_3_REGISTER, SCRATCH_3_OFFSET(r1)
PPC_GPR_STORE SCRATCH_4_REGISTER, SCRATCH_4_OFFSET(r1)
PPC_GPR_STORE SCRATCH_5_REGISTER, SCRATCH_5_OFFSET(r1)
- /* Save SRR0, SRR1, CR, CTR, XER, and LR */
+ /* Save SRR0, SRR1, CR, XER, CTR, and LR */
mfsrr0 SCRATCH_0_REGISTER
mfsrr1 SCRATCH_1_REGISTER
mfcr SCRATCH_2_REGISTER
- mfctr SCRATCH_3_REGISTER
- mfxer SCRATCH_4_REGISTER
+ mfxer SCRATCH_3_REGISTER
+ mfctr SCRATCH_4_REGISTER
mflr SCRATCH_5_REGISTER
- stw SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
- stw SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
+ PPC_REG_STORE SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
+ PPC_REG_STORE SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
stw SCRATCH_2_REGISTER, EXC_CR_OFFSET(r1)
- stw SCRATCH_3_REGISTER, EXC_CTR_OFFSET(r1)
- stw SCRATCH_4_REGISTER, EXC_XER_OFFSET(r1)
- stw SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
+ stw SCRATCH_3_REGISTER, EXC_XER_OFFSET(r1)
+ PPC_REG_STORE SCRATCH_4_REGISTER, EXC_CTR_OFFSET(r1)
+ PPC_REG_STORE SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
#ifdef __SPE__
/* Save SPEFSCR and ACC */
@@ -292,7 +284,7 @@ ppc_exc_interrupt:
/* Update profiling data if necessary */
bne cr2, .Lprofiling_done
GET_SELF_CPU_CONTROL r3
- mr r4, ENTRY_INSTANT_REGISTER
+ lwz r4, PPC_EXC_INTERRUPT_ENTRY_INSTANT_OFFSET(FRAME_REGISTER)
GET_TIME_BASE r5
bl _Profiling_Outer_most_interrupt_entry_and_exit
.Lprofiling_done:
@@ -310,7 +302,7 @@ ppc_exc_interrupt:
* on the IRQ stack) and restore FRAME_REGISTER.
*/
mr r1, FRAME_REGISTER
- lwz FRAME_REGISTER, FRAME_OFFSET(r1)
+ PPC_REG_LOAD FRAME_REGISTER, FRAME_OFFSET(r1)
/* Decrement levels and determine thread dispatch state */
xori SCRATCH_0_REGISTER, SCRATCH_0_REGISTER, 1
@@ -458,13 +450,13 @@ ppc_exc_interrupt:
li SCRATCH_0_REGISTER, FRAME_OFFSET
stwcx. SCRATCH_0_REGISTER, r1, SCRATCH_0_REGISTER
- /* Load SRR0, SRR1, CR, CTR, XER, and LR */
- lwz SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
- lwz SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
+ /* Load SRR0, SRR1, CR, XER, CTR, and LR */
+ PPC_REG_LOAD SCRATCH_0_REGISTER, SRR0_FRAME_OFFSET(r1)
+ PPC_REG_LOAD SCRATCH_1_REGISTER, SRR1_FRAME_OFFSET(r1)
lwz SCRATCH_2_REGISTER, EXC_CR_OFFSET(r1)
- lwz SCRATCH_3_REGISTER, EXC_CTR_OFFSET(r1)
- lwz SCRATCH_4_REGISTER, EXC_XER_OFFSET(r1)
- lwz SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
+ lwz SCRATCH_3_REGISTER, EXC_XER_OFFSET(r1)
+ PPC_REG_LOAD SCRATCH_4_REGISTER, EXC_CTR_OFFSET(r1)
+ PPC_REG_LOAD SCRATCH_5_REGISTER, EXC_LR_OFFSET(r1)
PPC_GPR_LOAD VECTOR_REGISTER, VECTOR_OFFSET(r1)
PPC_GPR_LOAD SELF_CPU_REGISTER, SELF_CPU_OFFSET(r1)
@@ -486,21 +478,19 @@ ppc_exc_interrupt:
mtsrr0 SCRATCH_0_REGISTER
PPC_GPR_LOAD SCRATCH_0_REGISTER, SCRATCH_0_OFFSET(r1)
mtsrr1 SCRATCH_1_REGISTER
+#ifdef __powerpc64__
+ PPC_GPR_LOAD r2, GPR2_OFFSET(r1)
+#endif
PPC_GPR_LOAD SCRATCH_1_REGISTER, SCRATCH_1_OFFSET(r1)
mtcr SCRATCH_2_REGISTER
PPC_GPR_LOAD SCRATCH_2_REGISTER, SCRATCH_2_OFFSET(r1)
- mtctr SCRATCH_3_REGISTER
+ mtxer SCRATCH_3_REGISTER
PPC_GPR_LOAD SCRATCH_3_REGISTER, SCRATCH_3_OFFSET(r1)
- mtxer SCRATCH_4_REGISTER
+ mtctr SCRATCH_4_REGISTER
PPC_GPR_LOAD SCRATCH_4_REGISTER, SCRATCH_4_OFFSET(r1)
mtlr SCRATCH_5_REGISTER
PPC_GPR_LOAD SCRATCH_5_REGISTER, SCRATCH_5_OFFSET(r1)
-#ifdef RTEMS_PROFILING
- /* Restore ENTRY_INSTANT_REGISTER */
- lwz ENTRY_INSTANT_REGISTER, ENTRY_INSTANT_OFFSET(r1)
-#endif /* RTEMS_PROFILING */
-
/* Pop stack */
addi r1, r1, PPC_EXC_INTERRUPT_FRAME_SIZE