summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_naked.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_naked.S')
-rw-r--r--c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_naked.S207
1 files changed, 0 insertions, 207 deletions
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_naked.S b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_naked.S
deleted file mode 100644
index 1c27575fea..0000000000
--- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_naked.S
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * @file
- *
- * @ingroup ppc_exc
- *
- * @brief PowerPC Exceptions implementation.
- */
-
-/*
- * Copyright (c) 2009
- * embedded brains GmbH
- * Obere Lagerstr. 30
- * D-82178 Puchheim
- * Germany
- * <rtems@embedded-brains.de>
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#include "ppc_exc_asm_macros.h"
-
- .global ppc_exc_min_prolog_tmpl_naked
-
-ppc_exc_min_prolog_tmpl_naked:
-
- stwu r1, -EXCEPTION_FRAME_END(r1)
- stw VECTOR_REGISTER, VECTOR_OFFSET(r1)
- li VECTOR_REGISTER, 0
-
- /*
- * We store the absolute branch target address here. It will be used
- * to generate the branch operation in ppc_exc_make_prologue().
- */
- .int ppc_exc_wrap_naked
-
- .global ppc_exc_wrap_naked
-ppc_exc_wrap_naked:
-
- /* Save scratch registers */
- stw SCRATCH_REGISTER_0, SCRATCH_REGISTER_0_OFFSET(r1)
- stw SCRATCH_REGISTER_1, SCRATCH_REGISTER_1_OFFSET(r1)
- stw SCRATCH_REGISTER_2, SCRATCH_REGISTER_2_OFFSET(r1)
-
- /* Save volatile registers */
- stw r0, GPR0_OFFSET(r1)
- stw r3, GPR3_OFFSET(r1)
- stw r8, GPR8_OFFSET(r1)
- stw r9, GPR9_OFFSET(r1)
- stw r10, GPR10_OFFSET(r1)
- stw r11, GPR11_OFFSET(r1)
- stw r12, GPR12_OFFSET(r1)
-
- /* Save CR */
- mfcr SCRATCH_REGISTER_0
- stw SCRATCH_REGISTER_0, EXC_CR_OFFSET(r1)
-
- /* Save SRR0 */
- mfspr SCRATCH_REGISTER_0, srr0
- stw SCRATCH_REGISTER_0, SRR0_FRAME_OFFSET(r1)
-
- /* Save SRR1 */
- mfspr SCRATCH_REGISTER_0, srr1
- stw SCRATCH_REGISTER_0, SRR1_FRAME_OFFSET(r1)
-
- /* Save CTR */
- mfctr SCRATCH_REGISTER_0
- stw SCRATCH_REGISTER_0, EXC_CTR_OFFSET(r1)
-
- /* Save XER */
- mfxer SCRATCH_REGISTER_0
- stw SCRATCH_REGISTER_0, EXC_XER_OFFSET(r1)
-
- /* Save LR */
- mflr SCRATCH_REGISTER_0
- stw SCRATCH_REGISTER_0, EXC_LR_OFFSET(r1)
-
-#ifndef PPC_EXC_CONFIG_BOOKE_ONLY
-
- /* Load MSR bit mask */
- lwz SCRATCH_REGISTER_0, ppc_exc_msr_bits@sdarel(r13)
-
- /*
- * Change the MSR if necessary (MMU, RI), remember decision in
- * non-volatile CR_MSR.
- */
- cmpwi CR_MSR, SCRATCH_REGISTER_0, 0
- bne CR_MSR, wrap_change_msr_naked
-
-wrap_change_msr_done_naked:
-
-#endif /* PPC_EXC_CONFIG_BOOKE_ONLY */
-
- /*
- * Call high level exception handler
- */
-
- /*
- * Get the handler table index from the vector number. We have to
- * discard the exception type. Take only the least significant five
- * bits (= LAST_VALID_EXC + 1) from the vector register. Multiply by
- * four (= size of function pointer).
- */
- rlwinm SCRATCH_REGISTER_1, VECTOR_REGISTER, 2, 25, 29
-
- /* Load handler table address */
- LA SCRATCH_REGISTER_0, ppc_exc_handler_table
-
- /* Load handler address */
- lwzx SCRATCH_REGISTER_0, SCRATCH_REGISTER_0, SCRATCH_REGISTER_1
-
- /*
- * First parameter = exception frame pointer + FRAME_LINK_SPACE
- *
- * We add FRAME_LINK_SPACE to the frame pointer because the high level
- * handler expects a BSP_Exception_frame structure.
- */
- addi r3, r1, FRAME_LINK_SPACE
-
- /*
- * Second parameter = vector number (r4 is the VECTOR_REGISTER)
- *
- * Discard the exception type and store the vector number
- * in the vector register. Take only the least significant
- * five bits (= LAST_VALID_EXC + 1).
- */
- rlwinm VECTOR_REGISTER, VECTOR_REGISTER, 0, 27, 31
-
- /* Call handler */
- mtctr SCRATCH_REGISTER_0
- bctrl
-
-#ifndef PPC_EXC_CONFIG_BOOKE_ONLY
-
- /* Restore MSR? */
- bne CR_MSR, wrap_restore_msr_naked
-
-wrap_restore_msr_done_naked:
-
-#endif /* PPC_EXC_CONFIG_BOOKE_ONLY */
-
- /* Restore XER and CTR */
- lwz SCRATCH_REGISTER_0, EXC_XER_OFFSET(r1)
- lwz SCRATCH_REGISTER_1, EXC_CTR_OFFSET(r1)
- mtxer SCRATCH_REGISTER_0
- mtctr SCRATCH_REGISTER_1
-
- /* Restore CR and LR */
- lwz SCRATCH_REGISTER_0, EXC_CR_OFFSET(r1)
- lwz SCRATCH_REGISTER_1, EXC_LR_OFFSET(r1)
- mtcr SCRATCH_REGISTER_0
- mtlr SCRATCH_REGISTER_1
-
- /* Restore volatile registers */
- lwz r0, GPR0_OFFSET(r1)
- lwz r3, GPR3_OFFSET(r1)
- lwz r8, GPR8_OFFSET(r1)
- lwz r9, GPR9_OFFSET(r1)
- lwz r10, GPR10_OFFSET(r1)
- lwz r11, GPR11_OFFSET(r1)
- lwz r12, GPR12_OFFSET(r1)
-
- /* Restore vector register */
- lwz VECTOR_REGISTER, VECTOR_OFFSET(r1)
-
- /* Restore scratch registers and SRRs */
- lwz SCRATCH_REGISTER_0, SRR0_FRAME_OFFSET(r1)
- lwz SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
- lwz SCRATCH_REGISTER_2, SCRATCH_REGISTER_2_OFFSET(r1)
- mtspr srr0, SCRATCH_REGISTER_0
- lwz SCRATCH_REGISTER_0, SCRATCH_REGISTER_0_OFFSET(r1)
- mtspr srr1, SCRATCH_REGISTER_1
- lwz SCRATCH_REGISTER_1, SCRATCH_REGISTER_1_OFFSET(r1)
-
- /*
- * We restore r1 from the frame rather than just popping (adding to
- * current r1) since the exception handler might have done strange
- * things (e.g. a debugger moving and relocating the stack).
- */
- lwz r1, 0(r1)
-
- /* Return */
- rfi
-
-#ifndef PPC_EXC_CONFIG_BOOKE_ONLY
-
-wrap_change_msr_naked:
-
- mfmsr SCRATCH_REGISTER_1
- or SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, SCRATCH_REGISTER_0
- mtmsr SCRATCH_REGISTER_1
- sync
- isync
- b wrap_change_msr_done_naked
-
-wrap_restore_msr_naked:
-
- lwz SCRATCH_REGISTER_0, ppc_exc_msr_bits@sdarel(r13)
- mfmsr SCRATCH_REGISTER_1
- andc SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, SCRATCH_REGISTER_0
- mtmsr SCRATCH_REGISTER_1
- sync
- isync
- b wrap_restore_msr_done_naked
-
-#endif /* PPC_EXC_CONFIG_BOOKE_ONLY */