The linker:
- Creates
__at
sections that are called Veneer$$CMSE_AT_address
for secure gateway veneers that you specify in a
user-defined input import library.
- Produces one normal section
Veneer$$CMSE
to
hold all other secure gateway veneers.
Placement of secure gateway veneers generated from input import
libraries
The following example shows the placement of secure gateway veneers for
functions entry1
and entry2
that are specified in
the input import library:
...
** Section #4 'ER$$Veneer$$CMSE_AT_0x00004000' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ARM_NOREAD]
Size : 32 bytes (alignment 32)
Address: 0x00004000
$t
entry1
0x00004000: e97fe97f .... SG ; [0x3e08]
0x00004004: f004b85a ..Z. B.W __acle_se_entry1 ; 0x80bc
entry2
0x00004008: e97fe97f .... SG ; [0x3e10]
0x0000400c: f004b868 ..h. B.W __acle_se_entry2 ; 0x80e0
...
The same rules and options that apply to normal __at
sections apply to __at
sections
created for secure gateway veneers. The same rules and options also apply to the
automatic placement of these sections when you specify --autoat
.
Placement of secure gateway veneers that are not specified in the input import
library
Secure gateway veneers that do not have their addresses specified in an input
import library get generated in the Veneer$$CMSE
input section. You must place this section as required. If you create a simple
image, that is without using a scatter file, the sections get placed in the ER_XO
execution region, and the respective ER_XO output section.
The following example shows the placement of secure gateway veneers
for functions entry3
and entry4
that are not specified in the input import library:
...
** Section #1 'ER_XO' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ARM_NOREAD]
Size : 32 bytes (alignment 32)
Address: 0x00008000
$t
entry3
0x00008000: e97fe97f .... SG
0x00008004: f000b87e ..~. B.W __acle_se_entry3 ; 0x8104
entry4
0x00008008: e97fe97f .... SG
0x0000800c: f000b894 .... B.W __acle_se_entry4 ; 0x8138
...
Placement of secure gateway veneers with a scatter file
To make sure all the secure gateway veneers are in a single section, you must
place them using a scatter file.
Secure gateway veneers that are not specified in the input import library are
new veneers. New veneers get generated in the Veneer$$CMSE
input section. You can place this section in the scatter
file as required. Veneers that are already present in the input import library are
placed at the address that is specified in this library. This placement is done by
creating Veneer$$CMSE_AT_address
sections for them. These sections use the same
facility that is used by other AT sections. Therefore, if you use --no_autoat
, you can place these sections either by
using the --autoat
mechanism or by manually
placing them using a scatter file.
For a Non-secure callable region of size 0x1000
bytes with a base address of 0x4000
a suitable example of a
scatter file load and execution region to match the veneers is:
LOAD_NSCR 0x4000 0x1000
{
EXEC_NSCR 0x4000 0x1000
{
*(Veneer$$CMSE)
}
}
The secure gateway veneers are placed as follows:
...
** Section #7 'EXEC_NSCR' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR + SHF_ARM_NOREAD]
Size : 64 bytes (alignment 32)
Address: 0x00004000
$t
entry1
0x00004000: e97fe97f .... SG
0x00004004: f7fcb850 ..P. B __acle_se_entry1 ; 0xa8
entry2
0x00004008: e97fe97f .... SG
0x0000400c: f7fcb85e ..^. B __acle_se_entry2 ; 0xcc
...
entry3
0x00004020: e97fe97f .... SG
0x00004024: f7fcb864 ..d. B __acle_se_entry3 ; 0xf0
entry4
0x00004028: e97fe97f .... SG
0x0000402c: f7fcb87a ..z. B __acle_se_entry4 ; 0x124
...