Skip to content

Commit

Permalink
Add hyperram support on Sonata v1.
Browse files Browse the repository at this point in the history
We place all the rw data in SRAM and (almost) all code and RO data in HyperRAM.
This requires changing the linker script to support linking code either at lower (on most current boards) or higher address (Sonata v1).
  • Loading branch information
rmn30 committed Jan 21, 2025
1 parent 95ba13d commit 4d75141
Show file tree
Hide file tree
Showing 7 changed files with 333 additions and 303 deletions.
2 changes: 1 addition & 1 deletion scripts/run-sonata-sim.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set -e

# Specify the default environment variables if they haven't been already.
: "${SONATA_SIMULATOR:=/cheriot-tools/bin/sonata_simulator}"
: "${SONATA_SIMULATOR_BOOT_STUB:=/cheriot-tools/elf/sonata_simulator_boot_stub}"
: "${SONATA_SIMULATOR_BOOT_STUB:=/cheriot-tools/elf/sonata_simulator_hyperram_boot_stub}"
: "${SONATA_SIMULATOR_UART_LOG=uart0.log}"

if [ -z "$1" ] ; then
Expand Down
8 changes: 6 additions & 2 deletions sdk/boards/sonata-prerelease.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,13 @@
"end" : 0x88400000
}
},
"data_memory": {
"start" : 0x00101000,
"end" : 0x00120000
},
"instruction_memory": {
"start": 0x00101000,
"end": 0x00120000
"start": 0x40000000,
"end": 0x40100000
},
"heap": {
"end": 0x00120000
Expand Down
299 changes: 4 additions & 295 deletions sdk/firmware.ldscript.in
Original file line number Diff line number Diff line change
Expand Up @@ -5,302 +5,11 @@

SECTIONS
{
. = @code_start@;
_start = .;

.loader_start :
{
*(.loader_start);
}

.compartment_export_tables : ALIGN(8)
{
# The scheduler and allocator's export tables are at the start.
.scheduler_export_table = .;
*.scheduler.compartment(.compartment_export_table);
.scheduler_export_table_end = .;

.allocator_export_table = ALIGN(8);
*/cheriot.allocator.compartment(.compartment_export_table);
.allocator_export_table_end = .;

@compartment_exports@
}


__compart_pccs = .;

compartment_switcher_code : CAPALIGN
{
.compartment_switcher_start = .;
*/switcher/entry.S.o(.text);
}
.compartment_switcher_end = .;

scheduler_code : CAPALIGN
{
.scheduler_start = .;
*.scheduler.compartment(.compartment_sealing_keys);
.scheduler_import_start = .;
*.scheduler.compartment(.compartment_import_table);
.scheduler_import_end = .;
*.scheduler.compartment(.text .text.* .rodata .rodata.* .data.rel.ro);
}
.scheduler_end = .;

allocator_code : CAPALIGN
{
.allocator_start = .;
*/cheriot.allocator.compartment(.compartment_sealing_keys);
.allocator_import_start = .;
*/cheriot.allocator.compartment(.compartment_import_table);
.allocator_import_end = .;
allocator.compartment(.text .text.* .rodata .rodata.* .data.rel.ro);
*/cheriot.allocator.compartment(.text .text.* .rodata .rodata.* .data.rel.ro);
}
.allocator_end = .;


token_library_code : CAPALIGN
{
.token_library_start = .;
*/cheriot.token_library.library(.compartment_sealing_keys);
.token_library_import_start = .;
*/cheriot.token_library.library(.compartment_import_table);
.token_library_import_end = .;
token_library.library(.text .text.* .rodata .rodata.* .data.rel.ro);
*/cheriot.token_library.library(.text .text.* .rodata .rodata.* .data.rel.ro);
}
.token_library_end = .;


@software_revoker_code@

@pcc_ld@
__compart_pccs_end = .;

# Revoker scan region must be cap aligned
. = ALIGN(8);
__revoker_scan_start = .;
__stack_space_start = .;

@thread_trusted_stacks@

@thread_stacks@

__stack_space_end = .;

__compart_cgps = ALIGN(64);

.scheduler_globals : CAPALIGN
{
.scheduler_globals = .;
*.scheduler.compartment(.data .data.* .sdata .sdata.*);
.scheduler_bss_start = .;
*.scheduler.compartment(.sbss .sbss.* .bss .bss.*)
}
.scheduler_globals_end = .;

.allocator_sealed_objects : CAPALIGN
{
.allocator_sealed_objects = .;
*/cheriot.allocator.compartment(.sealed_objects)
}
.allocator_sealed_objects_end = .;

.allocator_globals : CAPALIGN
{
.allocator_globals = .;
*/cheriot.allocator.compartment(.data .data.* .sdata .sdata.*);
.allocator_bss_start = .;
*/cheriot.allocator.compartment(.sbss .sbss.* .bss .bss.*);
}
.allocator_globals_end = .;


@software_revoker_globals@

@gdc_ld@

__compart_cgps_end = .;

.sealed_objects :
{
@sealed_objects@
}

__shared_objects_start = .;
@shared_objects@
__shared_objects_end = .;

. = ALIGN(64);

# Everything after this point can be discarded after the loader has
# finished.
__export_mem_heap = @heap_start@;

__cap_relocs :
{
__cap_relocs = .;
# FIXME: This currently doesn't do anything. The linker creates this
# entire section. The linker script needs to be modified to create
# separate caprelocs sections for each section.
@cap_relocs@
}
__cap_relocs_end = .;

# Collect all compartment headers
.compartment_headers : ALIGN(4)
{
__compart_headers = .;
# Loader code start
LONG(.loader_code_start);
# Loader code length
SHORT(.loader_code_end - .loader_code_start);
# Loader data start
LONG(.loader_data_start);
# Loader data length
SHORT(.loader_data_end - .loader_data_start);

# Compartment switcher start address
LONG(.compartment_switcher_start);
# Compartment switcher end
SHORT(.compartment_switcher_end - .compartment_switcher_start);
# Cross-compartment call return path
SHORT(switcher_after_compartment_call - .compartment_switcher_start);
# Compartment switcher sealing keys
SHORT(compartment_switcher_sealing_key - .compartment_switcher_start);
# Switcher's copy of the scheduler's PCC.
SHORT(switcher_scheduler_entry_pcc - .compartment_switcher_start);
# Switcher's copy of the scheduler's CGP
SHORT(switcher_scheduler_entry_cgp - .compartment_switcher_start);
# Switcher's copy of the scheduler's CSP
SHORT(switcher_scheduler_entry_csp - .compartment_switcher_start);
# Address of switcher export table
LONG(.switcher_export_table);
# Size of the switcher export table
SHORT(.switcher_export_table_end - .switcher_export_table);

# sdk/core/loader/types.h:/PrivilegedCompartment
# Scheduler code start address
LONG(.scheduler_start);
# Scheduler code end
SHORT(.scheduler_end - .scheduler_start);
# Scheduler globals start address
LONG(.scheduler_globals);
# Scheduler globals end size
SHORT(SIZEOF(.scheduler_globals));
# Start of the scheduler's import table
LONG(.scheduler_import_start);
# Size of the scheduler import table
SHORT(.scheduler_import_end - .scheduler_import_start);
# Address of scheduler export table
LONG(.scheduler_export_table);
# Size of the scheduler export table
SHORT(.scheduler_export_table_end - .scheduler_export_table);
# No sealed objects
LONG(0);
SHORT(0);

# sdk/core/loader/types.h:/PrivilegedCompartment
# Allocator code start address
LONG(.allocator_start);
# Allocator code end
SHORT(.allocator_end - .allocator_start);
# Allocator globals start address
LONG(.allocator_globals);
# Allocator globals end
SHORT(SIZEOF(.allocator_globals));
# Start of the allocator's import table
LONG(.allocator_import_start);
# Size of the allocator import table
SHORT(.allocator_import_end - .allocator_import_start);
# Address of allocator export table
LONG(.allocator_export_table);
# Size of the allocator export table
SHORT(.allocator_export_table_end - .allocator_export_table);
# The allocator may have sealed objects
LONG(.allocator_sealed_objects);
SHORT(SIZEOF(.allocator_sealed_objects));

# sdk/core/loader/types.h:/PrivilegedCompartment
# Token server compartment header
# Code
LONG(.token_library_start);
SHORT(.token_library_end - .token_library_start);
# No data segment
LONG(0);
SHORT(0);
# Start of the token_library's import table
LONG(.token_library_import_start);
# Size of the token server import table
SHORT(.token_library_import_end - .token_library_import_start);
# Address of the token server export table
LONG(.token_library_export_table);
# Size of the token server export table
SHORT(.token_library_export_table_end - .token_library_export_table);
# No sealed objects
LONG(0);
SHORT(0);

@software_revoker_header@

# sdk/core/loader/types.h:/is_magic_valid
# Magic number, used to detect mismatches between linker script and
# loader versions.
# New versions of this can be generated with:
# head /dev/random | shasum | cut -c 0-8
LONG(0xca2b63de);
# Number of library headers.
SHORT(@library_count@);
# Number of compartment headers.
SHORT(@compartment_count@);
@compartment_headers@
}

# Thread configuration. This follows the compartment headers but is in a
# separate section to make auditing easier.
# This section holds a `class ThreadInfo` (loader/types.h)
.thread_config :
{
.thread_config_start = .;
# Number of threads
__thread_count = .;
SHORT(@thread_count@);
# The thread structures
@thread_headers@
__compart_headers_end = .;
}


.loader_code : CAPALIGN
{
.loader_code_start = .;
*/loader/boot.cc.o(.text .text.* .rodata .rodata.* .data.rel.ro);
}
.loader_code_end = .;

.loader_data : CAPALIGN
{
.loader_data_start = .;
*/loader/boot.cc.o(.data .data.* .sdata .sdata.* .sbss .sbss.* .bss .bss.*);
}
.loader_data_end = .;

.library_export_tables : ALIGN(8)
{
.token_library_export_table = ALIGN(8);
*/cheriot.token_library.library(.compartment_export_table);
.token_library_export_table_end = .;

.switcher_export_table = ALIGN(8);
*/switcher/entry.S.o(.compartment_export_table);
.switcher_export_table_end = .;

@library_exports@
}

# We link either rwdata or rocode first depending on board config
INCLUDE @firmware_low_ldscript@
INCLUDE @firmware_high_ldscript@
}

# No symbols should be exported
VERSION {
VERSION_1 {
Expand Down
Loading

0 comments on commit 4d75141

Please sign in to comment.