Migrate the assembler invocation into build.rs, and deal with the fallout.
Review feedback indicated I should build libtock_runtime's external assembly files in build.rs rather than checking in a compiled binary. I added the compilation logic to build.rs and removed the assembly script and GitHub workflow.
Adding the compilation logic exposed a layout configuration bug: rust-lld was still picking up generic_layout.ld from the root of the repository! I realize now that the linker script namespace is global rather than relative. As such, I renamed the file to "libtock_layout.ld", so as to prevent collisions with libtock-rs' generic_layout and application repositorys' files. This revealed that I never updated the per-board layout scripts to work with the new layout, so I made that change as well.
Now that `build.rs` correctly fails when you try to build `libtock_runtime` for unsupported architectures (e.g. x86_64), the clippy and miri invocations in `make test` fail. I reconfigured them so they pass and test all platform-independent crates.
Last, I added a Mac OS workflow to see if the changes are compatible with Mac OS. I expect this to take some more revision.
diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml
index 94a8b10..d394011 100644
--- a/.github/workflows/artifacts.yml
+++ b/.github/workflows/artifacts.yml
@@ -12,6 +12,7 @@
- name: Install dependencies
run: |
+ sudo apt-get install binutils-riscv64-unknown-elf
cargo install elf2tab --version 0.4.0
- name: Build Hello World
diff --git a/.github/workflows/assembly.yml b/.github/workflows/assembly.yml
deleted file mode 100644
index 3ac8ceb..0000000
--- a/.github/workflows/assembly.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-# Builds the libtock_runtime entry point assembly, making sure the source code
-# and compiled library match. Outputs the library file as an artifact in case
-# users have a different toolchain version that produces a slightly different
-# library.
-
-name: assembly
-
-# We want to run this on all pull requests. Additionally, Bors needs workflows
-# to run on the `staging` and `trying` branches to block merges on them.
-on:
- pull_request:
- push:
- branches:
- - staging
- - trying
-
-jobs:
- assembly:
- # Using ubuntu-latest can cause breakage when ubuntu-latest is updated to
- # point at a new Ubuntu version. Instead, explicitly specify the version, so
- # we can update when we need to. This *could* break if we don't update it
- # until support for 20.04 is dropped, but it is likely we'll have a reason
- # to update to a newer Ubuntu before then anyway.
- runs-on: ubuntu-20.04
-
- steps:
- # Clones a single commit from the libtock-rs repository. The commit cloned
- # is a merge commit between the PR's target branch and the PR's source.
- # We'll later add another commit (the pre-merge target branch) to the
- # repository.
- - name: Clone repository
- uses: actions/checkout@v2.3.0
-
- # Build the entry point assembly.
- - name: Build assembly
- run: |
- sudo apt-get install binutils-riscv64-linux-gnu
- core/runtime/asm/assemble.sh
-
- # Publish the built assembly library.
- - name: Upload assembly library
- uses: actions/upload-artifact@v2
- with:
- name: assembly
- path: core/runtime/asm/*.a
-
- # The main goal of this is to verify the built library matches the PR's
- # library, although this check has the secondary benefit of catching any
- # intermediate files left behind by assemble.sh
- - name: Check assembly library diff
- run: git diff --quiet
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5bdae5f..6631920 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -37,6 +37,7 @@
# GitHub Actions at the time of this writing.
- name: Build and Test
run: |
+ sudo apt-get install binutils-riscv64-unknown-elf
cd "${GITHUB_WORKSPACE}"
make -j2 setup
make -j2 test
diff --git a/.github/workflows/mac_os.yml b/.github/workflows/mac_os.yml
new file mode 100644
index 0000000..b04b51b
--- /dev/null
+++ b/.github/workflows/mac_os.yml
@@ -0,0 +1,39 @@
+# This workflow verifies libtock-rs is usable on Mac OS.
+
+name: ci-mac-os
+
+# We want to run CI on all pull requests. Additionally, Bors needs workflows to
+# run on the `staging` and `trying` branches.
+on:
+ pull_request:
+ push:
+ branches:
+ - staging
+ - trying
+
+jobs:
+ ci-mac-os:
+ runs-on: macos-10.15
+
+ steps:
+ # Clones a single commit from the libtock-rs repository. The commit cloned
+ # is a merge commit between the PR's target branch and the PR's source.
+ # Note that we checkout submodules so that we can invoke Tock's CI setup
+ # scripts, but we do not recursively checkout submodules as we need Tock's
+ # makefile to set up the qemu submodule itself.
+ - name: Clone repository
+ uses: actions/checkout@v2.3.0
+ with:
+ submodules: true
+
+ # Install the toolchains we need, the run the Makefile's test action. We
+ # let the makefile do most of the work because the makefile can be tested
+ # locally. Using -j2 because the Actions VMs have 2 cores.
+ - name: Build and Test
+ run: |
+ brew tap riscv/riscv
+ brew update
+ brew install riscv-gnu-toolchain --with-multilib
+ cd "${GITHUB_WORKSPACE}"
+ make -j2 setup
+ make -j2 test
diff --git a/.github/workflows/size-diff.yml b/.github/workflows/size-diff.yml
index cbf2939..b991c5f 100644
--- a/.github/workflows/size-diff.yml
+++ b/.github/workflows/size-diff.yml
@@ -39,6 +39,7 @@
# master.
- name: Compute sizes
run: |
+ sudo apt-get install binutils-riscv64-unknown-elf
UPSTREAM_REMOTE_NAME="${UPSTREAM_REMOTE_NAME:-origin}"
GITHUB_BASE_REF="${GITHUB_BASE_REF:-master}"
cd "${GITHUB_WORKSPACE}"
diff --git a/Makefile b/Makefile
index da40d28..e228ab3 100644
--- a/Makefile
+++ b/Makefile
@@ -79,8 +79,9 @@
.PHONY: test
test: examples test-qemu-hifive
LIBTOCK_PLATFORM=nrf52 PLATFORM=nrf52 cargo fmt --all -- --check
- LIBTOCK_PLATFORM=nrf52 PLATFORM=nrf52 cargo clippy --workspace --all-targets
- LIBTOCK_PLATFORM=nrf52 PLATFORM=nrf52 cargo miri test --workspace
+ PLATFORM=nrf52 cargo clippy --all-targets --exclude libtock_runtime --workspace
+ LIBTOCK_PLATFORM=hifive1 cargo clippy --target=riscv32imac-unknown-none-elf -p libtock_runtime
+ PLATFORM=nrf52 cargo miri test --exclude libtock_runtime --workspace
echo '[ SUCCESS ] libtock-rs tests pass'
.PHONY: analyse-stack-sizes
diff --git a/bors.toml b/bors.toml
index 3faebdc..dfae601 100644
--- a/bors.toml
+++ b/bors.toml
@@ -1,5 +1,5 @@
status = [
- "assembly",
"ci",
+ "ci-mac-os",
"size-diff",
]
diff --git a/core/runtime/asm/assemble.sh b/core/runtime/asm/assemble.sh
deleted file mode 100755
index d07e2ab..0000000
--- a/core/runtime/asm/assemble.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# Switch into the directory this script is in, in case it was run from another
-# location.
-cd "$(dirname "$0")"
-
-# Our CI runs in GitHub Actions' Ubuntu 20.04 image. The only RISC-V toolchain
-# in Ubuntu 20.04's repositories is for riscv64-linux-gnu. Fortunately, this
-# toolchain can output 32-bit RISC-V assembly using the -march= option, and the
-# fact it is targeted at GNU/Linux doesn't matter for our short handwritten
-# assembly segment.
-#
-# Although we also support rv32imac targets, we do not need to separately
-# assemble for it, as asm_riscv32.S does not use atomic instructions.
-riscv64-linux-gnu-as -march=rv32imc asm_riscv32.S -o riscv32.o
-# For some reason, riscv64-linux-gnu-as includes local symbols in its output.
-# This pollutes the output of `objdump`, making debugging more difficult. This
-# strips the extra symbols to keep the disassembly readable.
-riscv64-linux-gnu-strip -K start -K rust_start riscv32.o
-
-# Remove the archive file in case there is something unexpected in it (so that
-# issues cannot persist across calls to this script).
-rm -f libriscv32.a
-# c == do not complain if archive needs to be created
-# r == insert or replace file in archive
-riscv64-linux-gnu-ar cr libriscv32.a riscv32.o
-# Remove riscv32.o as it is an intermediate build artifact.
-rm riscv32.o
diff --git a/core/runtime/asm/libriscv32.a b/core/runtime/asm/libriscv32.a
deleted file mode 100644
index f6139a7..0000000
--- a/core/runtime/asm/libriscv32.a
+++ /dev/null
Binary files differ
diff --git a/core/runtime/build.rs b/core/runtime/build.rs
index d0281b5..347d82c 100644
--- a/core/runtime/build.rs
+++ b/core/runtime/build.rs
@@ -1,6 +1,8 @@
use std::fs::copy;
use std::path::PathBuf;
+mod extern_asm;
+
// auto_layout() identifies the correct linker scripts to use based on the
// LIBTOCK_PLATFORM environment variable, and copies the linker scripts into
// OUT_DIR. The cargo invocation must pass -C link-arg=-Tlayout.ld to rustc
@@ -8,7 +10,7 @@
#[cfg(not(feature = "no_auto_layout"))]
fn auto_layout(out_dir: &str) {
const PLATFORM_CFG_VAR: &str = "LIBTOCK_PLATFORM";
- const LAYOUT_GENERIC_FILENAME: &str = "layout_generic.ld";
+ const LAYOUT_GENERIC_FILENAME: &str = "libtock_layout.ld";
// Note: we need to print these rerun-if commands before using the variable
// or file, so that if the build script fails cargo knows when to re-run it.
@@ -49,7 +51,9 @@
#[cfg(not(feature = "no_auto_layout"))]
auto_layout(out_dir);
- // This link search path is used by both auto_layout() and extern_asm().
- // TODO: Add external assembly and extern_asm().
+ extern_asm::build_and_link(out_dir);
+
+ // This link search path is used by both auto_layout() and
+ // extern_asm::build_and_link().
println!("cargo:rustc-link-search={}", out_dir);
}
diff --git a/core/runtime/extern_asm.rs b/core/runtime/extern_asm.rs
new file mode 100644
index 0000000..1f9419a
--- /dev/null
+++ b/core/runtime/extern_asm.rs
@@ -0,0 +1,133 @@
+//! Build script module for compiling the external assembly (used for the entry
+//! point) and linking it into the process binary. Requires out_dir to be added
+//! to rustc's link search path.
+
+pub(crate) fn build_and_link(out_dir: &str) {
+ use std::env::var;
+ let arch = var("CARGO_CFG_TARGET_ARCH").expect("Unable to read CARGO_CFG_TARGET_ARCH");
+
+ // Identify the toolchain configurations to try for the target architecture.
+ // We support trying multiple toolchains because not all toolchains are
+ // available on every OS that we want to support development on.
+ let build_configs = match arch.as_str() {
+ "riscv32" => &[
+ // First try riscv64-unknown-elf, as it is the toolchain used by
+ // libtock-c.
+ AsmBuildConfig {
+ triple: "riscv64-unknown-elf",
+ as_extra_args: &["-march=rv32imc"],
+ strip: true,
+ },
+ // Second try riscv64-linux-gnu, as riscv64-unknown-elf is
+ // unavailable on Debian 10.
+ AsmBuildConfig {
+ triple: "riscv64-linux-gnu",
+ as_extra_args: &["-march=rv32imc"],
+ strip: true,
+ },
+ ],
+ unknown_arch => {
+ panic!("Unsupported architecture {}", unknown_arch);
+ }
+ };
+
+ // Loop through toolchain configs until one works.
+ for &build_config in build_configs {
+ if try_build(&arch, build_config, out_dir).is_ok() {
+ return;
+ }
+ }
+}
+
+#[derive(Clone, Copy)]
+struct AsmBuildConfig {
+ // Triple name, which is prepended to the command names.
+ triple: &'static str,
+
+ // Extra arguments to pass to the assembler.
+ as_extra_args: &'static [&'static str],
+
+ // Do we need to strip the object file before packing it into the library
+ // archive? This should be set to true on platforms where the assembler adds
+ // local symbols to the object file.
+ strip: bool,
+}
+
+// Indicates the toolchain in the build config is unavailable.
+struct ToolchainUnavailable;
+
+fn try_build(
+ arch: &str,
+ build_config: AsmBuildConfig,
+ out_dir: &str,
+) -> Result<(), ToolchainUnavailable> {
+ use std::path::PathBuf;
+ use std::process::Command;
+
+ // Invoke the assembler to produce an object file.
+ let asm_source = &format!("asm/asm_{}.S", arch);
+ let obj_file_path = [out_dir, "libtock_rt_asm.o"].iter().collect::<PathBuf>();
+ let obj_file = obj_file_path.to_str().expect("Non-Unicode obj_file_path");
+ let as_result = Command::new(format!("{}-as", build_config.triple))
+ .args(build_config.as_extra_args)
+ .args(&[asm_source, "-o", obj_file])
+ .status();
+
+ match as_result {
+ Err(error) => {
+ if error.kind() == std::io::ErrorKind::NotFound {
+ // This `as` command does not exist. Return an error so
+ // build_an_link can try another config (if one is available).
+ return Err(ToolchainUnavailable);
+ } else {
+ panic!("Error invoking assembler: {}", error);
+ }
+ }
+ Ok(status) => {
+ assert!(status.success(), "Assembler returned an error");
+ }
+ }
+
+ // At this point, we know this toolchain is installed. We will fail if later
+ // commands are uninstalled rather than trying a different build config.
+
+ println!("cargo:rerun-if-changed={}", asm_source);
+
+ // Run `strip` if necessary.
+ if build_config.strip {
+ let strip_cmd = format!("{}-strip", build_config.triple);
+ let status = Command::new(&strip_cmd)
+ .args(&["-K", "start", "-K", "rust_start", obj_file])
+ .status()
+ .unwrap_or_else(|_| panic!("Failed to invoke {}", strip_cmd));
+ assert!(status.success(), "{} returned an error", strip_cmd);
+ }
+
+ // Remove the archive file in case there is something unexpected in it. This
+ // prevents issues from persisting across invocations of this script.
+ const ARCHIVE_NAME: &str = "tock_rt_asm";
+ let archive_path: PathBuf = [out_dir, &format!("lib{}.a", ARCHIVE_NAME)]
+ .iter()
+ .collect();
+ if let Err(error) = std::fs::remove_file(&archive_path) {
+ if error.kind() != std::io::ErrorKind::NotFound {
+ panic!("Unable to remove archive file {}", archive_path.display());
+ }
+ }
+
+ // Create the library archive.
+ let ar_cmd = format!("{}-ar", build_config.triple);
+ let archive = archive_path.to_str().expect("Non-Unicode archive_path");
+ let status = std::process::Command::new(&ar_cmd)
+ // c == Do not complain if archive needs to be created.
+ // r == Insert or replace file in archive.
+ .args(&["cr", archive, obj_file])
+ .status()
+ .unwrap_or_else(|_| panic!("Failed to invoke {}", ar_cmd));
+ assert!(status.success(), "{} returned an error", ar_cmd);
+
+ // Tell rustc to link the binary against the library archive.
+ println!("cargo:rustc-link-lib=static={}", ARCHIVE_NAME);
+
+ Ok(())
+}
diff --git a/core/runtime/layouts/apollo3.ld b/core/runtime/layouts/apollo3.ld
index 8713c27..464cf98 100644
--- a/core/runtime/layouts/apollo3.ld
+++ b/core/runtime/layouts/apollo3.ld
@@ -1,11 +1,9 @@
/* Layout for the Apollo3 MCU, used by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x00040040, LENGTH = 0x0005FFC0
- SRAM (rwx) : ORIGIN = 0x10002000, LENGTH = 0x2000
+ FLASH (X) : ORIGIN = 0x00040000, LENGTH = 0x00060000
+ RAM (W) : ORIGIN = 0x10002000, LENGTH = 0x2000
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/hail.ld b/core/runtime/layouts/hail.ld
index 179a883..db48142 100644
--- a/core/runtime/layouts/hail.ld
+++ b/core/runtime/layouts/hail.ld
@@ -1,11 +1,9 @@
/* Layout for the Hail board, used by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x00030040, LENGTH = 0x0005FFC0
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 62K
+ FLASH (X) : ORIGIN = 0x00030000, LENGTH = 0x00060000
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 62K
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/hifive1.ld b/core/runtime/layouts/hifive1.ld
index 20294ce..78dc51b 100644
--- a/core/runtime/layouts/hifive1.ld
+++ b/core/runtime/layouts/hifive1.ld
@@ -1,18 +1,12 @@
/* Layout for the RISC-V 32 boards, used by the examples in this repository. */
MEMORY {
- /*
- * The TBF header can change in size so use 0x40 combined with
- * --protected-region-size with elf2tab to cover a header upto that
- * size.
- *
- * Note that the SRAM address may need to be changed depending on
+ /* Note that the SRAM address may need to be changed depending on
* the kernel binary, check for the actual address of APP_MEMORY!
*/
- FLASH (rx) : ORIGIN = 0x20040040, LENGTH = 32M
- SRAM (rwx) : ORIGIN = 0x80002400, LENGTH = 0x1C00
+ FLASH (X) : ORIGIN = 0x20040000, LENGTH = 32M
+ RAM (W) : ORIGIN = 0x80002400, LENGTH = 0x1C00
}
-MPU_MIN_ALIGN = 1K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/imxrt1050.ld b/core/runtime/layouts/imxrt1050.ld
index 3e7f904..1458870 100644
--- a/core/runtime/layouts/imxrt1050.ld
+++ b/core/runtime/layouts/imxrt1050.ld
@@ -1,11 +1,9 @@
/* Layout for the iMX.RT1050 board, used by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x63002040, LENGTH = 0xFFFFC0
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 112K
+ FLASH (X) : ORIGIN = 0x63002000, LENGTH = 0x1000000
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 112K
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/msp432.ld b/core/runtime/layouts/msp432.ld
index 2c9d2a4..170d4b1 100644
--- a/core/runtime/layouts/msp432.ld
+++ b/core/runtime/layouts/msp432.ld
@@ -1,9 +1,7 @@
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x00020040, LENGTH = 0x0001FFC0
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 0x2000
+ FLASH (X) : ORIGIN = 0x00020000, LENGTH = 0x00020000
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 0x2000
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/nrf52.ld b/core/runtime/layouts/nrf52.ld
index 942e86b..fbbcdc3 100644
--- a/core/runtime/layouts/nrf52.ld
+++ b/core/runtime/layouts/nrf52.ld
@@ -1,11 +1,9 @@
/* Layout for the nRF52-DK, used by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x00030040, LENGTH = 0x0005FFC0
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 62K
+ FLASH (X) : ORIGIN = 0x00030000, LENGTH = 0x00060000
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 62K
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/nrf52840.ld b/core/runtime/layouts/nrf52840.ld
index 31bf346..06b6f6b 100644
--- a/core/runtime/layouts/nrf52840.ld
+++ b/core/runtime/layouts/nrf52840.ld
@@ -1,11 +1,9 @@
/* Layout for the nRF52840-DK, usable by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x00030040, LENGTH = 0x000CFFC0
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 62K
+ FLASH (X) : ORIGIN = 0x00030000, LENGTH = 0x000D0000
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 62K
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/nucleo_f429zi.ld b/core/runtime/layouts/nucleo_f429zi.ld
index 3e407b4..a9c634a 100644
--- a/core/runtime/layouts/nucleo_f429zi.ld
+++ b/core/runtime/layouts/nucleo_f429zi.ld
@@ -1,11 +1,9 @@
/* Layout for the Nucleo F429zi, used by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x08040040, LENGTH = 255K
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 112K
+ FLASH (X) : ORIGIN = 0x08040000, LENGTH = 255K
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 112K
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/nucleo_f446re.ld b/core/runtime/layouts/nucleo_f446re.ld
index 83e698b..d3953f5 100644
--- a/core/runtime/layouts/nucleo_f446re.ld
+++ b/core/runtime/layouts/nucleo_f446re.ld
@@ -1,11 +1,9 @@
/* Layout for the Nucleo F446re, used by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x08040040, LENGTH = 255K
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 176K
+ FLASH (X) : ORIGIN = 0x08040000, LENGTH = 255K
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 176K
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/opentitan.ld b/core/runtime/layouts/opentitan.ld
index ada781c..50ea340 100644
--- a/core/runtime/layouts/opentitan.ld
+++ b/core/runtime/layouts/opentitan.ld
@@ -1,18 +1,12 @@
/* Layout for the RISC-V 32 boards, used by the examples in this repository. */
MEMORY {
- /*
- * The TBF header can change in size so use 0x40 combined with
- * --protected-region-size with elf2tab to cover a header upto that
- * size.
- *
- * Note that the SRAM address may need to be changed depending on
+ /* Note that the SRAM address may need to be changed depending on
* the kernel binary, check for the actual address of APP_MEMORY!
*/
- FLASH (rx) : ORIGIN = 0x20030040, LENGTH = 32M
- SRAM (rwx) : ORIGIN = 0x10004000, LENGTH = 512K
+ FLASH (X) : ORIGIN = 0x20030000, LENGTH = 32M
+ RAM (W) : ORIGIN = 0x10004000, LENGTH = 512K
}
-MPU_MIN_ALIGN = 1K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layouts/stm32f3discovery.ld b/core/runtime/layouts/stm32f3discovery.ld
index 9368003..05b0b54 100644
--- a/core/runtime/layouts/stm32f3discovery.ld
+++ b/core/runtime/layouts/stm32f3discovery.ld
@@ -1,11 +1,9 @@
/* Layout for the stm32f3discovery board, usable by the examples in this repository. */
MEMORY {
- /* The application region is 64 bytes (0x40) */
- FLASH (rx) : ORIGIN = 0x08020040, LENGTH = 0x00020000
- SRAM (rwx) : ORIGIN = 0x20004000, LENGTH = 48K
+ FLASH (X) : ORIGIN = 0x08020000, LENGTH = 0x00020000
+ RAM (W) : ORIGIN = 0x20004000, LENGTH = 48K
}
-MPU_MIN_ALIGN = 8K;
-
-INCLUDE layout_generic.ld
+TBF_HEADER_SIZE = 0x40;
+INCLUDE libtock_layout.ld
diff --git a/core/runtime/layout_generic.ld b/core/runtime/libtock_layout.ld
similarity index 100%
rename from core/runtime/layout_generic.ld
rename to core/runtime/libtock_layout.ld