Add physical and virtual address types

Create wrapper types for physical and virtual address to limit available
operations on addresses and to be able to require explicit address types
for given function parameters.

Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: Iaef5ab1af24fc153d959d79404b3827d9c85bf53
diff --git a/src/descriptor.rs b/src/descriptor.rs
index 6f370ec..bf10380 100644
--- a/src/descriptor.rs
+++ b/src/descriptor.rs
@@ -11,6 +11,8 @@
 use crate::kernel_space::KernelSpace;
 use crate::MemoryAttributesIndex;
 
+use super::address::PhysicalAddress;
+
 /// Memory shareability
 #[derive(PrimitiveEnum_u8, Clone, Copy, Debug, PartialEq, Eq, Default)]
 pub enum Shareability {
@@ -151,27 +153,27 @@
     pub fn set_block_descriptor(
         &mut self,
         level: usize,
-        output_address: usize,
+        output_address: PhysicalAddress,
         attributes: Attributes,
     ) {
         let attr: u64 = attributes.into();
 
         assert!(level <= 3);
         assert!(self.get_descriptor_type(level) != DescriptorType::Table);
-        assert_eq!(0, output_address & !Self::get_oa_mask(level));
+        assert_eq!(0, output_address.0 & !Self::get_oa_mask(level));
         assert_eq!(0, attr & !Self::ATTR_MASK);
 
         let table_bit = if level < 3 { 0 } else { Self::TABLE_BIT };
 
-        self.set(Self::VALID_BIT | table_bit | output_address as u64 | attr);
+        self.set(Self::VALID_BIT | table_bit | output_address.0 as u64 | attr);
     }
 
     /// Get output address from the block descriptor
-    pub fn get_block_output_address(&self, level: usize) -> usize {
+    pub fn get_block_output_address(&self, level: usize) -> PhysicalAddress {
         assert!(level <= 3);
         assert_eq!(DescriptorType::Block, self.get_descriptor_type(level));
 
-        (self.get() & Self::OA_MASK) as usize
+        PhysicalAddress((self.get() & Self::OA_MASK) as usize)
     }
 
     /// Set the attributes of the block descriptor
@@ -461,7 +463,7 @@
             cell: UnsafeCell::new(1),
         };
 
-        descriptor.set_block_descriptor(1, 0, Attributes::default());
+        descriptor.set_block_descriptor(1, PhysicalAddress(0), Attributes::default());
         assert_eq!(0x1, descriptor.get());
     }
 
@@ -472,7 +474,7 @@
             cell: UnsafeCell::new(0),
         };
 
-        descriptor.set_block_descriptor(1, 1 << 63, Attributes::default());
+        descriptor.set_block_descriptor(1, PhysicalAddress(1 << 63), Attributes::default());
     }
 
     #[test]
@@ -483,7 +485,7 @@
 
         descriptor.set_block_descriptor(
             1,
-            0x0000000f_c0000000,
+            PhysicalAddress(0x0000000f_c0000000),
             Attributes {
                 uxn: true,
                 ..Default::default()
@@ -497,7 +499,7 @@
 
         descriptor.set_block_descriptor(
             3,
-            0x0000000f_fffff000,
+            PhysicalAddress(0x0000000f_fffff000),
             Attributes {
                 uxn: true,
                 ..Default::default()
@@ -505,7 +507,10 @@
         );
         assert_eq!(0x0040000f_fffff003, descriptor.get());
 
-        assert_eq!(0x0000000f_fffff000, descriptor.get_block_output_address(3));
+        assert_eq!(
+            PhysicalAddress(0x0000000f_fffff000),
+            descriptor.get_block_output_address(3)
+        );
         assert_eq!(
             Attributes {
                 uxn: true,