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>
This commit is contained in:
121
patches/libtock-rs/01-alloc-init-feature.patch
Normal file
121
patches/libtock-rs/01-alloc-init-feature.patch
Normal file
@@ -0,0 +1,121 @@
|
||||
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",
|
||||
@@ -1,12 +0,0 @@
|
||||
diff --git a/core/src/stack_size.rs b/core/src/stack_size.rs
|
||||
index 9145393..ef55383 100644
|
||||
--- a/core/src/stack_size.rs
|
||||
+++ b/core/src/stack_size.rs
|
||||
@@ -14,6 +14,7 @@ macro_rules! stack_size {
|
||||
{$size:expr} => {
|
||||
#[no_mangle]
|
||||
#[link_section = ".stack_buffer"]
|
||||
+ #[cfg(not(target_os = "macos"))]
|
||||
pub static mut STACK_MEMORY: [u8; $size] = [0; $size];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user