summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/nios2/nios2-context-initialize.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2011-10-21 08:44:23 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2011-10-21 08:44:23 +0000
commitd4a95940391a1ee8c1e36a8b10b8800ee526c0e6 (patch)
treedc2dd05a6e7cc7b8d3bcbf53b10d3a4bfa425f7a /cpukit/score/cpu/nios2/nios2-context-initialize.c
parent2011-10-21 Ralf Corsépius <ralf.corsepius@rtems.org> (diff)
downloadrtems-d4a95940391a1ee8c1e36a8b10b8800ee526c0e6.tar.bz2
2011-10-21 Sebastian Huber <sebastian.huber@embedded-brains.de>
* nios2-mpu-configuration.c, nios2-mpu-descriptor.c, nios2-mpu-disable-protected.c, nios2-mpu-reset.c: New files. * Makefile.am: Reflect changes above. * rtems/score/nios2-utility.h, nios2-context-initialize.c: Added support for the memory protection unit (MPU).
Diffstat (limited to 'cpukit/score/cpu/nios2/nios2-context-initialize.c')
-rw-r--r--cpukit/score/cpu/nios2/nios2-context-initialize.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/cpukit/score/cpu/nios2/nios2-context-initialize.c b/cpukit/score/cpu/nios2/nios2-context-initialize.c
index 82e84ffb77..637d39d0cf 100644
--- a/cpukit/score/cpu/nios2/nios2-context-initialize.c
+++ b/cpukit/score/cpu/nios2/nios2-context-initialize.c
@@ -21,6 +21,7 @@
#include <rtems/score/cpu.h>
#include <rtems/score/nios2-utility.h>
+#include <rtems/score/interr.h>
void _CPU_Context_Initialize(
Context_Control *context,
@@ -31,6 +32,7 @@ void _CPU_Context_Initialize(
bool is_fp
)
{
+ const Nios2_MPU_Configuration *mpu_config = _Nios2_MPU_Get_configuration();
uint32_t stack = (uint32_t) stack_area_begin + stack_area_size - 4;
memset(context, 0, sizeof(*context));
@@ -39,4 +41,29 @@ void _CPU_Context_Initialize(
context->status = _Nios2_ISR_Set_level( new_level, NIOS2_STATUS_PIE );
context->sp = stack;
context->ra = (uint32_t) entry_point;
+
+ if ( mpu_config != NULL ) {
+ Nios2_MPU_Region_descriptor desc = {
+ .index = mpu_config->data_index_for_stack_protection,
+ /* FIXME: Brocken stack allocator */
+ .base = (void *) ((int) stack_area_begin & ~((1 << mpu_config->data_region_size_log2) - 1)),
+ .end = (char *) stack_area_begin + stack_area_size,
+ .perm = NIOS2_MPU_DATA_PERM_SVR_READWRITE_USER_NONE,
+ .data = true,
+ .cacheable = mpu_config->enable_data_cache_for_stack,
+ .read = false,
+ .write = true
+ };
+ bool ok = _Nios2_MPU_Setup_region_registers(
+ mpu_config,
+ &desc,
+ &context->stack_mpubase,
+ &context->stack_mpuacc
+ );
+
+ if ( !ok ) {
+ /* The task stack allocator must ensure that the stack area is valid */
+ _Internal_error_Occurred( INTERNAL_ERROR_CORE, false, 0xdeadbeef );
+ }
+ }
}