Fix some more signed/unsigned errors in the Tock timer driver.
Tock was using non-raw syscalls for set/stop alarm, which is incorrect
as the return value is a u32 and if the high bit is set, Tock
interprets that return value as an error.
There were also some time values declared as isize instead of usize -
this could potentially break things during timer overflow.
Change-Id: I93563d6b8991ff545244f03aab05ad30506c41b5
diff --git a/src/timer.rs b/src/timer.rs
index 0ab76cc..35af9b1 100644
--- a/src/timer.rs
+++ b/src/timer.rs
@@ -6,10 +6,8 @@
use crate::result::OtherError;
use crate::result::TockError;
use crate::result::TockResult;
-use crate::result::EALREADY;
use crate::syscalls;
use core::cell::Cell;
-use core::isize;
use core::marker::PhantomData;
use core::ops::{Add, AddAssign, Sub};
@@ -39,7 +37,7 @@
fn consume(data: &mut WithCallback<CB>, clock_value: usize, alarm_id: usize, _: usize) {
(data.callback)(
ClockValue {
- num_ticks: clock_value as isize,
+ num_ticks: clock_value as usize,
clock_frequency: data.clock_frequency,
},
Alarm { alarm_id },
@@ -96,7 +94,7 @@
pub fn get_current_clock(&self) -> TockResult<ClockValue> {
Ok(ClockValue {
num_ticks: unsafe {
- syscalls::raw::command(DRIVER_NUMBER, command_nr::GET_CLOCK_VALUE, 0, 0)
+ syscalls::raw::command(DRIVER_NUMBER, command_nr::GET_CLOCK_VALUE, 0, 0) as usize
},
clock_frequency: self.clock_frequency,
})
@@ -154,20 +152,20 @@
#[derive(Copy, Clone, Debug)]
pub struct ClockValue {
- num_ticks: isize,
+ num_ticks: usize,
clock_frequency: ClockFrequency,
}
impl ClockValue {
- pub fn num_ticks(self) -> isize {
+ pub fn num_ticks(self) -> usize {
self.num_ticks
}
- pub fn ms(self) -> isize {
- if self.num_ticks.abs() < isize::MAX / 1000 {
- (1000 * self.num_ticks) / self.clock_frequency.hz() as isize
+ pub fn ms(self) -> usize {
+ if self.num_ticks < usize::MAX / 1000 {
+ (1000 * self.num_ticks) / self.clock_frequency.hz()
} else {
- 1000 * (self.num_ticks / self.clock_frequency.hz() as isize)
+ 1000 * (self.num_ticks / self.clock_frequency.hz())
}
}
@@ -239,8 +237,8 @@
}
}
-impl Timestamp<isize> {
- pub fn from_clock_value(value: ClockValue) -> Timestamp<isize> {
+impl Timestamp<usize> {
+ pub fn from_clock_value(value: ClockValue) -> Timestamp<usize> {
Timestamp { ms: value.ms() }
}
}
@@ -500,18 +498,16 @@
unsafe { Ok(syscalls::raw::command(DRIVER_NUMBER, command_nr::GET_CLOCK_VALUE, 0, 0) as usize) }
}
fn set_alarm_at(instant: usize) -> TockResult<()> {
- syscalls::command(DRIVER_NUMBER, command_nr::SET_ALARM, instant, 0)
- .map(|_| ())
- .map_err(|err| err.into())
+ unsafe {
+ syscalls::raw::command(DRIVER_NUMBER, command_nr::SET_ALARM, instant, 0);
+ Ok(())
+ }
}
fn stop_alarm_at(instant: usize) -> TockResult<()> {
- match syscalls::command(DRIVER_NUMBER, command_nr::STOP_ALARM, instant, 0) {
- Ok(_) => Ok(()),
- Err(error) => match error.return_code {
- EALREADY => Ok(()),
- _ => Err(TockError::Command(error)),
- },
+ unsafe {
+ syscalls::raw::command(DRIVER_NUMBER, command_nr::STOP_ALARM, instant, 0);
+ Ok(())
}
}