[PATCH] arm: ARMv7-M statically initialized vector table

Sebastian Huber sebastian.huber at embedded-brains.de
Thu Apr 2 06:13:53 UTC 2020


Statically initialize the ARMv7-M vector table to allow a placement in
ROM with read-only MPU settings.

Change licence to BSD-2-Clause in some files.
---
 bsps/arm/shared/clock/clock-armv7m.c              | 39 ++++++++++++------
 bsps/arm/shared/irq/irq-armv7m.c                  | 50 +++++++++++++++--------
 bsps/arm/shared/start/start.S                     | 10 ++---
 cpukit/score/cpu/arm/armv7m-initialize.c          | 44 ++++++++++++--------
 cpukit/score/cpu/arm/include/rtems/score/armv7m.h |  2 +
 5 files changed, 93 insertions(+), 52 deletions(-)

diff --git a/bsps/arm/shared/clock/clock-armv7m.c b/bsps/arm/shared/clock/clock-armv7m.c
index 7a51690562..255de1ca42 100644
--- a/bsps/arm/shared/clock/clock-armv7m.c
+++ b/bsps/arm/shared/clock/clock-armv7m.c
@@ -1,15 +1,29 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
 /*
- * Copyright (c) 2011, 2018 Sebastian Huber.  All rights reserved.
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Copyright (C) 2011, 2018 Sebastian Huber
  *
- *  embedded brains GmbH
- *  Dornierstr. 4
- *  82178 Puchheim
- *  Germany
- *  <rtems at embedded-brains.de>
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * 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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #include <bsp/clock-armv7m.h>
@@ -29,7 +43,7 @@ static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *base)
   return _ARMV7M_Clock_counter((ARMV7M_Timecounter *) base);
 }
 
-static void _ARMV7M_Clock_handler(void)
+void _ARMV7M_Clock_handler(void)
 {
   _ARMV7M_Interrupt_service_enter();
   Clock_isr(NULL);
@@ -38,10 +52,9 @@ static void _ARMV7M_Clock_handler(void)
 
 static void _ARMV7M_Clock_handler_install(void)
 {
-  _ARMV7M_Set_exception_priority_and_handler(
+  _ARMV7M_Set_exception_priority(
     ARMV7M_VECTOR_SYSTICK,
-    BSP_ARMV7M_SYSTICK_PRIORITY,
-    _ARMV7M_Clock_handler
+    BSP_ARMV7M_SYSTICK_PRIORITY
   );
 }
 
diff --git a/bsps/arm/shared/irq/irq-armv7m.c b/bsps/arm/shared/irq/irq-armv7m.c
index 99c0e373bf..84ebeeb159 100644
--- a/bsps/arm/shared/irq/irq-armv7m.c
+++ b/bsps/arm/shared/irq/irq-armv7m.c
@@ -1,27 +1,41 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
 /*
- * Copyright (c) 2011-2012 Sebastian Huber.  All rights reserved.
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Copyright (C) 2011, 2012 Sebastian Huber
  *
- *  embedded brains GmbH
- *  Obere Lagerstr. 30
- *  82178 Puchheim
- *  Germany
- *  <rtems at embedded-brains.de>
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * 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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <string.h>
-
-#include <rtems/score/armv7m.h>
-
+#include <bsp/irq-generic.h>
 #include <bsp.h>
 #include <bsp/irq.h>
-#include <bsp/irq-generic.h>
 #include <bsp/linker-symbols.h>
 #include <bsp/armv7m-irq.h>
 
+#include <rtems/score/armv7m.h>
+
+#include <string.h>
+
 #ifdef ARM_MULTILIB_ARCH_V7M
 
 void bsp_interrupt_vector_enable(rtems_vector_number vector)
@@ -38,9 +52,10 @@ void bsp_interrupt_vector_disable(rtems_vector_number vector)
 
 rtems_status_code bsp_interrupt_facility_initialize(void)
 {
-  int i;
-  ARMV7M_Exception_handler *vector_table =
-    (ARMV7M_Exception_handler *) bsp_vector_table_begin;
+  ARMV7M_Exception_handler *vector_table;
+  int                       i;
+
+  vector_table = (ARMV7M_Exception_handler *) bsp_vector_table_begin;
 
   if (bsp_vector_table_begin != bsp_start_vector_table_begin) {
     memcpy(
@@ -53,7 +68,6 @@ rtems_status_code bsp_interrupt_facility_initialize(void)
   _ARMV7M_SCB->icsr = ARMV7M_SCB_ICSR_PENDSVCLR | ARMV7M_SCB_ICSR_PENDSTCLR;
 
   for (i = BSP_INTERRUPT_VECTOR_MIN; i <= BSP_INTERRUPT_VECTOR_MAX; ++i) {
-    vector_table [ARMV7M_VECTOR_IRQ(i)] = _ARMV7M_NVIC_Interrupt_dispatch;
     _ARMV7M_NVIC_Clear_enable(i);
     _ARMV7M_NVIC_Clear_pending(i);
     _ARMV7M_NVIC_Set_priority(i, BSP_ARMV7M_IRQ_PRIORITY_DEFAULT);
diff --git a/bsps/arm/shared/start/start.S b/bsps/arm/shared/start/start.S
index e56b07fefe..93590c1c36 100644
--- a/bsps/arm/shared/start/start.S
+++ b/bsps/arm/shared/start/start.S
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2008, 2019 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2008, 2020 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -456,13 +456,13 @@ bsp_start_vector_table_begin:
 	.word	_ARMV7M_Exception_default /* Reserved */
 	.word	_ARMV7M_Exception_default /* Reserved */
 	.word	_ARMV7M_Exception_default /* Reserved */
-	.word	_ARMV7M_Exception_default /* SVC */
+	.word	_ARMV7M_Supervisor_call /* SVC */
 	.word	_ARMV7M_Exception_default /* Debug Monitor */
 	.word	_ARMV7M_Exception_default /* Reserved */
-	.word	_ARMV7M_Exception_default /* PendSV */
-	.word	_ARMV7M_Exception_default /* SysTick */
+	.word	_ARMV7M_Pendable_service_call /* PendSV */
+	.word	_ARMV7M_Clock_handler /* SysTick */
 	.rept	BSP_INTERRUPT_VECTOR_MAX + 1
-	.word	_ARMV7M_Exception_default /* IRQ */
+	.word	_ARMV7M_NVIC_Interrupt_dispatch /* IRQ */
 	.endr
 
 bsp_start_vector_table_end:
diff --git a/cpukit/score/cpu/arm/armv7m-initialize.c b/cpukit/score/cpu/arm/armv7m-initialize.c
index 4f0e0e4fe6..6ec863fa30 100644
--- a/cpukit/score/cpu/arm/armv7m-initialize.c
+++ b/cpukit/score/cpu/arm/armv7m-initialize.c
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
 /**
  * @file
  *
@@ -5,21 +7,33 @@
  */
 
 /*
- * Copyright (c) 2011 Sebastian Huber.  All rights reserved.
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Copyright (C) 2011 Sebastian Huber
  *
- *  embedded brains GmbH
- *  Obere Lagerstr. 30
- *  82178 Puchheim
- *  Germany
- *  <rtems at embedded-brains.de>
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * 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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #ifdef HAVE_CONFIG_H
-  #include "config.h"
+#include "config.h"
 #endif
 
 #include <rtems/score/armv7m.h>
@@ -35,15 +49,13 @@ void _CPU_Initialize( void )
    * also "ARMv7-M Architecture Reference Manual, Issue D" section B1.5.4
    * "Exception priorities and preemption".
    */
-  _ARMV7M_Set_exception_priority_and_handler(
+  _ARMV7M_Set_exception_priority(
     ARMV7M_VECTOR_SVC,
-    ARMV7M_EXCEPTION_PRIORITY_LOWEST,
-    _ARMV7M_Supervisor_call
+    ARMV7M_EXCEPTION_PRIORITY_LOWEST
   );
-  _ARMV7M_Set_exception_priority_and_handler(
+  _ARMV7M_Set_exception_priority(
     ARMV7M_VECTOR_PENDSV,
-    ARMV7M_EXCEPTION_PRIORITY_LOWEST,
-    _ARMV7M_Pendable_service_call
+    ARMV7M_EXCEPTION_PRIORITY_LOWEST
   );
 }
 
diff --git a/cpukit/score/cpu/arm/include/rtems/score/armv7m.h b/cpukit/score/cpu/arm/include/rtems/score/armv7m.h
index a6cc8a34ac..c701e1037c 100644
--- a/cpukit/score/cpu/arm/include/rtems/score/armv7m.h
+++ b/cpukit/score/cpu/arm/include/rtems/score/armv7m.h
@@ -609,6 +609,8 @@ void _ARMV7M_Pendable_service_call( void );
 
 void _ARMV7M_Supervisor_call( void );
 
+void _ARMV7M_Clock_handler( void );
+
 #endif /* ASM */
 
 #endif /* ARM_MULTILIB_ARCH_V7M */
-- 
2.16.4



More information about the devel mailing list