Files
OpenSK/patches/libtock-rs/01-alloc-init-feature.patch
kaczmarczyck f25cdd6acc Tock V2 port - rebased and updated (#620)
* Changes from #580

* fixes USB cancel panic

* style fixes

* Update src/env/tock/storage.rs

Co-authored-by: Zach Halvorsen <zhalvorsen@google.com>

---------

Co-authored-by: Zach Halvorsen <zhalvorsen@google.com>
2023-05-05 09:55:16 +02:00

122 lines
4.3 KiB
Diff

diff --git a/apis/buttons/src/lib.rs b/apis/buttons/src/lib.rs
index 565970f..f5d08b5 100644
--- a/apis/buttons/src/lib.rs
+++ b/apis/buttons/src/lib.rs
@@ -135,7 +135,7 @@ mod tests;
// Driver number and command IDs
// -----------------------------------------------------------------------------
-const DRIVER_NUM: u32 = 3;
+pub const DRIVER_NUM: u32 = 3;
// Command IDs
const BUTTONS_COUNT: u32 = 0;
diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml
index a863392..3509a40 100644
--- a/runtime/Cargo.toml
+++ b/runtime/Cargo.toml
@@ -14,6 +14,9 @@ libtock_platform = { path = "../platform" }
[features]
+# Initialize an allocator for access to heap memory
+alloc_init = []
+
# By default, libtock_runtime looks for the LIBTOCK_PLATFORM variable to decide
# what layout file to use. If you are providing your own linker script, set
# no_auto_layout to disable the layout file logic.
diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs
index 1054e41..b5c519a 100644
--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -19,6 +19,7 @@
//! and provide its own layout file.
#![no_std]
+#![feature(strict_provenance)]
#![warn(unsafe_op_in_unsafe_fn)]
pub mod startup;
diff --git a/runtime/src/startup/mod.rs b/runtime/src/startup/mod.rs
index 769bfe9..052479f 100644
--- a/runtime/src/startup/mod.rs
+++ b/runtime/src/startup/mod.rs
@@ -10,6 +10,8 @@ core::arch::global_asm!(include_str!("asm_arm.s"));
#[cfg(target_arch = "riscv32")]
core::arch::global_asm!(include_str!("asm_riscv32.s"));
+static APP_HEAP_SIZE: Option<&'static str> = option_env!("APP_HEAP_SIZE");
+
/// `set_main!` is used to tell `libtock_runtime` where the process binary's
/// `main` function is. The process binary's `main` function must have the
/// signature `FnOnce() -> T`, where T is some concrete type that implements
@@ -83,6 +85,8 @@ extern "C" fn rust_start() -> ! {
extern "Rust" {
fn libtock_unsafe_main() -> !;
static rt_header: RtHeader;
+ #[cfg(feature = "alloc_init")]
+ fn libtock_alloc_init(heap_bottom: *mut u8, heap_size: usize);
}
// TODO: Implement a safe memop API in libtock_platform and migrate these
@@ -92,16 +96,46 @@ extern "C" fn rust_start() -> ! {
// impact the execution of this process.
#[cfg(not(feature = "no_debug_memop"))]
unsafe {
+ // specify the top of the application stack which grows downwards
TockSyscalls::syscall2::<{ syscall_class::MEMOP }>([
10u32.into(),
rt_header.stack_top.into(),
]);
+
+ // specify the start of the application heap which grows upwards
TockSyscalls::syscall2::<{ syscall_class::MEMOP }>([
11u32.into(),
rt_header.initial_break.into(),
]);
}
+ #[cfg(feature = "alloc_init")]
+ {
+ let app_heap_size: usize = match APP_HEAP_SIZE {
+ Some(var) => var
+ .parse()
+ .ok()
+ .expect("could not parse APP_HEAP_SIZE as usize!"),
+ None => 9000,
+ };
+
+ // the heap starts after the `bss` section
+ let app_heap_bottom = unsafe { rt_header.bss_start.add(rt_header.bss_size) };
+
+ assert_eq!(app_heap_bottom.addr(), unsafe {
+ rt_header.bss_start.addr() + rt_header.bss_size
+ });
+
+ let app_heap_end = unsafe { app_heap_bottom.add(app_heap_size) };
+
+ unsafe {
+ // tell the kernel the new app heap break (which is the upper address bound of the process)
+ TockSyscalls::syscall2::<{ syscall_class::MEMOP }>([0u32.into(), app_heap_end.into()]);
+
+ libtock_alloc_init(app_heap_bottom, app_heap_size);
+ }
+ }
+
// Safety: libtock_unsafe_main is defined by the set_main! macro, and its
// signature matches the signature in the `extern` block in this function.
unsafe {
diff --git a/rust-toolchain b/rust-toolchain
index e911a96..d139e12 100644
--- a/rust-toolchain
+++ b/rust-toolchain
@@ -1,7 +1,7 @@
[toolchain]
# See https://rust-lang.github.io/rustup-components-history/ for a list of
# recently nightlies and what components are available for them.
-channel = "nightly-2022-06-10"
+channel = "nightly-2023-02-01"
components = ["clippy", "miri", "rustfmt"]
targets = ["thumbv7em-none-eabi",
"riscv32imac-unknown-none-elf",