summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_initialize.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_initialize.c')
-rw-r--r--c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_initialize.c187
1 files changed, 0 insertions, 187 deletions
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_initialize.c b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_initialize.c
deleted file mode 100644
index 4891ddcaa0..0000000000
--- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/ppc_exc_initialize.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * @file
- *
- * @ingroup ppc_exc
- *
- * @brief PowerPC Exceptions implementation.
- */
-
-/*
- * Copyright (C) 1999 Eric Valette (valette@crf.canon.fr)
- * Canon Centre Recherche France.
- *
- * Copyright (C) 2007 Till Straumann <strauman@slac.stanford.edu>
- *
- * Copyright (C) 2009-2012 embedded brains GmbH.
- *
- * Derived from file "libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c".
- * Derived from file "libcpu/powerpc/new-exceptions/e500_raw_exc_init.c".
- *
- * 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 <rtems.h>
-
-#include <bsp/vectors.h>
-#include <bsp/fatal.h>
-
-uint32_t ppc_exc_cache_wb_check = 1;
-
-#define MTIVPR(prefix) __asm__ volatile ("mtivpr %0" : : "r" (prefix))
-#define MTIVOR(x, vec) __asm__ volatile ("mtivor"#x" %0" : : "r" (vec))
-
-static void ppc_exc_initialize_booke(void *vector_base)
-{
- /* Interupt vector prefix register */
- MTIVPR((uint32_t) vector_base);
-
- if (
- ppc_cpu_is_specific_e200(PPC_e200z0)
- || ppc_cpu_is_specific_e200(PPC_e200z1)
- ) {
- /*
- * These cores have hard wired IVOR registers. An access will case a
- * program exception.
- */
- return;
- }
-
- /* Interupt vector offset registers */
- MTIVOR(0, ppc_exc_vector_address(ASM_BOOKE_CRIT_VECTOR, vector_base));
- MTIVOR(1, ppc_exc_vector_address(ASM_MACH_VECTOR, vector_base));
- MTIVOR(2, ppc_exc_vector_address(ASM_PROT_VECTOR, vector_base));
- MTIVOR(3, ppc_exc_vector_address(ASM_ISI_VECTOR, vector_base));
- MTIVOR(4, ppc_exc_vector_address(ASM_EXT_VECTOR, vector_base));
- MTIVOR(5, ppc_exc_vector_address(ASM_ALIGN_VECTOR, vector_base));
- MTIVOR(6, ppc_exc_vector_address(ASM_PROG_VECTOR, vector_base));
- MTIVOR(7, ppc_exc_vector_address(ASM_FLOAT_VECTOR, vector_base));
- MTIVOR(8, ppc_exc_vector_address(ASM_SYS_VECTOR, vector_base));
- MTIVOR(9, ppc_exc_vector_address(ASM_BOOKE_APU_VECTOR, vector_base));
- MTIVOR(10, ppc_exc_vector_address(ASM_BOOKE_DEC_VECTOR, vector_base));
- MTIVOR(11, ppc_exc_vector_address(ASM_BOOKE_FIT_VECTOR, vector_base));
- MTIVOR(12, ppc_exc_vector_address(ASM_BOOKE_WDOG_VECTOR, vector_base));
- MTIVOR(13, ppc_exc_vector_address(ASM_BOOKE_DTLBMISS_VECTOR, vector_base));
- MTIVOR(14, ppc_exc_vector_address(ASM_BOOKE_ITLBMISS_VECTOR, vector_base));
- MTIVOR(15, ppc_exc_vector_address(ASM_BOOKE_DEBUG_VECTOR, vector_base));
- if (ppc_cpu_is_e200() || ppc_cpu_is_e500()) {
- MTIVOR(32, ppc_exc_vector_address(ASM_E500_SPE_UNAVAILABLE_VECTOR, vector_base));
- MTIVOR(33, ppc_exc_vector_address(ASM_E500_EMB_FP_DATA_VECTOR, vector_base));
- MTIVOR(34, ppc_exc_vector_address(ASM_E500_EMB_FP_ROUND_VECTOR, vector_base));
- }
- if (ppc_cpu_is_specific_e200(PPC_e200z7) || ppc_cpu_is_e500()) {
- MTIVOR(35, ppc_exc_vector_address(ASM_E500_PERFMON_VECTOR, vector_base));
- }
-}
-
-static void ppc_exc_fatal_error(void)
-{
- bsp_fatal(PPC_FATAL_EXCEPTION_INITIALIZATION);
-}
-
-void ppc_exc_initialize_with_vector_base(
- uintptr_t interrupt_stack_begin,
- uintptr_t interrupt_stack_size,
- void *vector_base
-)
-{
- rtems_status_code sc = RTEMS_SUCCESSFUL;
- const ppc_exc_categories *const categories = ppc_exc_current_categories();
- unsigned vector = 0;
- uint32_t sda_base = 0;
- uint32_t r13 = 0;
-
- if (categories == NULL) {
- ppc_exc_fatal_error();
- }
-
- /* Assembly code needs SDA_BASE in r13 (SVR4 or EABI). Make sure
- * early init code put it there.
- */
- __asm__ volatile (
- "lis %0, _SDA_BASE_@h\n"
- "ori %0, %0, _SDA_BASE_@l\n"
- "mr %1, 13\n"
- : "=r" (sda_base), "=r"(r13)
- );
-
- if (sda_base != r13) {
- ppc_exc_fatal_error();
- }
-
- ppc_exc_initialize_interrupt_stack(interrupt_stack_begin, interrupt_stack_size);
-
-#ifndef PPC_EXC_CONFIG_BOOKE_ONLY
-
- /* Use current MMU / RI settings when running C exception handlers */
- ppc_exc_msr_bits = ppc_machine_state_register() & (MSR_DR | MSR_IR | MSR_RI);
-
-#ifdef __ALTIVEC__
- /* Need vector unit enabled to save/restore altivec context */
- ppc_exc_msr_bits |= MSR_VE;
-#endif
-
-#endif /* PPC_EXC_CONFIG_BOOKE_ONLY */
-
- if (ppc_cpu_is_bookE() == PPC_BOOKE_STD || ppc_cpu_is_bookE() == PPC_BOOKE_E500) {
- ppc_exc_initialize_booke(vector_base);
- }
-
- for (vector = 0; vector <= LAST_VALID_EXC; ++vector) {
- ppc_exc_category category = ppc_exc_category_for_vector(categories, vector);
-
- if (category != PPC_EXC_INVALID) {
- void *const vector_address = ppc_exc_vector_address(vector, vector_base);
- uint32_t prologue [16];
- size_t prologue_size = sizeof(prologue);
-
- sc = ppc_exc_make_prologue(
- vector,
- vector_base,
- category,
- prologue,
- &prologue_size
- );
- if (sc != RTEMS_SUCCESSFUL) {
- ppc_exc_fatal_error();
- }
-
- ppc_code_copy(vector_address, prologue, prologue_size);
- }
- }
-
-#ifndef PPC_EXC_CONFIG_BOOKE_ONLY
- /* If we are on a classic PPC with MSR_DR enabled then
- * assert that the mapping for at least this task's
- * stack is write-back-caching enabled (see README/CAVEATS)
- * Do this only if the cache is physically enabled.
- * Since it is not easy to figure that out in a
- * generic way we need help from the BSP: BSPs
- * which run entirely w/o the cache may set
- * ppc_exc_cache_wb_check to zero prior to calling
- * this routine.
- *
- * We run this check only after exception handling is
- * initialized so that we have some chance to get
- * information printed if it fails.
- *
- * Note that it is unsafe to ignore this issue; if
- * the check fails, do NOT disable it unless caches
- * are always physically disabled.
- */
- if (ppc_exc_cache_wb_check && (MSR_DR & ppc_exc_msr_bits)) {
- /* The size of 63 assumes cache lines are at most 32 bytes */
- uint8_t dummy[63];
- uintptr_t p = (uintptr_t) dummy;
- /* If the dcbz instruction raises an alignment exception
- * then the stack is mapped as write-thru or caching-disabled.
- * The low-level code is not capable of dealing with this
- * ATM.
- */
- p = (p + 31U) & ~31U;
- __asm__ volatile ("dcbz 0, %0"::"b" (p));
- /* If we make it thru here then things seem to be OK */
- }
-#endif /* PPC_EXC_CONFIG_BOOKE_ONLY */
-}