summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-07 14:50:24 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-07 14:51:31 +0200
commit57740ce8a1e2370f7fc29c8bcf634e480f920e2b (patch)
treef29e367cc1991b4b12632cb683d59dd8f7d2d1f8
parentDisable per task variables when SMP is enabled (diff)
downloadrtems-57740ce8a1e2370f7fc29c8bcf634e480f920e2b.tar.bz2
score: Clarify CPU port alignment requirements
-rw-r--r--cpukit/score/cpu/no_cpu/rtems/score/cpu.h16
-rw-r--r--cpukit/score/src/percpuasm.c35
2 files changed, 42 insertions, 9 deletions
diff --git a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
index 0b6c4dac72..c864164667 100644
--- a/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
+++ b/cpukit/score/cpu/no_cpu/rtems/score/cpu.h
@@ -733,7 +733,10 @@ SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
/**
* CPU's worst alignment requirement for data types on a byte boundary. This
- * alignment does not take into account the requirements for the stack.
+ * alignment does not take into account the requirements for the stack. It
+ * must be a power of two greater than or equal to two. The power of two
+ * requirement makes it possible to align values easily using simple bit
+ * operations.
*
* Port Specific Information:
*
@@ -749,12 +752,11 @@ SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
* @ref CPU_ALIGNMENT. If the @ref CPU_ALIGNMENT is strict enough for
* the heap, then this should be set to @ref CPU_ALIGNMENT.
*
- * NOTE: This does not have to be a power of 2 although it should be
- * a multiple of 2 greater than or equal to 2. The requirement
- * to be a multiple of 2 is because the heap uses the least
- * significant field of the front and back flags to indicate
- * that a block is in use or free. So you do not want any odd
- * length blocks really putting length data in that bit.
+ * NOTE: It must be a power of two greater than or equal to two. The
+ * requirement to be a multiple of two is because the heap uses the
+ * least significant field of the front and back flags to indicate that
+ * a block is in use or free. So you do not want any odd length blocks
+ * really putting length data in that bit.
*
* On byte oriented architectures, @ref CPU_HEAP_ALIGNMENT normally will
* have to be greater or equal to than @ref CPU_ALIGNMENT to ensure that
diff --git a/cpukit/score/src/percpuasm.c b/cpukit/score/src/percpuasm.c
index d6bf756cf7..d422a0deb6 100644
--- a/cpukit/score/src/percpuasm.c
+++ b/cpukit/score/src/percpuasm.c
@@ -1,8 +1,8 @@
/*
- * Copyright (c) 2012 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2012-2014 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
- * Obere Lagerstr. 30
+ * Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
@@ -21,6 +21,37 @@
#define _RTEMS_PERCPU_DEFINE_OFFSETS
#include <rtems/score/percpu.h>
+/*
+ * In case a CPU port needs another alignment, then add this here and make sure
+ * it is a power of two greater than or equal to two.
+ */
+RTEMS_STATIC_ASSERT(
+ CPU_ALIGNMENT == 2
+ || CPU_ALIGNMENT == 4
+ || CPU_ALIGNMENT == 8
+ || CPU_ALIGNMENT == 16
+ || CPU_ALIGNMENT == 32,
+ CPU_ALIGNMENT
+);
+
+/*
+ * In case a CPU port needs another heap alignment, then add this here and make
+ * sure it is a power of two greater than or equal to two.
+ */
+RTEMS_STATIC_ASSERT(
+ CPU_HEAP_ALIGNMENT == 2
+ || CPU_HEAP_ALIGNMENT == 4
+ || CPU_HEAP_ALIGNMENT == 8
+ || CPU_HEAP_ALIGNMENT == 16
+ || CPU_HEAP_ALIGNMENT == 32,
+ CPU_HEAP_ALIGNMENT_0
+);
+
+RTEMS_STATIC_ASSERT(
+ CPU_HEAP_ALIGNMENT >= CPU_ALIGNMENT,
+ CPU_HEAP_ALIGNMENT_1
+);
+
RTEMS_STATIC_ASSERT(
sizeof(void *) == CPU_SIZEOF_POINTER,
CPU_SIZEOF_POINTER