diff --git a/src/main.rs b/src/main.rs index 755771196e2e85df464aee29aa96d83a3597fff5..75b754b40a8ab5ce866e91dd6e372d8ecb6f7b18 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,7 +44,6 @@ use libtock::buttons::ButtonState; use libtock::console::Console; use libtock::leds::LedsDriver; use libtock::result::TockResult; -use libtock::syscalls; use libtock::timer; #[cfg(feature = "debug_ctap")] use libtock::timer::Timer; @@ -363,7 +362,7 @@ fn check_user_presence(cid: ChannelID) -> Result<(), Ctap2StatusCode> { let keepalive_alarm = keepalive.set_alarm(KEEPALIVE_DELAY).unwrap(); // Wait for a button touch or an alarm. - syscalls::yieldk_for(|| button_touched.get() || keepalive_expired.get()); + usb_ctap_hid::yieldk_for(|| button_touched.get() || keepalive_expired.get()); // Cleanup alarm callback. match keepalive.stop_alarm(keepalive_alarm) { @@ -403,4 +402,4 @@ fn check_user_presence(cid: ChannelID) -> Result<(), Ctap2StatusCode> { } else { Err(Ctap2StatusCode::CTAP2_ERR_USER_ACTION_TIMEOUT) } -} +} \ No newline at end of file diff --git a/src/usb_ctap_hid.rs b/src/usb_ctap_hid.rs index 8e35151a1c19e36588ec32c2fa22a40c5560762f..07152e1bcba87b9e04f3bc4ba77b6f020418c49a 100644 --- a/src/usb_ctap_hid.rs +++ b/src/usb_ctap_hid.rs @@ -81,7 +81,7 @@ pub fn recv(buf: &mut [u8; 64]) -> bool { return false; } - syscalls::yieldk_for(|| done.get()); + yieldk_for(|| done.get()); true } @@ -104,7 +104,7 @@ pub fn send(buf: &mut [u8; 64]) -> bool { return false; } - syscalls::yieldk_for(|| done.get()); + yieldk_for(|| done.get()); true } @@ -154,7 +154,7 @@ pub fn send_or_recv(buf: &mut [u8; 64]) -> SendOrRecvStatus { return SendOrRecvStatus::Error; } - syscalls::yieldk_for(|| status.get().is_some()); + yieldk_for(|| status.get().is_some()); status.get().unwrap() } @@ -261,7 +261,7 @@ fn recv_with_timeout_detail( return Some(SendOrRecvStatus::Error); } - syscalls::yieldk_for(|| status.get().is_some() || timeout_expired.get()); + yieldk_for(|| status.get().is_some() || timeout_expired.get()); // Cleanup alarm callback. match timeout.stop_alarm(timeout_alarm) { @@ -362,7 +362,7 @@ fn send_or_recv_with_timeout_detail( return Some(SendOrRecvStatus::Error); } - syscalls::yieldk_for(|| status.get().is_some() || timeout_expired.get()); + yieldk_for(|| status.get().is_some() || timeout_expired.get()); // Cleanup alarm callback. match timeout.stop_alarm(timeout_alarm) { @@ -411,3 +411,11 @@ fn send_or_recv_with_timeout_detail( status.get() } + +pub(crate) fn yieldk_for<F: Fn() -> bool>(cond: F) { + while !cond() { + unsafe { + syscalls::raw::yieldk(); + } + } +} \ No newline at end of file