diff --git a/src/Cargo.lock b/src/Cargo.lock
index 3217e606..d42c75c5 100644
--- a/src/Cargo.lock
+++ b/src/Cargo.lock
@@ -187,7 +187,7 @@ dependencies = [
[[package]]
name = "libasync"
version = "0.0.0"
-source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#a73df780d0d0e757738f27feac162904f5bf93f9"
+source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#157439bc88cbb18bb40009428acf1fdee800e32e"
dependencies = [
"embedded-hal",
"libcortex_a9",
@@ -199,7 +199,7 @@ dependencies = [
[[package]]
name = "libboard_zynq"
version = "0.0.0"
-source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#a73df780d0d0e757738f27feac162904f5bf93f9"
+source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#157439bc88cbb18bb40009428acf1fdee800e32e"
dependencies = [
"bit_field",
"embedded-hal",
@@ -233,7 +233,7 @@ dependencies = [
[[package]]
name = "libcortex_a9"
version = "0.0.0"
-source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#a73df780d0d0e757738f27feac162904f5bf93f9"
+source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#157439bc88cbb18bb40009428acf1fdee800e32e"
dependencies = [
"bit_field",
"libregister",
@@ -249,7 +249,7 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a"
[[package]]
name = "libregister"
version = "0.0.0"
-source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#a73df780d0d0e757738f27feac162904f5bf93f9"
+source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#157439bc88cbb18bb40009428acf1fdee800e32e"
dependencies = [
"bit_field",
"vcell",
@@ -259,7 +259,7 @@ dependencies = [
[[package]]
name = "libsupport_zynq"
version = "0.0.0"
-source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#a73df780d0d0e757738f27feac162904f5bf93f9"
+source = "git+https://git.m-labs.hk/M-Labs/zynq-rs.git#157439bc88cbb18bb40009428acf1fdee800e32e"
dependencies = [
"compiler_builtins",
"libboard_zynq",
diff --git a/src/Cargo.toml b/src/Cargo.toml
index e68c9bdf..4bc1f769 100644
--- a/src/Cargo.toml
+++ b/src/Cargo.toml
@@ -24,7 +24,7 @@ overflow-checks = false
panic = "abort"
debug = true
codegen-units = 1
-opt-level = 's'
+opt-level = 2
lto = true
[patch.crates-io]
diff --git a/src/runtime/src/kernel/control.rs b/src/runtime/src/kernel/control.rs
index 91fefa31..3ffe1319 100644
--- a/src/runtime/src/kernel/control.rs
+++ b/src/runtime/src/kernel/control.rs
@@ -1,7 +1,7 @@
use libcortex_a9::sync_channel::{Sender, Receiver};
use libsupport_zynq::boot::Core1;
-use super::{CHANNEL_0TO1, CHANNEL_1TO0, INIT_LOCK, Message};
+use super::{CHANNEL_0TO1, CHANNEL_1TO0, CHANNEL_SEM, INIT_LOCK, Message};
use crate::irq::restart_core1;
use core::mem::{forget, replace};
@@ -12,6 +12,7 @@ pub struct Control {
}
fn get_channels() -> (Sender<'static, Message>, Receiver<'static, Message>) {
+ CHANNEL_SEM.wait();
let mut core0_tx = None;
while core0_tx.is_none() {
core0_tx = CHANNEL_0TO1.lock().take();
diff --git a/src/runtime/src/kernel/core1.rs b/src/runtime/src/kernel/core1.rs
index ec2e27cf..94e0e242 100644
--- a/src/runtime/src/kernel/core1.rs
+++ b/src/runtime/src/kernel/core1.rs
@@ -20,6 +20,7 @@ use super::{
rpc::rpc_send_async,
INIT_LOCK,
CHANNEL_0TO1, CHANNEL_1TO0,
+ CHANNEL_SEM,
KERNEL_CHANNEL_0TO1, KERNEL_CHANNEL_1TO0,
KERNEL_IMAGE,
Message,
@@ -159,6 +160,7 @@ pub fn main_core1() {
}
*CHANNEL_0TO1.lock() = Some(core0_tx);
*CHANNEL_1TO0.lock() = Some(core0_rx);
+ CHANNEL_SEM.signal();
// set on load, cleared on start
let mut loaded_kernel = None;
diff --git a/src/runtime/src/kernel/mod.rs b/src/runtime/src/kernel/mod.rs
index e06a6e18..c3bb1fbe 100644
--- a/src/runtime/src/kernel/mod.rs
+++ b/src/runtime/src/kernel/mod.rs
@@ -1,7 +1,7 @@
use core::ptr;
use alloc::{vec::Vec, string::String};
-use libcortex_a9::{mutex::Mutex, sync_channel};
+use libcortex_a9::{mutex::Mutex, sync_channel, semaphore::Semaphore};
use crate::eh_artiq;
mod control;
@@ -48,6 +48,7 @@ pub enum Message {
static CHANNEL_0TO1: Mutex