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
 | 
			
		||||
pub mod arch;
 | 
			
		||||
 | 
			
		||||
/// # cell_conv
 | 
			
		||||
/// module for converting between OpenFirmware cells and Rust integers
 | 
			
		||||
pub mod cell_conv;
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										11
									
								
								src/tests.rs
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								src/tests.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
use crate::arch::EntryFunction;
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
| 
						 | 
				
			
			@ -9,6 +10,16 @@ fn ntstr_macro() {
 | 
			
		|||
    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]
 | 
			
		||||
fn call_ofw() {
 | 
			
		||||
    pub extern "C" fn test_entry_function(args: *mut Args) -> i32 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue