[rtems commit] bsp/mpc55xx: Set PPC_EXC_CONFIG_USE_FIXED_HANDLER

Sebastian Huber sebh at rtems.org
Mon Dec 3 12:14:53 UTC 2012


Module:    rtems
Branch:    master
Commit:    3ce66aabb5be97ee0bd216f735e224c317d9667e
Changeset: http://git.rtems.org/rtems/commit/?id=3ce66aabb5be97ee0bd216f735e224c317d9667e

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Nov 19 09:02:12 2012 +0100

bsp/mpc55xx: Set PPC_EXC_CONFIG_USE_FIXED_HANDLER

---

 c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am    |    1 +
 c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac   |    4 ++
 .../libbsp/powerpc/mpc55xxevb/startup/bspstart.c   |    4 ++-
 .../powerpc/mpc55xxevb/startup/exc-vector-base.S   |   18 +++++++++
 c/src/lib/libcpu/powerpc/mpc55xx/irq/irq.c         |   39 +++++++++++++++-----
 5 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am b/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
index 44e1997..fdec136 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/Makefile.am
@@ -69,6 +69,7 @@ libbsp_a_SOURCES += ../../shared/src/stackalloc.c
 libbsp_a_SOURCES += ../shared/src/bsp-start-zero.S
 libbsp_a_SOURCES += ../shared/src/memcpy.c
 libbsp_a_SOURCES += ../shared/src/tictac.c
+libbsp_a_SOURCES += ../shared/src/ppc-exc-handler-table.c
 libbsp_a_SOURCES += startup/bspstart.c
 libbsp_a_SOURCES += startup/bspworkareainit.c
 libbsp_a_SOURCES += startup/exc-vector-base.S
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac b/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
index 091f0b2..38fce34 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/configure.ac
@@ -32,6 +32,10 @@ RTEMS_BSPOPTS_SET_INSTRUCTION_CACHE_ENABLED([gwlcfm],[])
 RTEMS_BSPOPTS_SET_INSTRUCTION_CACHE_ENABLED([*],[1])
 RTEMS_BSPOPTS_HELP_INSTRUCTION_CACHE_ENABLED
 
+RTEMS_BSPOPTS_SET([PPC_EXC_CONFIG_USE_FIXED_HANDLER],[*],[1])
+RTEMS_BSPOPTS_HELP([PPC_EXC_CONFIG_USE_FIXED_HANDLER],
+[use fixed high-level exception handler])
+
 RTEMS_BSPOPTS_SET([BSP_INTERRUPT_HANDLER_TABLE_SIZE],[mpc5643l*],[127])
 RTEMS_BSPOPTS_SET([BSP_INTERRUPT_HANDLER_TABLE_SIZE],[mpc5566*],[127])
 RTEMS_BSPOPTS_SET([BSP_INTERRUPT_HANDLER_TABLE_SIZE],[mpc5674f*],[255])
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c
index b80e24d..d0c3405 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/bspstart.c
@@ -108,7 +108,9 @@ void bsp_start(void)
                 (uintptr_t) bsp_section_work_begin,
                 rtems_configuration_get_interrupt_stack_size()
 	);
-	ppc_exc_set_handler(ASM_ALIGN_VECTOR, ppc_exc_alignment_handler);
+	#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
+		ppc_exc_set_handler(ASM_ALIGN_VECTOR, ppc_exc_alignment_handler);
+	#endif
 
 	/* Initialize interrupts */
 	bsp_interrupt_initialize();
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/exc-vector-base.S b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/exc-vector-base.S
index ed8dcf3..71c7d48 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/exc-vector-base.S
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/exc-vector-base.S
@@ -59,9 +59,15 @@ mpc55xx_exc_vector_base:
 	li	r4, 4
 	b	ppc_exc_wrap_nopush_std
 	stwu	r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
+#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
 	stw	r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
 	li	r4, -32763
+#endif
 	b	ppc_exc_wrap_async_normal
+#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
+	nop
+	nop
+#endif
 	stwu	r1, -EXC_GENERIC_SIZE(r1)
 	stw	r4, GPR4_OFFSET(r1)
 	li	r4, 6
@@ -83,13 +89,25 @@ mpc55xx_exc_vector_base:
 	li	r4, 24
 	b	ppc_exc_wrap_nopush_std
 	stwu	r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
+#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
 	stw	r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
 	li	r4, -32752
+#endif
 	b	ppc_exc_wrap_async_normal
+#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
+	nop
+	nop
+#endif
 	stwu	r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
+#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
 	stw	r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
 	li	r4, -32749
+#endif
 	b	ppc_exc_wrap_async_normal
+#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
+	nop
+	nop
+#endif
 	stw	r1, ppc_exc_lock_crit at sdarel(r13)
 	stw	r4, ppc_exc_vector_register_crit at sdarel(r13)
 	li	r4, -32748
diff --git a/c/src/lib/libcpu/powerpc/mpc55xx/irq/irq.c b/c/src/lib/libcpu/powerpc/mpc55xx/irq/irq.c
index c60a301..024ea80 100644
--- a/c/src/lib/libcpu/powerpc/mpc55xx/irq/irq.c
+++ b/c/src/lib/libcpu/powerpc/mpc55xx/irq/irq.c
@@ -7,12 +7,13 @@
  */
 
 /*
- * Copyright (c) 2008
- * Embedded Brains GmbH
- * Obere Lagerstr. 30
- * D-82178 Puchheim
- * Germany
- * rtems at embedded-brains.de
+ * Copyright (c) 2008-2012 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Obere Lagerstr. 30
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at embedded-brains.de>
  *
  * The license and distribution terms for this file may be
  * found in the file LICENSE in this distribution or at
@@ -112,10 +113,7 @@ rtems_status_code mpc55xx_interrupt_handler_install(
 	}
 }
 
-/**
- * @brief External exception handler.
- */
-static int mpc55xx_external_exception_handler( BSP_Exception_frame *frame, unsigned exception_number)
+static void mpc55xx_interrupt_dispatch(void)
 {
 	/* Acknowlege interrupt request */
 	rtems_vector_number vector = INTC.IACKR.B.INTVEC;
@@ -131,18 +129,39 @@ static int mpc55xx_external_exception_handler( BSP_Exception_frame *frame, unsig
 
 	/* End of interrupt */
 	INTC.EOIR.R = 1;
+}
+
+#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
+
+/**
+ * @brief External exception handler.
+ */
+static int mpc55xx_external_exception_handler( BSP_Exception_frame *frame, unsigned exception_number)
+{
+	mpc55xx_interrupt_dispatch();
 
 	return 0;
 }
 
+#else /* PPC_EXC_CONFIG_USE_FIXED_HANDLER */
+
+void bsp_interrupt_dispatch(void)
+{
+	mpc55xx_interrupt_dispatch();
+}
+
+#endif /* PPC_EXC_CONFIG_USE_FIXED_HANDLER */
+
 rtems_status_code bsp_interrupt_facility_initialize(void)
 {
 	rtems_vector_number vector;
 
+#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
 	/* Install exception handler */
 	if (ppc_exc_set_handler( ASM_EXT_VECTOR, mpc55xx_external_exception_handler)) {
 		return RTEMS_IO_ERROR;
 	}
+#endif
 
 	/* Initialize interrupt controller */
 




More information about the vc mailing list