diff --git a/artiq/compiler/transforms/llvm_ir_generator.py b/artiq/compiler/transforms/llvm_ir_generator.py index 4f68d27a2..a22991720 100644 --- a/artiq/compiler/transforms/llvm_ir_generator.py +++ b/artiq/compiler/transforms/llvm_ir_generator.py @@ -1442,7 +1442,7 @@ class LLVMIRGenerator: llmax = self.map(insn.operands[1]) lltagptr = self._build_subkernel_tags(insn.arg_types) return self.llbuilder.call(self.llbuiltin("subkernel_await_message"), - [ll.Constant(lli32, 0), ll.Constant(lli64, 10_000), lltagptr, llmin, llmax], + [ll.Constant(lli32, -1), ll.Constant(lli64, 10_000), lltagptr, llmin, llmax], name="subkernel.await.args") def process_Closure(self, insn): diff --git a/artiq/firmware/ksupport/lib.rs b/artiq/firmware/ksupport/lib.rs index 5c3946494..0bbb40df1 100644 --- a/artiq/firmware/ksupport/lib.rs +++ b/artiq/firmware/ksupport/lib.rs @@ -528,7 +528,7 @@ extern fn subkernel_send_message(id: u32, is_return: bool, destination: u8, } #[unwind(allowed)] -extern fn subkernel_await_message(id: u32, timeout: i64, tags: &CSlice, min: u8, max: u8) -> u8 { +extern fn subkernel_await_message(id: i32, timeout: i64, tags: &CSlice, min: u8, max: u8) -> u8 { send(&SubkernelMsgRecvRequest { id: id, timeout: timeout, tags: tags.as_ref() }); recv!(SubkernelMsgRecvReply { status, count } => { match status { diff --git a/artiq/firmware/libproto_artiq/kernel_proto.rs b/artiq/firmware/libproto_artiq/kernel_proto.rs index e50178f46..1a2f057b7 100644 --- a/artiq/firmware/libproto_artiq/kernel_proto.rs +++ b/artiq/firmware/libproto_artiq/kernel_proto.rs @@ -108,7 +108,7 @@ pub enum Message<'a> { SubkernelAwaitFinishRequest { id: u32, timeout: i64 }, SubkernelAwaitFinishReply { status: SubkernelStatus }, SubkernelMsgSend { id: u32, destination: Option, count: u8, tag: &'a [u8], data: *const *const () }, - SubkernelMsgRecvRequest { id: u32, timeout: i64, tags: &'a [u8] }, + SubkernelMsgRecvRequest { id: i32, timeout: i64, tags: &'a [u8] }, SubkernelMsgRecvReply { status: SubkernelStatus, count: u8 }, Log(fmt::Arguments<'a>), diff --git a/artiq/firmware/runtime/session.rs b/artiq/firmware/runtime/session.rs index 28c6a92c7..8c1a7aaee 100644 --- a/artiq/firmware/runtime/session.rs +++ b/artiq/firmware/runtime/session.rs @@ -710,14 +710,14 @@ fn process_kern_message(io: &Io, aux_mutex: &Mutex, } #[cfg(has_drtio)] &kern::SubkernelMsgRecvRequest { id, timeout, tags } => { - let message_received = subkernel::message_await(io, _subkernel_mutex, id, timeout); + let message_received = subkernel::message_await(io, _subkernel_mutex, id as u32, timeout); let (status, count) = match message_received { Ok(ref message) => (kern::SubkernelStatus::NoError, message.count), Err(SubkernelError::Timeout) => (kern::SubkernelStatus::Timeout, 0), Err(SubkernelError::IncorrectState) => (kern::SubkernelStatus::IncorrectState, 0), Err(SubkernelError::SubkernelFinished) => { let res = subkernel::retrieve_finish_status(io, aux_mutex, _subkernel_mutex, - routing_table, id)?; + routing_table, id as u32)?; if res.comm_lost { (kern::SubkernelStatus::CommLost, 0) } else if let Some(exception) = &res.exception { diff --git a/artiq/firmware/satman/kernel.rs b/artiq/firmware/satman/kernel.rs index e942aac7a..755b80d16 100644 --- a/artiq/firmware/satman/kernel.rs +++ b/artiq/firmware/satman/kernel.rs @@ -781,6 +781,8 @@ impl Manager { &kern::SubkernelMsgRecvRequest { id, timeout, tags } => { // negative timeout value means no timeout let max_time = if timeout > 0 { clock::get_ms() as i64 + timeout } else { timeout }; + // ID equal to -1 indicates wildcard for receiving arguments + let id = if id == -1 { self.current_id } else { id as u32 }; self.session.kernel_state = KernelState::MsgAwait { id: id, max_time: max_time, tags: tags.to_vec() }; Ok(())