[rtems commit] bsps/arm: Add .nocache section

Sebastian Huber sebh at rtems.org
Thu Nov 27 09:37:01 UTC 2014


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Nov 25 08:40:20 2014 +0100

bsps/arm: Add .nocache section

This section can be use to provide a cache coherent memory area via
rtems_cache_coherent_add_area().

---

 c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am  |  2 -
 .../arm/altera-cyclone-v/include/nocache-heap.h    | 55 -------------
 .../libbsp/arm/altera-cyclone-v/network/network.c  | 14 +---
 .../lib/libbsp/arm/altera-cyclone-v/preinstall.am  |  4 -
 .../libbsp/arm/altera-cyclone-v/startup/bspstart.c |  7 +-
 .../arm/altera-cyclone-v/startup/linkcmds.altcycv  |  2 +
 .../startup/linkcmds.altcycv_devkit                | 11 ---
 .../arm/altera-cyclone-v/startup/mmu-config.c      |  9 +--
 .../arm/altera-cyclone-v/startup/nocache-heap.c    | 89 ----------------------
 .../lib/libbsp/arm/beagle/startup/linkcmds.beagle  |  2 +
 c/src/lib/libbsp/arm/csb336/startup/linkcmds       |  2 +
 .../lib/libbsp/arm/csb337/startup/linkcmds.csb337  |  2 +
 .../lib/libbsp/arm/csb337/startup/linkcmds.csb637  |  2 +
 c/src/lib/libbsp/arm/edb7312/startup/linkcmds      |  2 +
 c/src/lib/libbsp/arm/gdbarmsim/startup/linkcmds    |  2 +
 c/src/lib/libbsp/arm/gp32/startup/linkcmds         |  2 +
 c/src/lib/libbsp/arm/gumstix/startup/linkcmds      |  2 +
 .../libbsp/arm/lm3s69xx/startup/linkcmds.lm3s3749  |  2 +
 .../libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965  |  2 +
 .../arm/lm3s69xx/startup/linkcmds.lm3s6965_qemu    |  2 +
 .../libbsp/arm/lm3s69xx/startup/linkcmds.lm4f120   |  2 +
 .../arm/lpc176x/startup/linkcmds.lpc1768_mbed      |  2 +
 .../lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram  |  2 +
 .../startup/linkcmds.lpc1768_mbed_ahb_ram_eth      |  2 +
 .../arm/lpc24xx/startup/linkcmds.lpc17xx_ea_ram    |  2 +
 .../lpc24xx/startup/linkcmds.lpc17xx_ea_rom_int    |  2 +
 .../lpc24xx/startup/linkcmds.lpc17xx_plx800_ram    |  2 +
 .../startup/linkcmds.lpc17xx_plx800_rom_int        |  2 +
 .../libbsp/arm/lpc24xx/startup/linkcmds.lpc2362    |  2 +
 .../arm/lpc24xx/startup/linkcmds.lpc23xx_tli800    |  2 +
 .../libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea |  2 +
 .../arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram   |  2 +
 .../lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext   |  2 +
 .../lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int   |  2 +
 .../lpc24xx/startup/linkcmds.lpc24xx_plx800_ram    |  2 +
 .../startup/linkcmds.lpc24xx_plx800_rom_int        |  2 +
 .../arm/lpc32xx/startup/linkcmds.lpc32xx_mzx       |  2 +
 .../lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_1   |  2 +
 .../lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_2   |  2 +
 .../arm/lpc32xx/startup/linkcmds.lpc32xx_phycore   |  2 +
 c/src/lib/libbsp/arm/nds/startup/linkcmds          |  2 +
 c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds  |  2 +
 .../startup/linkcmds.realview_pbx_a9_qemu          |  2 +
 c/src/lib/libbsp/arm/rtl22xx/startup/linkcmds      |  2 +
 .../lib/libbsp/arm/shared/include/arm-cp15-start.h |  4 +
 .../lib/libbsp/arm/shared/include/linker-symbols.h | 14 +++-
 c/src/lib/libbsp/arm/shared/startup/linkcmds.base  | 13 ++++
 c/src/lib/libbsp/arm/smdk2410/startup/linkcmds     |  2 +
 .../arm/stm32f4/startup/linkcmds.stm32f105rc       |  2 +
 .../libbsp/arm/stm32f4/startup/linkcmds.stm32f4    |  2 +
 .../arm/tms570/startup/linkcmds.tms570ls3137_hdk   |  2 +
 .../startup/linkcmds.tms570ls3137_hdk_intram       |  2 +
 .../tms570/startup/linkcmds.tms570ls3137_hdk_sdram |  2 +
 c/src/lib/libbsp/arm/xilinx-zynq/configure.ac      |  4 +
 .../lib/libbsp/arm/xilinx-zynq/startup/bspstart.c  |  5 ++
 .../lib/libbsp/arm/xilinx-zynq/startup/linkcmds.in |  5 +-
 56 files changed, 136 insertions(+), 184 deletions(-)

diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
index 3e02200..6afe681 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/Makefile.am
@@ -47,7 +47,6 @@ include_bsp_HEADERS += ../shared/include/arm-gic-regs.h
 include_bsp_HEADERS += ../shared/include/arm-gic-tm27.h
 include_bsp_HEADERS += ../shared/include/arm-release-id.h
 include_bsp_HEADERS += include/irq.h
-include_bsp_HEADERS += include/nocache-heap.h
 
 # Altera hwlib
 include_bsp_HEADERS += hwlib/include/alt_16550_uart.h
@@ -171,7 +170,6 @@ libbsp_a_SOURCES += ../shared/arm-cp15-set-ttb-entries.c
 libbsp_a_SOURCES += startup/bspreset.c
 libbsp_a_SOURCES += startup/bspstart.c
 libbsp_a_SOURCES += startup/bspstarthooks.c
-libbsp_a_SOURCES += startup/nocache-heap.c
 libbsp_a_SOURCES += startup/mmu-config.c
 if HAS_SMP
 libbsp_a_SOURCES += ../shared/arm-a9mpcore-smp.c
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/include/nocache-heap.h b/c/src/lib/libbsp/arm/altera-cyclone-v/include/nocache-heap.h
deleted file mode 100644
index 73f56f3..0000000
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/include/nocache-heap.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * @file
- *
- * @brief Heap handling for uncached RAM
- */
-
-/*
- * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
- *
- *  embedded brains GmbH
- *  Dornierstr. 4
- *  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
- * http://www.rtems.org/license/LICENSE.
- */
-
-#ifndef NOCACHE_HEAP_H_
-#define NOCACHE_HEAP_H_
-
-#include <stddef.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/** @brief Initialize nocache heap.
- *
- * Initializes a heap for uncached RAM
- */
-void altera_cyclone_v_nocache_init_heap( void );
-
-/** @brief Nocache alloc.
- *
- * Allocate memory from uncached heap.
- * @param   size  Number of bytes to be allocated.
- * @returns  Pointer to the allocated memory.
- */
-void *altera_cyclone_v_nocache_malloc( const size_t size );
-
-/** @brief Nocache free.
- *
- * Release memory from uncached heap.
- * @param ptr Address of the memory to be released.
- */
-void altera_cyclone_v_nocache_free( void *ptr );
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* NOCACHE_HEAP_H_ */
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/network/network.c b/c/src/lib/libbsp/arm/altera-cyclone-v/network/network.c
index 43c95cd..28596cf 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/network/network.c
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/network/network.c
@@ -38,7 +38,6 @@
 #include <bsp/hwlib.h>
 #include <bsp/alt_clock_manager.h>
 #include <bsp/alt_generalpurpose_io.h>
-#include <bsp/nocache-heap.h>
 #include "socal/alt_rstmgr.h"
 #include "socal/alt_sysmgr.h"
 #include "socal/hps.h"
@@ -1032,7 +1031,7 @@ static int network_if_mem_alloc_nocache(
   assert( memory != NULL );
 
   if ( memory != NULL ) {
-    *memory = altera_cyclone_v_nocache_malloc( size );
+    *memory = rtems_cache_coherent_allocate( size, 0, 0 );
 
     if ( *memory != NULL ) {
       eno = 0;
@@ -1057,18 +1056,11 @@ static int network_if_mem_free_nocache(
   void *arg,
   void *memory )
 {
-  int eno = EINVAL;
-
   (void) arg;
 
-  assert( memory != NULL );
+  free( memory );
 
-  if ( memory != NULL ) {
-    altera_cyclone_v_nocache_free( memory );
-    eno = 0;
-  }
-
-  return eno;
+  return 0;
 }
 
 /**
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/preinstall.am b/c/src/lib/libbsp/arm/altera-cyclone-v/preinstall.am
index 8fe547e..8ed1b5e 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/preinstall.am
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/preinstall.am
@@ -135,10 +135,6 @@ $(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h
 
-$(PROJECT_INCLUDE)/bsp/nocache-heap.h: include/nocache-heap.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
-	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/nocache-heap.h
-PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/nocache-heap.h
-
 $(PROJECT_INCLUDE)/bsp/alt_16550_uart.h: hwlib/include/alt_16550_uart.h $(PROJECT_INCLUDE)/bsp/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/alt_16550_uart.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/alt_16550_uart.h
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspstart.c b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspstart.c
index 85eadbf..52e535c 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspstart.c
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/bspstart.c
@@ -15,11 +15,14 @@
 #include <bsp/bootcard.h>
 #include <bsp/arm-a9mpcore-clock.h>
 #include <bsp/irq-generic.h>
-#include <bsp/nocache-heap.h>
+#include <bsp/linker-symbols.h>
 
 void bsp_start( void )
 {
   a9mpcore_clock_initialize_early();
   bsp_interrupt_initialize();
-  altera_cyclone_v_nocache_init_heap();
+  rtems_cache_coherent_add_area(
+    bsp_nocache_heap_begin,
+    (uintptr_t) bsp_nocache_heap_size
+  );
 }
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv
index da4275f..bea6df1 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv
@@ -13,6 +13,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
 REGION_ALIAS ("REGION_BSS",            RAM);
 REGION_ALIAS ("REGION_WORK",           RAM);
 REGION_ALIAS ("REGION_STACK",          RAM);
+REGION_ALIAS ("REGION_NOCACHE",        NOCACHE);
+REGION_ALIAS ("REGION_NOCACHE_LOAD",   NOCACHE);
 
 bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv_devkit b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv_devkit
index 0e0c38e..c36b3ce 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv_devkit
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/linkcmds.altcycv_devkit
@@ -4,15 +4,4 @@ MEMORY {
    RAM     : ORIGIN = 0x00300000, LENGTH = 1024M - 1M - 1M - 1M
 }
 
-SECTIONS {
-  .nocache (NOLOAD) : {
-    bsp_section_nocache_begin = .;
-    *(SORT(.bsp_nocache*))
-    bsp_section_nocache_end = .;
-  } > NOCACHE AT > NOCACHE
-  bsp_section_nocache_size = bsp_section_nocache_end - bsp_section_nocache_begin;
-  bsp_section_nocache_load_begin = LOADADDR (.nocache);
-  bsp_section_nocache_load_end = bsp_section_nocache_load_begin + bsp_section_nocache_size;
-}
-
 INCLUDE linkcmds.altcycv
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/mmu-config.c b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/mmu-config.c
index 98b4ac8..9d56e5c 100644
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/mmu-config.c
+++ b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/mmu-config.c
@@ -14,16 +14,9 @@
 
 #include <bsp/arm-cp15-start.h>
 
-LINKER_SYMBOL(bsp_section_nocache_end);
-LINKER_SYMBOL(bsp_section_nocache_begin);
-
 const arm_cp15_start_section_config arm_cp15_start_mmu_config_table[] = {
   ARMV7_CP15_START_DEFAULT_SECTIONS,
-  {
-    .begin = (uint32_t) bsp_section_nocache_begin,
-    .end   = (uint32_t) bsp_section_nocache_end,
-    .flags = ARMV7_MMU_DATA_READ_WRITE
-  }, { /* Periphery area */
+  { /* Periphery area */
     .begin = 0xFC000000U,
     .end   = 0x00000000U,
     .flags = ARMV7_MMU_DEVICE
diff --git a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/nocache-heap.c b/c/src/lib/libbsp/arm/altera-cyclone-v/startup/nocache-heap.c
deleted file mode 100644
index ae2faef..0000000
--- a/c/src/lib/libbsp/arm/altera-cyclone-v/startup/nocache-heap.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/**
- * @file
- *
- * @brief Heap handling for uncached RAM
- */
-
-/*
- * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
- *
- *  embedded brains GmbH
- *  Dornierstr. 4
- *  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
- * http://www.rtems.org/license/LICENSE.
- */
-
-#include <assert.h>
-#include <bsp/linker-symbols.h>
-#include <bsp/nocache-heap.h>
-#include <rtems/score/heapimpl.h>
-#include <rtems/score/apimutex.h>
-
-/** @brief Uncached RAM pool
- *
- * Allocate the whole bsp_nocache for the nocache heap */
-static char nocache_pool[1024 * 1024]
-  __attribute__( ( section( ".bsp_nocache" ) ) );
-
-/** @brief Nocache heap
- *
- * Heap control for the uncached RAM heap */
-static Heap_Control nocache_heap;
-
-/** @brief Init nocache heap
- *
- * Constructor for the uncached RAM heap
- * @returns 0 on succuss, error code from errno.h on failure
- */
-void altera_cyclone_v_nocache_init_heap( void )
-{
-  uintptr_t heap_status = 0;
-
-  heap_status = _Heap_Initialize(
-    &nocache_heap,
-    &nocache_pool[0],
-    sizeof( nocache_pool ),
-    0
-    );
-  assert( heap_status != 0 );
-}
-
-/** @brief Allocate uncached RAM
- *
- * Allocates RAM from the uncached heap
- * @param size  Number of bytes to be allocated
- * @returns  Pointer to the allocated RAM
- */
-void *altera_cyclone_v_nocache_malloc( const size_t size )
-{
-  void* ret = NULL;
-
-  _RTEMS_Lock_allocator();
-  ret = _Heap_Allocate( &nocache_heap, size );
-  _RTEMS_Unlock_allocator();
-
-  return ret;
-}
-
-/** @brief Free uncached RAM
- *
- * Releases RAM from the uncached heap
- * @param ptr Address of the RAM to be released
- */
-void altera_cyclone_v_nocache_free( void *ptr )
-{
-  if ( ptr != NULL ) {
-    bool ok;
-
-    _RTEMS_Lock_allocator();
-    ok = _Heap_Free( &nocache_heap, ptr );
-    _RTEMS_Unlock_allocator();
-
-    assert( ok );
-  }
-}
diff --git a/c/src/lib/libbsp/arm/beagle/startup/linkcmds.beagle b/c/src/lib/libbsp/arm/beagle/startup/linkcmds.beagle
index 93f1a49..20ea3eb 100644
--- a/c/src/lib/libbsp/arm/beagle/startup/linkcmds.beagle
+++ b/c/src/lib/libbsp/arm/beagle/startup/linkcmds.beagle
@@ -30,6 +30,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
 REGION_ALIAS ("REGION_BSS",            RAM);
 REGION_ALIAS ("REGION_WORK",           RAM);
 REGION_ALIAS ("REGION_STACK",          RAM);
+REGION_ALIAS ("REGION_NOCACHE",        RAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD",   RAM);
 
 bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
diff --git a/c/src/lib/libbsp/arm/csb336/startup/linkcmds b/c/src/lib/libbsp/arm/csb336/startup/linkcmds
index 040619a..2f6f8bd 100644
--- a/c/src/lib/libbsp/arm/csb336/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/csb336/startup/linkcmds
@@ -19,6 +19,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 _ttbl_base = ORIGIN (SDRAM_MMU);
 
diff --git a/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb337 b/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb337
index 727e49c..f59a33c 100644
--- a/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb337
+++ b/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb337
@@ -19,6 +19,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 _ttbl_base = ORIGIN (SDRAM_MMU);
 
diff --git a/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb637 b/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb637
index 32c199e..91a34b7 100644
--- a/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb637
+++ b/c/src/lib/libbsp/arm/csb337/startup/linkcmds.csb637
@@ -19,6 +19,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 _ttbl_base = ORIGIN (SDRAM_MMU);
 
diff --git a/c/src/lib/libbsp/arm/edb7312/startup/linkcmds b/c/src/lib/libbsp/arm/edb7312/startup/linkcmds
index f0a12a7..a0afc0a 100644
--- a/c/src/lib/libbsp/arm/edb7312/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/edb7312/startup/linkcmds
@@ -17,6 +17,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 bsp_vector_table_in_start_section = 1;
 
diff --git a/c/src/lib/libbsp/arm/gdbarmsim/startup/linkcmds b/c/src/lib/libbsp/arm/gdbarmsim/startup/linkcmds
index 45b0f75..536dbf5 100644
--- a/c/src/lib/libbsp/arm/gdbarmsim/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/gdbarmsim/startup/linkcmds
@@ -17,5 +17,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
 REGION_ALIAS ("REGION_BSS", RAM);
 REGION_ALIAS ("REGION_WORK", RAM);
 REGION_ALIAS ("REGION_STACK", RAM);
+REGION_ALIAS ("REGION_NOCACHE", RAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/gp32/startup/linkcmds b/c/src/lib/libbsp/arm/gp32/startup/linkcmds
index d705a2b..6fcbe1a 100644
--- a/c/src/lib/libbsp/arm/gp32/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/gp32/startup/linkcmds
@@ -18,6 +18,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 _ttbl_base = ORIGIN (SDRAM_MMU);
 
diff --git a/c/src/lib/libbsp/arm/gumstix/startup/linkcmds b/c/src/lib/libbsp/arm/gumstix/startup/linkcmds
index 84c5cca..08cb2fc 100644
--- a/c/src/lib/libbsp/arm/gumstix/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/gumstix/startup/linkcmds
@@ -19,6 +19,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 _ttbl_base = ORIGIN (SDRAM_MMU);
 
diff --git a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s3749 b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s3749
index acfddc7..ff165c7 100644
--- a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s3749
+++ b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s3749
@@ -24,5 +24,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965 b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965
index 573c9ff..02d2487 100644
--- a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965
+++ b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965
@@ -24,5 +24,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965_qemu b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965_qemu
index 72c06a8..a4d3a19 100644
--- a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965_qemu
+++ b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm3s6965_qemu
@@ -24,5 +24,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm4f120 b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm4f120
index fe19ff3..e995a3d 100644
--- a/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm4f120
+++ b/c/src/lib/libbsp/arm/lm3s69xx/startup/linkcmds.lm4f120
@@ -24,5 +24,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed b/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed
index d4a20d2..133d2f4 100644
--- a/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed
+++ b/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed
@@ -20,6 +20,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 1024;
 bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
diff --git a/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram b/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram
index 0cd0ee1..75bdd75 100644
--- a/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram
+++ b/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram
@@ -21,6 +21,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_AHB);
 REGION_ALIAS ("REGION_STACK", RAM_AHB);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 1024;
 bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
diff --git a/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram_eth b/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram_eth
index eecb6b1..7d91d8a 100644
--- a/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram_eth
+++ b/c/src/lib/libbsp/arm/lpc176x/startup/linkcmds.lpc1768_mbed_ahb_ram_eth
@@ -23,6 +23,8 @@ REGION_ALIAS ("REGION_BSS", RAM_AHB1);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
 REGION_ALIAS ("REGION_ETH", RAM_AHB2);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 1024;
 bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_ram b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_ram
index 79065bb..d986261 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_ram
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_ram
@@ -21,5 +21,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_rom_int b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_rom_int
index bae5dc8..db8c27f 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_rom_int
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_ea_rom_int
@@ -21,5 +21,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_EXT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_EXT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_EXT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_ram b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_ram
index 1f9e6b3..e507877 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_ram
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_ram
@@ -27,5 +27,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_rom_int b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_rom_int
index 02750e7..2ae0a58 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_rom_int
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc17xx_plx800_rom_int
@@ -27,5 +27,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362 b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362
index fec6a25..e5bae18 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc2362
@@ -56,6 +56,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 lpc24xx_region_heap_0_begin = ORIGIN (RAM_ETH);
 lpc24xx_region_heap_0_size = LENGTH (RAM_ETH);
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800 b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800
index 3f09763..697b040 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc23xx_tli800
@@ -60,6 +60,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 lpc24xx_region_heap_0_begin = ORIGIN (RAM_ETH);
 lpc24xx_region_heap_0_size = LENGTH (RAM_ETH);
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea
index f7bced5..80b1e13 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ea
@@ -53,5 +53,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram
index e77e2ec..9f421f3 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_ram
@@ -54,5 +54,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext
index 45aee50..7618a34 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_ext
@@ -58,5 +58,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_BOOT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int
index 0f87d53..47b79e7 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_ncs_rom_int
@@ -58,5 +58,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_ram b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_ram
index 9d39f8d..2dcc6d2 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_ram
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_ram
@@ -26,5 +26,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_rom_int b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_rom_int
index 851c416..f00c1d8 100644
--- a/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_rom_int
+++ b/c/src/lib/libbsp/arm/lpc24xx/startup/linkcmds.lpc24xx_plx800_rom_int
@@ -26,5 +26,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx
index a466ecf..127a82f 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx
@@ -56,6 +56,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 lpc32xx_scratch_area = ORIGIN (RAM_SCRATCH);
 
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_1 b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_1
index f5f8cb6..0f944b2 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_1
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_1
@@ -56,6 +56,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 lpc32xx_scratch_area = ORIGIN (RAM_SCRATCH);
 
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_2 b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_2
index bc457a3..2aa8c34 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_2
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_mzx_stage_2
@@ -57,6 +57,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 lpc32xx_scratch_area = ORIGIN (RAM_SCRATCH);
 
diff --git a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore
index b094fb1..d874c46 100644
--- a/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore
+++ b/c/src/lib/libbsp/arm/lpc32xx/startup/linkcmds.lpc32xx_phycore
@@ -57,6 +57,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
diff --git a/c/src/lib/libbsp/arm/nds/startup/linkcmds b/c/src/lib/libbsp/arm/nds/startup/linkcmds
index 964bb6c..5d38b65 100644
--- a/c/src/lib/libbsp/arm/nds/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/nds/startup/linkcmds
@@ -20,6 +20,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", EWRAM);
 REGION_ALIAS ("REGION_BSS", EWRAM);
 REGION_ALIAS ("REGION_WORK", EWRAM);
 REGION_ALIAS ("REGION_STACK", EWRAM);
+REGION_ALIAS ("REGION_NOCACHE", EWRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", EWRAM);
 
 __dtcm_top = ORIGIN (DTCM) + LENGTH (DTCM);
 __irq_flags = __dtcm_top - 0x08;
diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds b/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds
index 7b21235..f1ad11c 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds
@@ -56,6 +56,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
 REGION_ALIAS ("REGION_BSS", RAM);
 REGION_ALIAS ("REGION_WORK", RAM);
 REGION_ALIAS ("REGION_STACK", RAM);
+REGION_ALIAS ("REGION_NOCACHE", RAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM);
 
 bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
diff --git a/c/src/lib/libbsp/arm/realview-pbx-a9/startup/linkcmds.realview_pbx_a9_qemu b/c/src/lib/libbsp/arm/realview-pbx-a9/startup/linkcmds.realview_pbx_a9_qemu
index ce34d77..5251c48 100644
--- a/c/src/lib/libbsp/arm/realview-pbx-a9/startup/linkcmds.realview_pbx_a9_qemu
+++ b/c/src/lib/libbsp/arm/realview-pbx-a9/startup/linkcmds.realview_pbx_a9_qemu
@@ -19,6 +19,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
 REGION_ALIAS ("REGION_BSS", RAM);
 REGION_ALIAS ("REGION_WORK", RAM);
 REGION_ALIAS ("REGION_STACK", RAM);
+REGION_ALIAS ("REGION_NOCACHE", RAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM);
 
 bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;
diff --git a/c/src/lib/libbsp/arm/rtl22xx/startup/linkcmds b/c/src/lib/libbsp/arm/rtl22xx/startup/linkcmds
index 0d5625c..d39dcb1 100644
--- a/c/src/lib/libbsp/arm/rtl22xx/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/rtl22xx/startup/linkcmds
@@ -18,5 +18,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 INCLUDE linkcmds.armv4
diff --git a/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h b/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h
index 7d5fd0f..c70ebf9 100644
--- a/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h
+++ b/c/src/lib/libbsp/arm/shared/include/arm-cp15-start.h
@@ -80,6 +80,10 @@ typedef struct {
     .begin = (uint32_t) bsp_section_stack_begin, \
     .end = (uint32_t) bsp_section_stack_end, \
     .flags = ARMV7_MMU_DATA_READ_WRITE_CACHED \
+  }, { \
+    .begin = (uint32_t) bsp_section_nocache_begin, \
+    .end = (uint32_t) bsp_section_nocache_end, \
+    .flags = ARMV7_MMU_DEVICE \
   }
 
 BSP_START_DATA_SECTION extern const arm_cp15_start_section_config
diff --git a/c/src/lib/libbsp/arm/shared/include/linker-symbols.h b/c/src/lib/libbsp/arm/shared/include/linker-symbols.h
index ec7fed2..8bfa5d1 100644
--- a/c/src/lib/libbsp/arm/shared/include/linker-symbols.h
+++ b/c/src/lib/libbsp/arm/shared/include/linker-symbols.h
@@ -7,7 +7,7 @@
  */
 
 /*
- * Copyright (c) 2008-2013 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2008-2014 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
  *  Dornierstr. 4
@@ -113,6 +113,12 @@ LINKER_SYMBOL(bsp_section_stack_begin)
 LINKER_SYMBOL(bsp_section_stack_end)
 LINKER_SYMBOL(bsp_section_stack_size)
 
+LINKER_SYMBOL(bsp_section_nocache_begin)
+LINKER_SYMBOL(bsp_section_nocache_end)
+LINKER_SYMBOL(bsp_section_nocache_size)
+LINKER_SYMBOL(bsp_section_nocache_load_begin)
+LINKER_SYMBOL(bsp_section_nocache_load_end)
+
 LINKER_SYMBOL(bsp_vector_table_begin)
 LINKER_SYMBOL(bsp_vector_table_end)
 LINKER_SYMBOL(bsp_vector_table_size)
@@ -124,10 +130,16 @@ LINKER_SYMBOL(bsp_start_vector_table_size)
 LINKER_SYMBOL(bsp_translation_table_base)
 LINKER_SYMBOL(bsp_translation_table_end)
 
+LINKER_SYMBOL(bsp_nocache_heap_begin)
+LINKER_SYMBOL(bsp_nocache_heap_end)
+LINKER_SYMBOL(bsp_nocache_heap_size)
+
 #define BSP_FAST_TEXT_SECTION __attribute__((section(".bsp_fast_text")))
 
 #define BSP_FAST_DATA_SECTION __attribute__((section(".bsp_fast_data")))
 
+#define BSP_NOCACHE_SECTION __attribute__((section(".bsp_nocache")))
+
 LINKER_SYMBOL(bsp_processor_count)
 
 /** @} */
diff --git a/c/src/lib/libbsp/arm/shared/startup/linkcmds.base b/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
index 268e88a..8a653e9 100644
--- a/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
+++ b/c/src/lib/libbsp/arm/shared/startup/linkcmds.base
@@ -397,6 +397,19 @@ SECTIONS {
 	} > REGION_STACK AT > REGION_STACK
 	bsp_section_stack_size = bsp_section_stack_end - bsp_section_stack_begin;
 
+	.nocache : ALIGN_WITH_INPUT {
+		bsp_section_nocache_begin = .;
+		*(SORT(.bsp_nocache*))
+		bsp_nocache_heap_begin = .;
+		. += ORIGIN (REGION_NOCACHE) + LENGTH (REGION_NOCACHE) - ABSOLUTE (.);
+		bsp_nocache_heap_end = .;
+		bsp_section_nocache_end = .;
+	} > REGION_NOCACHE AT > REGION_NOCACHE_LOAD
+	bsp_nocache_heap_size = bsp_nocache_heap_end - bsp_nocache_heap_begin;
+	bsp_section_nocache_size = bsp_section_nocache_end - bsp_section_nocache_begin;
+	bsp_section_nocache_load_begin = LOADADDR (.nocache);
+	bsp_section_nocache_load_end = bsp_section_nocache_load_begin + bsp_section_nocache_size;
+
 	/* FIXME */
 	RamBase = ORIGIN (REGION_WORK);
 	RamSize = LENGTH (REGION_WORK);
diff --git a/c/src/lib/libbsp/arm/smdk2410/startup/linkcmds b/c/src/lib/libbsp/arm/smdk2410/startup/linkcmds
index 2a14c80..9cd6888 100644
--- a/c/src/lib/libbsp/arm/smdk2410/startup/linkcmds
+++ b/c/src/lib/libbsp/arm/smdk2410/startup/linkcmds
@@ -18,6 +18,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", SDRAM);
 REGION_ALIAS ("REGION_BSS", SDRAM);
 REGION_ALIAS ("REGION_WORK", SDRAM);
 REGION_ALIAS ("REGION_STACK", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE", SDRAM);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", SDRAM);
 
 _ttbl_base = ORIGIN (SDRAM_MMU);
 
diff --git a/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f105rc b/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f105rc
index 58e8094..d3ea200 100644
--- a/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f105rc
+++ b/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f105rc
@@ -18,5 +18,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f4 b/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f4
index 8219505..1d16cfd 100644
--- a/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f4
+++ b/c/src/lib/libbsp/arm/stm32f4/startup/linkcmds.stm32f4
@@ -18,5 +18,7 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 INCLUDE linkcmds.armv7m
diff --git a/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk b/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk
index e02dcd6..5ecd4ed 100644
--- a/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk
+++ b/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk
@@ -20,6 +20,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", ROM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 1024;
 bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
diff --git a/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_intram b/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_intram
index 19bb7b2..dd40fe2 100644
--- a/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_intram
+++ b/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_intram
@@ -21,6 +21,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_INT);
 REGION_ALIAS ("REGION_BSS", RAM_INT);
 REGION_ALIAS ("REGION_WORK", RAM_INT);
 REGION_ALIAS ("REGION_STACK", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
 
 bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 1024;
 bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
diff --git a/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_sdram b/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_sdram
index 110179f..cb628c6 100644
--- a/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_sdram
+++ b/c/src/lib/libbsp/arm/tms570/startup/linkcmds.tms570ls3137_hdk_sdram
@@ -20,6 +20,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM_EXT);
 REGION_ALIAS ("REGION_BSS", RAM_EXT);
 REGION_ALIAS ("REGION_WORK", RAM_EXT);
 REGION_ALIAS ("REGION_STACK", RAM_EXT);
+REGION_ALIAS ("REGION_NOCACHE", RAM_EXT);
+REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_EXT);
 
 bsp_stack_main_size = DEFINED (bsp_stack_main_size) ? bsp_stack_main_size : 1024;
 bsp_stack_main_size = ALIGN (bsp_stack_main_size, bsp_stack_align);
diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac b/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac
index 8f47f2f..ccc9050 100644
--- a/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac
+++ b/c/src/lib/libbsp/arm/xilinx-zynq/configure.ac
@@ -77,6 +77,9 @@ RTEMS_BSPOPTS_SET([BSP_ZYNQ_RAM_LENGTH],[xilinx_zynq_zedboard],[512M])
 RTEMS_BSPOPTS_SET([BSP_ZYNQ_RAM_LENGTH],[*],[256M])
 RTEMS_BSPOPTS_HELP([BSP_ZYNQ_RAM_LENGTH],[override a BSP's default RAM length])
 
+RTEMS_BSPOPTS_SET([BSP_ZYNQ_NOCACHE_LENGTH],[*],[1M])
+RTEMS_BSPOPTS_HELP([BSP_ZYNQ_NOCACHE_LENGTH],[length of nocache RAM region])
+
 AS_IF([test "x${RTEMS_BSP}" == xxilinx_zynq_a9_qemu],
       [ZYNQ_RAM_ORIGIN="0x00000000"
        ZYNQ_RAM_MMU="0x0fffc000"
@@ -133,6 +136,7 @@ ZYNQ_LINKCMD([ZYNQ_RAM_MMU],[MMU region origin],[${ZYNQ_RAM_MMU}])
 ZYNQ_LINKCMD([ZYNQ_RAM_MMU_LENGTH],[MMU region length],[${ZYNQ_RAM_MMU_LENGTH}])
 ZYNQ_LINKCMD([ZYNQ_RAM_ORIGIN_AVAILABLE],[origin of available RAM],[${ZYNQ_RAM_ORIGIN_AVAILABLE}])
 ZYNQ_LINKCMD([ZYNQ_RAM_LENGTH_AVAILABLE],[length of available RAM],[${ZYNQ_RAM_LENGTH_AVAILABLE}])
+ZYNQ_LINKCMD([ZYNQ_RAM_NOCACHE_LENGTH],[length of nocache RAM region],[${BSP_ZYNQ_NOCACHE_LENGTH}])
 ZYNQ_LINKCMD([ZYNQ_RAM_INT_0_ORIGIN],[internal 0 RAM region origin],[${ZYNQ_RAM_INT_0_ORIGIN}])
 ZYNQ_LINKCMD([ZYNQ_RAM_INT_0_LENGTH],[internal 0 RAM region length],[${ZYNQ_RAM_INT_0_LENGTH}])
 ZYNQ_LINKCMD([ZYNQ_RAM_INT_1_ORIGIN],[internal 1 RAM region origin],[${ZYNQ_RAM_INT_1_ORIGIN}])
diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspstart.c b/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspstart.c
index ad66640..62511e7 100644
--- a/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspstart.c
+++ b/c/src/lib/libbsp/arm/xilinx-zynq/startup/bspstart.c
@@ -16,6 +16,7 @@
 #include <bsp/bootcard.h>
 #include <bsp/arm-a9mpcore-clock.h>
 #include <bsp/irq-generic.h>
+#include <bsp/linker-symbols.h>
 
 __attribute__ ((weak)) uint32_t zynq_clock_cpu_1x(void)
 {
@@ -26,4 +27,8 @@ void bsp_start(void)
 {
   a9mpcore_clock_initialize_early();
   bsp_interrupt_initialize();
+  rtems_cache_coherent_add_area(
+    bsp_nocache_heap_begin,
+    (uintptr_t) bsp_nocache_heap_size
+  );
 }
diff --git a/c/src/lib/libbsp/arm/xilinx-zynq/startup/linkcmds.in b/c/src/lib/libbsp/arm/xilinx-zynq/startup/linkcmds.in
index 7239f0d..7fd6e27 100644
--- a/c/src/lib/libbsp/arm/xilinx-zynq/startup/linkcmds.in
+++ b/c/src/lib/libbsp/arm/xilinx-zynq/startup/linkcmds.in
@@ -2,7 +2,8 @@ MEMORY {
    RAM_INT_0 : ORIGIN = @ZYNQ_RAM_INT_0_ORIGIN@, LENGTH = @ZYNQ_RAM_INT_0_LENGTH@
    RAM_INT_1 : ORIGIN = @ZYNQ_RAM_INT_1_ORIGIN@, LENGTH = @ZYNQ_RAM_INT_1_LENGTH@
    RAM_MMU   : ORIGIN = @ZYNQ_RAM_MMU@, LENGTH = @ZYNQ_RAM_MMU_LENGTH@
-   RAM       : ORIGIN = @ZYNQ_RAM_ORIGIN_AVAILABLE@, LENGTH = @ZYNQ_RAM_LENGTH_AVAILABLE@
+   RAM       : ORIGIN = @ZYNQ_RAM_ORIGIN_AVAILABLE@, LENGTH = @ZYNQ_RAM_LENGTH_AVAILABLE@ - @ZYNQ_RAM_NOCACHE_LENGTH@
+   NOCACHE   : ORIGIN = @ZYNQ_RAM_ORIGIN_AVAILABLE@ + @ZYNQ_RAM_LENGTH_AVAILABLE@ - @ZYNQ_RAM_NOCACHE_LENGTH@, LENGTH = @ZYNQ_RAM_NOCACHE_LENGTH@
 }
 
 bsp_processor_count = DEFINED (bsp_processor_count) ? bsp_processor_count : @ZYNQ_CPUS@;
@@ -22,6 +23,8 @@ REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM);
 REGION_ALIAS ("REGION_BSS",            RAM);
 REGION_ALIAS ("REGION_WORK",           RAM);
 REGION_ALIAS ("REGION_STACK",          RAM);
+REGION_ALIAS ("REGION_NOCACHE",        NOCACHE);
+REGION_ALIAS ("REGION_NOCACHE_LOAD",   NOCACHE);
 
 bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096;
 bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024;




More information about the vc mailing list