diff --git a/.github/workflows/corevalidation.yml b/.github/workflows/corevalidation.yml
index 6f6beb70e..8f056284e 100644
--- a/.github/workflows/corevalidation.yml
+++ b/.github/workflows/corevalidation.yml
@@ -7,7 +7,7 @@ on:
- .github/workflows/corevalidation-report.yml
- CMSIS/Core/Include/**/*
- CMSIS/Core/Source/**/*
- - CMSIS/CoreValidation/Source/**/*
+ - CMSIS/CoreValidation/**/*
push:
branches: [main]
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0/RTE/Device/ARMCM0/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM0/Target.clayer.yml
index 42b1d7cfd..545d6586b 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM0/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM0/Target.clayer.yml
@@ -11,3 +11,17 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM0plus/RTE/Device/ARMCM0P/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM0plus/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM0plus/Target.clayer.yml
index 42b1d7cfd..6b84e07d6 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM0plus/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM0plus/Target.clayer.yml
@@ -11,3 +11,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23/RTE/Device/ARMCM23/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM23/Target.clayer.yml
index 9f804451d..6738bef35 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM23/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM23/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23NS/RTE/Device/ARMCM23/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23NS/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM23NS/Target.clayer.yml
index c7a455db6..260ed50ce 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM23NS/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM23NS/Target.clayer.yml
@@ -16,3 +16,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ARMCM23_ac6.sct b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ARMCM23_ac6.sct
new file mode 100644
index 000000000..a0317e6c0
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ARMCM23_ac6.sct
@@ -0,0 +1,123 @@
+#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m23 -xc
+; command above MUST be in first line (no comment above!)
+
+;Note: Add '-mcmse' to first line if your software model is "Secure Mode".
+; #! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m23 -xc -mcmse
+
+
+/*
+;-------- <<< Use Configuration Wizard in Context Menu >>> -------------------
+*/
+
+/*--------------------- Flash Configuration ----------------------------------
+; Flash Configuration
+; Flash Base Address <0x0-0xFFFFFFFF:8>
+; Flash Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __ROM_BASE 0x00000000
+#define __ROM_SIZE 0x00080000
+
+/*--------------------- Embedded RAM Configuration ---------------------------
+; RAM Configuration
+; RAM Base Address <0x0-0xFFFFFFFF:8>
+; RAM Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __RAM_BASE 0x20000000
+#define __RAM_SIZE 0x00040000
+
+/*--------------------- Stack / Heap Configuration ---------------------------
+; Stack / Heap Configuration
+; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __STACK_SIZE 0x00000200
+#define __HEAP_SIZE 0x00000C00
+
+/*--------------------- CMSE Veneer Configuration ---------------------------
+; CMSE Veneer Configuration
+; CMSE Veneer Size (in Bytes) <0x0-0xFFFFFFFF:32>
+;
+ *----------------------------------------------------------------------------*/
+#define __CMSEVENEER_SIZE 0x200
+
+/*
+;------------- <<< end of configuration section >>> ---------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+ User Stack & Heap boundary definition
+ *----------------------------------------------------------------------------*/
+#define __STACK_TOP (__RAM_BASE + __RAM_SIZE - __STACKSEAL_SIZE) /* starts at end of RAM - 8 byte stack seal */
+#define __HEAP_BASE (AlignExpr(+0, 8)) /* starts after RW_RAM section, 8 byte aligned */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+
+/*----------------------------------------------------------------------------
+ Region base & size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __CV_BASE ( __ROM_BASE + __ROM_SIZE - __CMSEVENEER_SIZE )
+#define __CV_SIZE ( __CMSEVENEER_SIZE )
+#else
+#define __CV_SIZE ( 0 )
+#endif
+
+#define __RO_BASE ( __ROM_BASE )
+#define __RO_SIZE ( __ROM_SIZE - __CV_SIZE )
+
+#define __RW_BASE ( __RAM_BASE )
+#define __RW_SIZE (__RAM_SIZE - __STACK_SIZE - __HEAP_SIZE - __STACKSEAL_SIZE )
+
+
+/*----------------------------------------------------------------------------
+ Scatter Region definition
+ *----------------------------------------------------------------------------*/
+LR_ROM __RO_BASE __RO_SIZE { ; load region size_region
+ ER_ROM __RO_BASE __RO_SIZE { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ .ANY (+XO)
+ }
+
+ RW_NOINIT __RW_BASE UNINIT __RW_SIZE {
+ *(.bss.noinit)
+ }
+
+ RW_RAM AlignExpr(+0, 8) (__RW_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP __HEAP_BASE EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+}
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+LR_CMSE_VENEER __CV_BASE ALIGN 32 __CV_SIZE { ; own load/execution region for CMSE Veneers
+ ER_CMSE_VENEER __CV_BASE __CV_SIZE {
+ *(Veneer$$CMSE)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ARMCM23_ac6.sct.base@1.1.0 b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ARMCM23_ac6.sct.base@1.1.0
new file mode 100644
index 000000000..a0317e6c0
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ARMCM23_ac6.sct.base@1.1.0
@@ -0,0 +1,123 @@
+#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m23 -xc
+; command above MUST be in first line (no comment above!)
+
+;Note: Add '-mcmse' to first line if your software model is "Secure Mode".
+; #! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m23 -xc -mcmse
+
+
+/*
+;-------- <<< Use Configuration Wizard in Context Menu >>> -------------------
+*/
+
+/*--------------------- Flash Configuration ----------------------------------
+; Flash Configuration
+; Flash Base Address <0x0-0xFFFFFFFF:8>
+; Flash Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __ROM_BASE 0x00000000
+#define __ROM_SIZE 0x00080000
+
+/*--------------------- Embedded RAM Configuration ---------------------------
+; RAM Configuration
+; RAM Base Address <0x0-0xFFFFFFFF:8>
+; RAM Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __RAM_BASE 0x20000000
+#define __RAM_SIZE 0x00040000
+
+/*--------------------- Stack / Heap Configuration ---------------------------
+; Stack / Heap Configuration
+; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __STACK_SIZE 0x00000200
+#define __HEAP_SIZE 0x00000C00
+
+/*--------------------- CMSE Veneer Configuration ---------------------------
+; CMSE Veneer Configuration
+; CMSE Veneer Size (in Bytes) <0x0-0xFFFFFFFF:32>
+;
+ *----------------------------------------------------------------------------*/
+#define __CMSEVENEER_SIZE 0x200
+
+/*
+;------------- <<< end of configuration section >>> ---------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+ User Stack & Heap boundary definition
+ *----------------------------------------------------------------------------*/
+#define __STACK_TOP (__RAM_BASE + __RAM_SIZE - __STACKSEAL_SIZE) /* starts at end of RAM - 8 byte stack seal */
+#define __HEAP_BASE (AlignExpr(+0, 8)) /* starts after RW_RAM section, 8 byte aligned */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+
+/*----------------------------------------------------------------------------
+ Region base & size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __CV_BASE ( __ROM_BASE + __ROM_SIZE - __CMSEVENEER_SIZE )
+#define __CV_SIZE ( __CMSEVENEER_SIZE )
+#else
+#define __CV_SIZE ( 0 )
+#endif
+
+#define __RO_BASE ( __ROM_BASE )
+#define __RO_SIZE ( __ROM_SIZE - __CV_SIZE )
+
+#define __RW_BASE ( __RAM_BASE )
+#define __RW_SIZE (__RAM_SIZE - __STACK_SIZE - __HEAP_SIZE - __STACKSEAL_SIZE )
+
+
+/*----------------------------------------------------------------------------
+ Scatter Region definition
+ *----------------------------------------------------------------------------*/
+LR_ROM __RO_BASE __RO_SIZE { ; load region size_region
+ ER_ROM __RO_BASE __RO_SIZE { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ .ANY (+XO)
+ }
+
+ RW_NOINIT __RW_BASE UNINIT __RW_SIZE {
+ *(.bss.noinit)
+ }
+
+ RW_RAM AlignExpr(+0, 8) (__RW_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP __HEAP_BASE EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+}
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+LR_CMSE_VENEER __CV_BASE ALIGN 32 __CV_SIZE { ; own load/execution region for CMSE Veneers
+ ER_CMSE_VENEER __CV_BASE __CV_SIZE {
+ *(Veneer$$CMSE)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM23S/RTE/Device/ARMCM23/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM23S/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM23S/Target.clayer.yml
index a5de6fef4..7ff3588d9 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM23S/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM23S/Target.clayer.yml
@@ -16,3 +16,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ARMCM3_ac6.sct b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ARMCM3_ac6.sct
new file mode 100644
index 000000000..4309a0bec
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ARMCM3_ac6.sct
@@ -0,0 +1,80 @@
+#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m3 -xc
+; command above MUST be in first line (no comment above!)
+
+/*
+;-------- <<< Use Configuration Wizard in Context Menu >>> -------------------
+*/
+
+/*--------------------- Flash Configuration ----------------------------------
+; Flash Configuration
+; Flash Base Address <0x0-0xFFFFFFFF:8>
+; Flash Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __ROM_BASE 0x00000000
+#define __ROM_SIZE 0x00080000
+
+/*--------------------- Embedded RAM Configuration ---------------------------
+; RAM Configuration
+; RAM Base Address <0x0-0xFFFFFFFF:8>
+; RAM Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __RAM_BASE 0x20000000
+#define __RAM_SIZE 0x00040000
+
+/*--------------------- Stack / Heap Configuration ---------------------------
+; Stack / Heap Configuration
+; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;
+ *----------------------------------------------------------------------------*/
+#define __STACK_SIZE 0x00000200
+#define __HEAP_SIZE 0x00000C00
+
+/*
+;------------- <<< end of configuration section >>> ---------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+ User Stack & Heap boundary definition
+ *----------------------------------------------------------------------------*/
+#define __STACK_TOP (__RAM_BASE + __RAM_SIZE) /* starts at end of RAM */
+#define __HEAP_BASE (AlignExpr(+0, 8)) /* starts after RW_RAM section, 8 byte aligned */
+
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+#define __RO_BASE __ROM_BASE
+#define __RO_SIZE __ROM_SIZE
+
+#define __RW_BASE __RAM_BASE
+#define __RW_SIZE (__RAM_SIZE - __STACK_SIZE - __HEAP_SIZE)
+
+
+LR_ROM __RO_BASE __RO_SIZE { ; load region size_region
+ ER_ROM __RO_BASE __RO_SIZE { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ .ANY (+XO)
+ }
+
+ RW_NOINIT __RW_BASE UNINIT __RW_SIZE {
+ *(.bss.noinit)
+ }
+
+ RW_RAM AlignExpr(+0, 8) (__RW_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP __HEAP_BASE EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ARMCM3_gcc.ld b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ARMCM3_gcc.ld
new file mode 100644
index 000000000..bbb373093
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ARMCM3_gcc.ld
@@ -0,0 +1,287 @@
+/******************************************************************************
+ * @file ARMCM3_gcc.ld
+ * @brief GNU Linker Script for Cortex-M based device
+ * @version V2.2.0
+ * @date 23. June 2023
+ ******************************************************************************/
+/*
+ * Copyright (c) 2009-2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *-------- <<< Use Configuration Wizard in Context Menu >>> -------------------
+ */
+
+/*---------------------- Flash Configuration ----------------------------------
+ Flash Configuration
+ Flash Base Address <0x0-0xFFFFFFFF:8>
+ Flash Size (in Bytes) <0x0-0xFFFFFFFF:8>
+
+ -----------------------------------------------------------------------------*/
+__ROM_BASE = 0x00000000;
+__ROM_SIZE = 0x00040000;
+
+/*--------------------- Embedded RAM Configuration ----------------------------
+ RAM Configuration
+ RAM Base Address <0x0-0xFFFFFFFF:8>
+ RAM Size (in Bytes) <0x0-0xFFFFFFFF:8>
+
+ -----------------------------------------------------------------------------*/
+__RAM_BASE = 0x20000000;
+__RAM_SIZE = 0x00020000;
+
+/*--------------------- Stack / Heap Configuration ----------------------------
+ Stack / Heap Configuration
+ Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+ Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+
+ -----------------------------------------------------------------------------*/
+__STACK_SIZE = 0x00000400;
+__HEAP_SIZE = 0x00000C00;
+
+/*
+ *-------------------- <<< end of configuration section >>> -------------------
+ */
+
+MEMORY
+{
+ FLASH (rx) : ORIGIN = __ROM_BASE, LENGTH = __ROM_SIZE
+ RAM (rwx) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > FLASH
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > FLASH
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > FLASH
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > FLASH
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > FLASH
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM AT > FLASH
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM2 AT > FLASH
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM AT > RAM
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM2 AT > RAM2
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM
+
+ .stack (ORIGIN(RAM) + LENGTH(RAM) - __STACK_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM
+ PROVIDE(__stack = __StackTop);
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM3/RTE/Device/ARMCM3/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM3/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM3/Target.clayer.yml
index 42b1d7cfd..6b84e07d6 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM3/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM3/Target.clayer.yml
@@ -11,3 +11,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33/RTE/Device/ARMCM33/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM33/Target.clayer.yml
index 9f804451d..6738bef35 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM33/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM33/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33NS/RTE/Device/ARMCM33/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33NS/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM33NS/Target.clayer.yml
index c7a455db6..260ed50ce 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM33NS/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM33NS/Target.clayer.yml
@@ -16,3 +16,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM33S/RTE/Device/ARMCM33/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM33S/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM33S/Target.clayer.yml
index 2378889f4..b135c35a7 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM33S/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM33S/Target.clayer.yml
@@ -16,3 +16,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35P/RTE/Device/ARMCM35P/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35P/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM35P/Target.clayer.yml
index 9f804451d..6738bef35 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM35P/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM35P/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PNS/RTE/Device/ARMCM35P/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PNS/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM35PNS/Target.clayer.yml
index e7ffa3d8d..7d8398b2b 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM35PNS/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PNS/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PS/RTE/Device/ARMCM35P/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM35PS/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM35PS/Target.clayer.yml
index f2b15dd81..ea75fcf9e 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM35PS/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM35PS/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4/RTE/Device/ARMCM4/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM4/Target.clayer.yml
index 075bd3da6..ed9dc65b8 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM4/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM4/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM4FP/RTE/Device/ARMCM4/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM4FP/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM4FP/Target.clayer.yml
index 42b1d7cfd..6b84e07d6 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM4FP/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM4FP/Target.clayer.yml
@@ -11,3 +11,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55NS/RTE/Device/ARMCM55/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55NS/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM55NS/Target.clayer.yml
index e7ffa3d8d..7d8398b2b 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM55NS/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM55NS/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM55S/RTE/Device/ARMCM55/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM55S/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM55S/Target.clayer.yml
index f2b15dd81..ea75fcf9e 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM55S/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM55S/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7/RTE/Device/ARMCM7/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM7/Target.clayer.yml
index 075bd3da6..ed9dc65b8 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM7/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM7/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7DP/RTE/Device/ARMCM7/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7DP/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM7DP/Target.clayer.yml
index 42b1d7cfd..6b84e07d6 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM7DP/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM7DP/Target.clayer.yml
@@ -11,3 +11,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM7SP/RTE/Device/ARMCM7/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM7SP/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM7SP/Target.clayer.yml
index 42b1d7cfd..6b84e07d6 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM7SP/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM7SP/Target.clayer.yml
@@ -11,3 +11,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85NS/RTE/Device/ARMCM85/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85NS/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM85NS/Target.clayer.yml
index e7ffa3d8d..7d8398b2b 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM85NS/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM85NS/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/ac6_linker_script.sct b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/ac6_linker_script.sct
new file mode 100644
index 000000000..298ebcb95
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/ac6_linker_script.sct
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE 8
+#else
+#define __STACKSEAL_SIZE 0
+#endif
+
+/*----------------------------------------------------------------------------
+ Scatter File Definitions definition
+ *----------------------------------------------------------------------------*/
+
+LR_ROM0 __ROM0_BASE __ROM0_SIZE {
+
+ ER_ROM0 __ROM0_BASE __ROM0_SIZE {
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ *(+RO +XO)
+ }
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ ER_CMSE_VENEER AlignExpr(+0, 32) (__ROM0_SIZE - AlignExpr(ImageLength(ER_ROM0), 32)) {
+ *(Veneer$$CMSE)
+ }
+#endif
+
+ RW_NOINIT __RAM0_BASE UNINIT (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE) {
+ *(.bss.noinit)
+ }
+
+ RW_RAM0 AlignExpr(+0, 8) (__RAM0_SIZE - __HEAP_SIZE - __STACK_SIZE - __STACKSEAL_SIZE - AlignExpr(ImageLength(RW_NOINIT), 8)) {
+ *(+RW +ZI)
+ }
+
+#if __HEAP_SIZE > 0
+ ARM_LIB_HEAP (AlignExpr(+0, 8)) EMPTY __HEAP_SIZE { ; Reserve empty region for heap
+ }
+#endif
+
+ ARM_LIB_STACK (__RAM0_BASE + __RAM0_SIZE - __STACKSEAL_SIZE) EMPTY -__STACK_SIZE { ; Reserve empty region for stack
+ }
+
+#if __STACKSEAL_SIZE > 0
+ STACKSEAL +0 EMPTY __STACKSEAL_SIZE { ; Reserve empty region for stack seal immediately after stack
+ }
+#endif
+
+#if __RAM1_SIZE > 0
+ RW_RAM1 __RAM1_BASE __RAM1_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM2_SIZE > 0
+ RW_RAM2 __RAM2_BASE __RAM2_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+
+#if __RAM3_SIZE > 0
+ RW_RAM3 __RAM3_BASE __RAM3_SIZE {
+ .ANY (+RW +ZI)
+ }
+#endif
+}
+
+#if __ROM1_SIZE > 0
+LR_ROM1 __ROM1_BASE __ROM1_SIZE {
+ ER_ROM1 +0 __ROM1_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM2_SIZE > 0
+LR_ROM2 __ROM2_BASE __ROM2_SIZE {
+ ER_ROM2 +0 __ROM2_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
+
+#if __ROM3_SIZE > 0
+LR_ROM3 __ROM3_BASE __ROM3_SIZE {
+ ER_ROM3 +0 __ROM3_SIZE {
+ .ANY (+RO +XO)
+ }
+}
+#endif
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/clang_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/clang_linker_script.ld
new file mode 100644
index 000000000..b7e5948eb
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/clang_linker_script.ld
@@ -0,0 +1,361 @@
+/*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright © 2019 Keith Packard
+ *
+ * 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.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * 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 HOLDER 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.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx!w) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx!w) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx!w) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx!w) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (w!rx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (w!rx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (w!rx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (w!rx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+ENTRY(Reset_Handler)
+
+PHDRS
+{
+ text PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ tls PT_TLS;
+}
+
+SECTIONS
+{
+ .init : {
+ KEEP (*(.vectors))
+ KEEP (*(.text.init.enter))
+ KEEP (*(.data.init.enter))
+ KEEP (*(SORT_BY_NAME(.init) SORT_BY_NAME(.init.*)))
+ } >ROM0 AT>ROM0 :text
+
+ .text : {
+
+ /* code */
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.* .opd .opd.*)
+ *(.gnu.linkonce.t.*)
+ KEEP (*(.fini .fini.*))
+ __text_end = .;
+
+ PROVIDE (__etext = __text_end);
+ PROVIDE (_etext = __text_end);
+ PROVIDE (etext = __text_end);
+
+ /* read-only data */
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ *(.data.rel.ro .data.rel.ro.*)
+ *(.got .got.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ /* lists of constructors and destructors */
+ PROVIDE_HIDDEN ( __preinit_array_start = . );
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN ( __preinit_array_end = . );
+
+ PROVIDE_HIDDEN ( __init_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array .ctors))
+ PROVIDE_HIDDEN ( __init_array_end = . );
+
+ PROVIDE_HIDDEN ( __fini_array_start = . );
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array .dtors))
+ PROVIDE_HIDDEN ( __fini_array_end = . );
+
+ } >ROM0 AT>ROM0 :text
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .veneers :
+ {
+ . = ALIGN(32);
+ KEEP(*(.gnu.sgstubs))
+ } > ROM0 AT>ROM0 :text
+#endif
+
+ .toc : {
+ *(.toc .toc.*)
+ } >ROM0 AT>ROM0 :text
+
+ /* additional sections when compiling with C++ exception support */
+
+ .except_ordered : {
+ *(.gcc_except_table *.gcc_except_table.*)
+ KEEP (*(.eh_frame .eh_frame.*))
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } >ROM0 AT>ROM0 :text
+
+ .except_unordered : {
+ . = ALIGN(8);
+
+ PROVIDE(__exidx_start = .);
+ *(.ARM.exidx*)
+ PROVIDE(__exidx_end = .);
+ } >ROM0 AT>ROM0 :text
+
+
+ /*
+ * Data values which are preserved across reset
+ */
+ .preserve (NOLOAD) : {
+ PROVIDE(__preserve_start__ = .);
+ KEEP(*(SORT_BY_NAME(.preserve.*)))
+ KEEP(*(.preserve))
+ PROVIDE(__preserve_end__ = .);
+ } >RAM0 AT>RAM0 :ram
+
+ .data : {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+
+ /* Need to pre-align so that the symbols come after padding */
+ . = ALIGN(8);
+
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >RAM0 AT>ROM0 :ram_init
+ PROVIDE(__data_start = ADDR(.data));
+ PROVIDE(__data_source = LOADADDR(.data));
+
+ /* Thread local initialized data. This gets
+ * space allocated as it is expected to be placed
+ * in ram to be used as a template for TLS data blocks
+ * allocated at runtime. We're slightly abusing that
+ * by placing the data in flash where it will be copied
+ * into the allocate ram addresses by the existing
+ * data initialization code in crt0
+ */
+ .tdata : {
+ *(.tdata .tdata.* .gnu.linkonce.td.*)
+ PROVIDE(__data_end = .);
+ PROVIDE(__tdata_end = .);
+ } >RAM0 AT>ROM0 :tls :ram_init
+ PROVIDE( __tls_base = ADDR(.tdata));
+ PROVIDE( __tdata_start = ADDR(.tdata));
+ PROVIDE( __tdata_source = LOADADDR(.tdata) );
+ PROVIDE( __tdata_source_end = LOADADDR(.tdata) + SIZEOF(.tdata) );
+ PROVIDE( __data_source_end = __tdata_source_end );
+ PROVIDE( __tdata_size = SIZEOF(.tdata) );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata),ALIGNOF(.tbss)) );
+
+ PROVIDE( __edata = __data_end );
+ PROVIDE( _edata = __data_end );
+ PROVIDE( edata = __data_end );
+ PROVIDE( __data_size = __data_end - __data_start );
+ PROVIDE( __data_source_size = __data_source_end - __data_source );
+
+ .tbss (NOLOAD) : {
+ *(.tbss .tbss.* .gnu.linkonce.tb.*)
+ *(.tcommon)
+ PROVIDE( __tls_end = . );
+ PROVIDE( __tbss_end = . );
+ } >RAM0 AT>RAM0 :tls :ram
+ PROVIDE( __bss_start = ADDR(.tbss));
+ PROVIDE( __tbss_start = ADDR(.tbss));
+ PROVIDE( __tbss_offset = ADDR(.tbss) - ADDR(.tdata) );
+ PROVIDE( __tbss_size = SIZEOF(.tbss) );
+ PROVIDE( __tls_size = __tls_end - __tls_base );
+ PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) );
+ PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) );
+ PROVIDE( __arm64_tls_tcb_offset = MAX(16, __tls_align) );
+
+ /*
+ * The linker special cases .tbss segments which are
+ * identified as segments which are not loaded and are
+ * thread_local.
+ *
+ * For these segments, the linker does not advance 'dot'
+ * across them. We actually need memory allocated for tbss,
+ * so we create a special segment here just to make room
+ */
+ /*
+ .tbss_space (NOLOAD) : {
+ . = ADDR(.tbss);
+ . = . + SIZEOF(.tbss);
+ } >RAM0 AT>RAM0 :ram
+ */
+
+ .bss (NOLOAD) : {
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+
+ /* Align the heap */
+ . = ALIGN(8);
+ __bss_end = .;
+ } >RAM0 AT>RAM0 :ram
+ PROVIDE( __non_tls_bss_start = ADDR(.bss) );
+ PROVIDE( __end = __bss_end );
+ PROVIDE( _end = __bss_end );
+ PROVIDE( end = __bss_end );
+ PROVIDE( __bss_size = __bss_end - __bss_start );
+
+ /* Make the rest of memory available for heap storage */
+ PROVIDE (__heap_start = __end);
+#ifdef __HEAP_SIZE
+ PROVIDE (__heap_end = __heap_start + __HEAP_SIZE);
+ PROVIDE (__heap_size = __HEAP_SIZE);
+#else
+ PROVIDE (__heap_end = __stack - __STACK_SIZE);
+ PROVIDE (__heap_size = __heap_end - __heap_start);
+#endif
+ .heap (NOLOAD) : {
+ . += __heap_size;
+ } >RAM0 :ram
+
+ /* Define a stack region to make sure it fits in memory */
+ PROVIDE(__stack = ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE);
+ PROVIDE(__stack_limit = __stack - __STACK_SIZE);
+ .stack (__stack_limit) (NOLOAD) : {
+ . += __STACK_SIZE;
+ } >RAM0 :ram
+
+#if __STACKSEAL_SIZE > 0
+ PROVIDE(__stack_seal = __stack);
+ .stackseal (__stack) (NOLOAD) :
+ {
+ . += __STACKSEAL_SIZE;
+ } >RAM0 :ram
+#endif
+
+ /* Throw away C++ exception handling information */
+
+ /*
+
+ /DISCARD/ : {
+ *(.note .note.*)
+ *(.eh_frame .eh_frame.*)
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ *(.ARM.exidx*)
+ }
+
+ */
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1. */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions. */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2. */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2. */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions. */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* DWARF 3. */
+ .debug_pubtypes 0 : { *(.debug_pubtypes) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ /* DWARF 5. */
+ .debug_addr 0 : { *(.debug_addr) }
+ .debug_line_str 0 : { *(.debug_line_str) }
+ .debug_loclists 0 : { *(.debug_loclists) }
+ .debug_macro 0 : { *(.debug_macro) }
+ .debug_names 0 : { *(.debug_names) }
+ .debug_rnglists 0 : { *(.debug_rnglists) }
+ .debug_str_offsets 0 : { *(.debug_str_offsets) }
+ .debug_sup 0 : { *(.debug_sup) }
+ .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+}
+/*
+ * Check that sections that are copied from flash to RAM have matching
+ * padding, so that a single memcpy() of __data_size copies the correct bytes.
+ */
+ASSERT( __data_size == __data_source_size,
+ "ERROR: .data/.tdata flash size does not match RAM size");
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/gcc_linker_script.ld b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/gcc_linker_script.ld
new file mode 100644
index 000000000..a018e5d4e
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/gcc_linker_script.ld
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ----------------------------------------------------------------------------
+ Stack seal size definition
+ *----------------------------------------------------------------------------*/
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+#define __STACKSEAL_SIZE ( 8 )
+#else
+#define __STACKSEAL_SIZE ( 0 )
+#endif
+
+/* ----------------------------------------------------------------------------
+ Memory definition
+ *----------------------------------------------------------------------------*/
+MEMORY
+{
+ ROM0 (rx) : ORIGIN = __ROM0_BASE, LENGTH = __ROM0_SIZE
+#if __ROM1_SIZE > 0
+ ROM1 (rx) : ORIGIN = __ROM1_BASE, LENGTH = __ROM1_SIZE
+#endif
+#if __ROM2_SIZE > 0
+ ROM2 (rx) : ORIGIN = __ROM2_BASE, LENGTH = __ROM2_SIZE
+#endif
+#if __ROM3_SIZE > 0
+ ROM3 (rx) : ORIGIN = __ROM3_BASE, LENGTH = __ROM3_SIZE
+#endif
+
+ RAM0 (rwx) : ORIGIN = __RAM0_BASE, LENGTH = __RAM0_SIZE
+#if __RAM1_SIZE > 0
+ RAM1 (rwx) : ORIGIN = __RAM1_BASE, LENGTH = __RAM1_SIZE
+#endif
+#if __RAM2_SIZE > 0
+ RAM2 (rwx) : ORIGIN = __RAM2_BASE, LENGTH = __RAM2_SIZE
+#endif
+#if __RAM3_SIZE > 0
+ RAM3 (rwx) : ORIGIN = __RAM3_BASE, LENGTH = __RAM3_SIZE
+#endif
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ * Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ * __exidx_start
+ * __exidx_end
+ * __copy_table_start__
+ * __copy_table_end__
+ * __zero_table_start__
+ * __zero_table_end__
+ * __etext (deprecated)
+ * __data_start__
+ * __preinit_array_start
+ * __preinit_array_end
+ * __init_array_start
+ * __init_array_end
+ * __fini_array_start
+ * __fini_array_end
+ * __data_end__
+ * __bss_start__
+ * __bss_end__
+ * __end__
+ * end
+ * __HeapLimit
+ * __StackLimit
+ * __StackTop
+ * __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+ .text :
+ {
+ KEEP(*(.vectors))
+ *(.text*)
+
+ KEEP(*(.init))
+ KEEP(*(.fini))
+
+ /* .ctors */
+ *crtbegin.o(.ctors)
+ *crtbegin?.o(.ctors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+ *(SORT(.ctors.*))
+ *(.ctors)
+
+ /* .dtors */
+ *crtbegin.o(.dtors)
+ *crtbegin?.o(.dtors)
+ *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ *(SORT(.dtors.*))
+ *(.dtors)
+
+ *(.rodata*)
+
+ KEEP(*(.eh_frame*))
+ } > ROM0
+
+#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
+ .gnu.sgstubs :
+ {
+ . = ALIGN(32);
+ } > ROM0
+#endif
+
+ .ARM.extab :
+ {
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ } > ROM0
+
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+ } > ROM0
+ __exidx_end = .;
+
+ .copy.table :
+ {
+ . = ALIGN(4);
+ __copy_table_start__ = .;
+
+ LONG (LOADADDR(.data))
+ LONG (ADDR(.data))
+ LONG (SIZEOF(.data) / 4)
+
+ /* Add each additional data section here */
+/*
+ LONG (LOADADDR(.data2))
+ LONG (ADDR(.data2))
+ LONG (SIZEOF(.data2) / 4)
+*/
+ __copy_table_end__ = .;
+ } > ROM0
+
+ .zero.table :
+ {
+ . = ALIGN(4);
+ __zero_table_start__ = .;
+
+/* .bss initialization to zero is already done during C Run-Time Startup.
+ LONG (ADDR(.bss))
+ LONG (SIZEOF(.bss) / 4)
+*/
+
+ /* Add each additional bss section here */
+/*
+ LONG (ADDR(.bss2))
+ LONG (SIZEOF(.bss2) / 4)
+*/
+ __zero_table_end__ = .;
+ } > ROM0
+
+ /*
+ * This __etext variable is kept for backward compatibility with older,
+ * ASM based startup files.
+ */
+ PROVIDE(__etext = LOADADDR(.data));
+
+ .data : ALIGN(4)
+ {
+ __data_start__ = .;
+ *(vtable)
+ *(.data)
+ *(.data.*)
+
+ . = ALIGN(4);
+ /* preinit data */
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP(*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+
+ . = ALIGN(4);
+ /* init data */
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP(*(SORT(.init_array.*)))
+ KEEP(*(.init_array))
+ PROVIDE_HIDDEN (__init_array_end = .);
+
+ . = ALIGN(4);
+ /* finit data */
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP(*(SORT(.fini_array.*)))
+ KEEP(*(.fini_array))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+
+ KEEP(*(.jcr*))
+ . = ALIGN(4);
+ /* All data end */
+ __data_end__ = .;
+
+ } > RAM0 AT > ROM0
+
+ /*
+ * Secondary data section, optional
+ *
+ * Remember to add each additional data section
+ * to the .copy.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .data2 : ALIGN(4)
+ {
+ . = ALIGN(4);
+ __data2_start__ = .;
+ *(.data2)
+ *(.data2.*)
+ . = ALIGN(4);
+ __data2_end__ = .;
+
+ } > RAM1 AT > ROM0
+*/
+
+ .bss :
+ {
+ . = ALIGN(4);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ . = ALIGN(4);
+ __bss_end__ = .;
+ } > RAM0 AT > RAM0
+
+ /*
+ * Secondary bss section, optional
+ *
+ * Remember to add each additional bss section
+ * to the .zero.table above to assure proper
+ * initialization during startup.
+ */
+/*
+ .bss2 :
+ {
+ . = ALIGN(4);
+ __bss2_start__ = .;
+ *(.bss2)
+ *(.bss2.*)
+ . = ALIGN(4);
+ __bss2_end__ = .;
+ } > RAM1 AT > RAM1
+*/
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE(end = .);
+ . = . + __HEAP_SIZE;
+ . = ALIGN(8);
+ __HeapLimit = .;
+ } > RAM0
+
+ .stack (ORIGIN(RAM0) + LENGTH(RAM0) - __STACK_SIZE - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . = . + __STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ } > RAM0
+ PROVIDE(__stack = __StackTop);
+
+#if __STACKSEAL_SIZE > 0
+ .stackseal (ORIGIN(RAM0) + LENGTH(RAM0) - __STACKSEAL_SIZE) (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackSeal = .;
+ . = . + 8;
+ . = ALIGN(8);
+ } > RAM0
+#endif
+
+ /* Check if data + heap + stack exceeds RAM limit */
+ ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/iar_linker_script.icf b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/iar_linker_script.icf
new file mode 100644
index 000000000..5689ea8aa
--- /dev/null
+++ b/CMSIS/CoreValidation/Layer/Target/CM85S/RTE/Device/ARMCM85/iar_linker_script.icf
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2023 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+define memory mem with size = 4G;
+
+#if __ROM0_SIZE > 0
+ define region ROM0_region = mem:[from __ROM0_BASE to (__ROM0_BASE+__ROM0_SIZE-1)];
+#else
+ define region ROM0_region = [];
+#endif
+
+#if __ROM1_SIZE > 0
+ define region ROM1_region = mem:[from __ROM1_BASE to (__ROM0_BASE+__ROM1_SIZE-1)];
+#else
+ define region ROM1_region = [];
+#endif
+
+#if __ROM2_SIZE > 0
+ define region ROM2_region = mem:[from __ROM2_BASE to (__ROM2_BASE+__ROM2_SIZE-1)];
+#else
+ define region ROM2_region = [];
+#endif
+
+#if __ROM3_SIZE > 0
+ define region ROM3_region = mem:[from __ROM3_BASE to (__ROM3_BASE+__ROM3_SIZE-1)];
+#else
+ define region ROM3_region = [];
+#endif
+
+define region ROM_region = ROM0_region | ROM1_region | ROM2_region | ROM3_region;
+
+#if __RAM0_SIZE > 0
+ define region RAM0_region = mem:[from __RAM0_BASE to (__RAM0_BASE+__RAM0_SIZE-1)];
+#else
+ define region RAM0_region = [];
+#endif
+
+#if __RAM1_SIZE > 0
+ define region RAM1_region = mem:[from __RAM1_BASE to (__RAM0_BASE+__RAM1_SIZE-1)];
+#else
+ define region RAM1_region = [];
+#endif
+
+#if __RAM2_SIZE > 0
+ define region RAM2_region = mem:[from __RAM2_BASE to (__RAM2_BASE+__RAM2_SIZE-1)];
+#else
+ define region RAM2_region = [];
+#endif
+
+#if __RAM3_SIZE > 0
+ define region RAM3_region = mem:[from __RAM3_BASE to (__RAM3_BASE+__RAM3_SIZE-1)];
+#else
+ define region RAM3_region = [];
+#endif
+
+define region RAM_region = RAM0_region | RAM1_region | RAM2_region | RAM3_region;
+
+do not initialize { section .noinit };
+initialize by copy { readwrite };
+if (isdefinedsymbol(__USE_DLIB_PERTHREAD))
+{
+ // Required in a multi-threaded application
+ initialize by copy with packing = none { section __DLIB_PERTHREAD };
+}
+
+place at address mem:__ROM0_BASE { readonly section .intvec };
+
+if (!isempty(ROM_region))
+{
+ place in ROM_region { readonly };
+}
+
+if (!isempty(RAM_region))
+{
+ define block CSTACK with alignment = 8, size = __STACK_SIZE { };
+ define block PROC_STACK with alignment = 8, size = 0 { };
+ define block HEAP with alignment = 8, size = __HEAP_SIZE { };
+ place in RAM_region { readwrite, block CSTACK, block PROC_STACK, block HEAP };
+}
diff --git a/CMSIS/CoreValidation/Layer/Target/CM85S/Target.clayer.yml b/CMSIS/CoreValidation/Layer/Target/CM85S/Target.clayer.yml
index f2b15dd81..ea75fcf9e 100644
--- a/CMSIS/CoreValidation/Layer/Target/CM85S/Target.clayer.yml
+++ b/CMSIS/CoreValidation/Layer/Target/CM85S/Target.clayer.yml
@@ -14,3 +14,18 @@ layer:
- group: VHT/FVP
files:
- file: ./model_config.txt
+
+ linker:
+ - for-compiler: AC6
+ script: RTE/Device/$Dname$/ac6_linker_script.sct
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: GCC
+ script: RTE/Device/$Dname$/gcc_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: CLANG
+ script: RTE/Device/$Dname$/clang_linker_script.ld
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+ - for-compiler: IAR
+ script: RTE/Device/$Dname$/iar_linker_script.icf
+ regions: RTE/Device/$Dname$/regions_$Dname$.h
+