Add hyperram support on Sonata v1.
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).
Co-authored-by: Nathaniel Wesley Filardo <wes.filardo@scisemi.com>
diff --git a/scripts/run-sonata-sim.sh b/scripts/run-sonata-sim.sh
index 8602bb1..6367b69 100755
--- a/scripts/run-sonata-sim.sh
+++ b/scripts/run-sonata-sim.sh
@@ -4,7 +4,7 @@
# 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
diff --git a/sdk/boards/sonata-prerelease.json b/sdk/boards/sonata-prerelease.json
index 130785d..7f7b327 100644
--- a/sdk/boards/sonata-prerelease.json
+++ b/sdk/boards/sonata-prerelease.json
@@ -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
diff --git a/sdk/firmware.ldscript.in b/sdk/firmware.ldscript.in
index 3ebe9ae..a591c3a 100644
--- a/sdk/firmware.ldscript.in
+++ b/sdk/firmware.ldscript.in
@@ -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 {
diff --git a/sdk/firmware.rocode.ldscript.in b/sdk/firmware.rocode.ldscript.in
new file mode 100644
index 0000000..6adecba
--- /dev/null
+++ b/sdk/firmware.rocode.ldscript.in
@@ -0,0 +1,73 @@
+. = @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 = .;
diff --git a/sdk/firmware.rwdata.ldscript.in b/sdk/firmware.rwdata.ldscript.in
new file mode 100644
index 0000000..299921d
--- /dev/null
+++ b/sdk/firmware.rwdata.ldscript.in
@@ -0,0 +1,222 @@
+#data_start will either be . or some address depending on board config
+. = @data_start@;
+# 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 = .;
+}
+
+# The loader code is placed in the data sections so that it can be used as heap after the loader runs
+.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@
+}
diff --git a/sdk/xmake.lua b/sdk/xmake.lua
index d4e2411..73a8a8a 100644
--- a/sdk/xmake.lua
+++ b/sdk/xmake.lua
@@ -445,6 +445,7 @@
-- This must be after load so that dependencies are resolved.
after_load(function (target)
import("core.base.json")
+ import("core.project.config")
local function visit_all_dependencies(callback)
visit_all_dependencies_of(target, callback)
@@ -558,7 +559,22 @@
mmio = format("__mmio_region_start = 0x%x;\n%s__mmio_region_end = 0x%x;\n__export_mem_heap_end = 0x%x;\n",
mmio_start, mmio, mmio_end, board.heap["end"])
- local code_start = format("0x%x", board.instruction_memory.start)
+ local code_start = format("0x%x", board.instruction_memory.start);
+ -- Put the data either at the specified address if given, or directly after code
+ local data_start = board.data_memory and format("0x%x", board.data_memory.start) or '.';
+ local rwdata_ldscript = path.join(config.buildir(), target:name() .. "-firmware.rwdata.ldscript")
+ local rocode_ldscript = path.join(config.buildir(), target:name() .. "-firmware.rocode.ldscript")
+ if not board.data_memory or (board.instruction_memory.start < board.data_memory.start) then
+ -- If we're not explicilty given a data address or it's lower than the code address
+ -- then code needs to go first in the linker script.
+ firmware_low_ldscript = rocode_ldscript
+ firmware_high_ldscript = rwdata_ldscript
+ else
+ -- Otherwise the data is at a lower address than code (e.g. Sonata with SRAM and hyperram)
+ -- so it needs to go first.
+ firmware_low_ldscript = rwdata_ldscript;
+ firmware_high_ldscript = rocode_ldscript;
+ end
-- Set the start of memory that can be revoked.
-- By default, this is the start of code memory but it can be
@@ -752,8 +768,11 @@
software_revoker_header="",
sealed_objects="",
mmio=mmio,
+ data_start=data_start,
code_start=code_start,
heap_start=heap_start,
+ firmware_low_ldscript=firmware_low_ldscript,
+ firmware_high_ldscript=firmware_high_ldscript,
thread_count=#(threads),
thread_headers=thread_headers,
thread_trusted_stacks=thread_trusted_stacks,
@@ -884,7 +903,9 @@
import("core.project.config")
-- Get a specified linker script, or set the default to the compartment
-- linker script.
- local linkerscript = path.join(config.buildir(), target:name() .. "-firmware.ldscript")
+ local linkerscript1 = path.join(config.buildir(), target:name() .. "-firmware.ldscript")
+ local linkerscript2 = path.join(config.buildir(), target:name() .. "-firmware.rocode.ldscript")
+ local linkerscript3 = path.join(config.buildir(), target:name() .. "-firmware.rwdata.ldscript")
-- Link using the firmware's linker script.
batchcmds:show_progress(opt.progress, "linking firmware " .. target:targetfile())
batchcmds:mkdir(target:targetdir())
@@ -897,11 +918,11 @@
table.insert(objects, dep:targetfile())
end
end)
- batchcmds:vrunv(target:tool("ld"), table.join({"-n", "--script=" .. linkerscript, "--relax", "-o", target:targetfile(), "--compartment-report=" .. target:targetfile() .. ".json" }, objects), opt)
+ batchcmds:vrunv(target:tool("ld"), table.join({"-n", "--script=" .. linkerscript1, "--relax", "-o", target:targetfile(), "--compartment-report=" .. target:targetfile() .. ".json" }, objects), opt)
batchcmds:show_progress(opt.progress, "Creating firmware report " .. target:targetfile() .. ".json")
batchcmds:show_progress(opt.progress, "Creating firmware dump " .. target:targetfile() .. ".dump")
batchcmds:vexecv(target:tool("objdump"), {"-glxsdrS", "--demangle", target:targetfile()}, table.join(opt, {stdout = target:targetfile() .. ".dump"}))
- batchcmds:add_depfiles(linkerscript)
+ batchcmds:add_depfiles(linkerscript1, linkerscript2, linkerscript3)
batchcmds:add_depfiles(objects)
end)
@@ -970,6 +991,8 @@
-- The firmware linker script will be populated based on the set of
-- compartments.
add_configfiles(path.join(scriptdir, "firmware.ldscript.in"), {pattern = "@(.-)@", filename = name .. "-firmware.ldscript"})
+ add_configfiles(path.join(scriptdir, "firmware.rocode.ldscript.in"), {pattern = "@(.-)@", filename = name .. "-firmware.rocode.ldscript"})
+ add_configfiles(path.join(scriptdir, "firmware.rwdata.ldscript.in"), {pattern = "@(.-)@", filename = name .. "-firmware.rwdata.ldscript"})
end
-- Helper to create a library.