implement cells and cell conversion for longs
This commit is contained in:
		
							parent
							
								
									45c097553e
								
							
						
					
					
						commit
						32d86a2a5a
					
				
					 3 changed files with 64 additions and 0 deletions
				
			
		
							
								
								
									
										50
									
								
								src/cell_conv.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/cell_conv.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					/// A cell is a single FORTH stack value, all arguments and return values given to OpenFirmware
 | 
				
			||||||
 | 
					/// must fit in a cell.
 | 
				
			||||||
 | 
					pub type Cell = i32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// # DoubleWord
 | 
				
			||||||
 | 
					/// a structure containing a low and high cell
 | 
				
			||||||
 | 
					/// # example
 | 
				
			||||||
 | 
					/// ```
 | 
				
			||||||
 | 
					/// use ofw::cell_conv::DoubleWord;
 | 
				
			||||||
 | 
					/// let value: u64 = 0xabcdef0123456789;
 | 
				
			||||||
 | 
					/// let dw: DoubleWord = value.into();
 | 
				
			||||||
 | 
					/// assert_eq!(dw.high as u32, 0xabcdef01);
 | 
				
			||||||
 | 
					/// assert_eq!(dw.low as u32, 0x23456789);
 | 
				
			||||||
 | 
					/// ```
 | 
				
			||||||
 | 
					#[repr(C)]
 | 
				
			||||||
 | 
					#[derive(Debug, Copy, Clone, PartialEq, Eq)]
 | 
				
			||||||
 | 
					pub struct DoubleWord {
 | 
				
			||||||
 | 
					    pub low: Cell,
 | 
				
			||||||
 | 
					    pub high: Cell,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<i64> for DoubleWord {
 | 
				
			||||||
 | 
					    fn from(dw: i64) -> Self {
 | 
				
			||||||
 | 
					        Self {
 | 
				
			||||||
 | 
					            low: dw as Cell,
 | 
				
			||||||
 | 
					            high: (dw >> 32) as Cell,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<u64> for DoubleWord {
 | 
				
			||||||
 | 
					    fn from(dw: u64) -> Self {
 | 
				
			||||||
 | 
					        Self {
 | 
				
			||||||
 | 
					            low: dw as Cell,
 | 
				
			||||||
 | 
					            high: (dw >> 32) as Cell,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<DoubleWord> for i64 {
 | 
				
			||||||
 | 
					    fn from(dw: DoubleWord) -> Self {
 | 
				
			||||||
 | 
					        (dw.high as i64) << 32 | dw.low as i64
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl From<DoubleWord> for u64 {
 | 
				
			||||||
 | 
					    fn from(dw: DoubleWord) -> Self {
 | 
				
			||||||
 | 
					        (dw.high as u64) << 32 | dw.low as u64
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,9 @@ pub mod ntstr;
 | 
				
			||||||
/// module for architecture-specific code
 | 
					/// module for architecture-specific code
 | 
				
			||||||
pub mod arch;
 | 
					pub mod arch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// # cell_conv
 | 
				
			||||||
 | 
					/// module for converting between OpenFirmware cells and Rust integers
 | 
				
			||||||
 | 
					pub mod cell_conv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
mod tests;
 | 
					mod tests;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/tests.rs
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/tests.rs
									
										
									
									
									
								
							| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
use crate::arch::EntryFunction;
 | 
					use crate::arch::EntryFunction;
 | 
				
			||||||
use crate::{Args, call, call_method, IHandle, method_service_result, ntstr, OFW_FALSE, OFW_TRUE, service_result};
 | 
					use crate::{Args, call, call_method, IHandle, method_service_result, ntstr, OFW_FALSE, OFW_TRUE, service_result};
 | 
				
			||||||
 | 
					use crate::cell_conv::DoubleWord;
 | 
				
			||||||
use crate::ntstr::NTSTR;
 | 
					use crate::ntstr::NTSTR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
| 
						 | 
					@ -9,6 +10,16 @@ fn ntstr_macro() {
 | 
				
			||||||
    assert_eq!(a, b);
 | 
					    assert_eq!(a, b);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn doubleword_conversion() {
 | 
				
			||||||
 | 
					    let a: u64 = 0xabcdef0123456789;
 | 
				
			||||||
 | 
					    let a_dw: DoubleWord = a.into();
 | 
				
			||||||
 | 
					    let b: u64 = a_dw.into();
 | 
				
			||||||
 | 
					    assert_eq!(a, b);
 | 
				
			||||||
 | 
					    assert_eq!(a_dw.high as u32, 0xabcdef01);
 | 
				
			||||||
 | 
					    assert_eq!(a_dw.low as u32, 0x23456789);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
fn call_ofw() {
 | 
					fn call_ofw() {
 | 
				
			||||||
    pub extern "C" fn test_entry_function(args: *mut Args) -> i32 {
 | 
					    pub extern "C" fn test_entry_function(args: *mut Args) -> i32 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue