Refactor Xlat Debug implementations

* Force hexadecimal formatting for addresses
* Convert Xlat::print into Debug implementation

Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: Ibaa8c2cbc2f3bf567f32df97755af38c7c96b86a
diff --git a/src/lib.rs b/src/lib.rs
index e8bd6eb..846351d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,6 +7,7 @@
 
 extern crate alloc;
 
+use core::fmt;
 use core::iter::zip;
 use core::panic;
 
@@ -14,7 +15,6 @@
 use alloc::format;
 use alloc::string::String;
 use block::{Block, BlockIterator};
-use log::debug;
 
 use bitflags::bitflags;
 use packed_struct::prelude::*;
@@ -111,11 +111,13 @@
     }
 }
 
+#[derive(Debug)]
 pub enum RegimeVaRange {
     Lower,
     Upper,
 }
 
+#[derive(Debug)]
 pub enum TranslationRegime {
     EL1_0(RegimeVaRange, u8), // EL1 and EL0 stage 1, TTBRx_EL1
     #[cfg(target_feature = "vh")]
@@ -487,28 +489,18 @@
         }
     }
 
-    /// Prints the translation tables to debug console recursively
-    pub fn print(&self) {
-        debug!("Xlat table -> {:#010x}", self.base_table.get_pa().0 as u64);
-        Self::print_table(
-            self.granule.initial_lookup_level(),
-            0,
-            unsafe { self.base_table.get_as_slice() },
-            self.granule,
-        );
-    }
-
     /// Prints a single translation table to the debug console
     /// # Arguments
     /// * level: Level of the translation table
     /// * va: Base virtual address of the table
     /// * table: Table entries
-    pub fn print_table(
+    fn dump_table(
+        f: &mut fmt::Formatter<'_>,
         level: isize,
         va: usize,
         table: &[Descriptor],
         granule: TranslationGranule<VA_BITS>,
-    ) {
+    ) -> fmt::Result {
         let level_prefix = match level {
             0 | 1 => "|-",
             2 => "|  |-",
@@ -517,26 +509,32 @@
 
         for (descriptor, va) in zip(table, (va..).step_by(granule.block_size_at_level(level))) {
             match descriptor.get_descriptor_type(level) {
-                DescriptorType::Block => debug!(
-                    "{} {:#010x} Block -> {:#010x}",
-                    level_prefix,
-                    va,
-                    descriptor.get_block_output_address(granule, level).0
-                ),
+                DescriptorType::Block => {
+                    writeln!(
+                        f,
+                        "{} {:#010x} Block -> {:#010x}",
+                        level_prefix,
+                        va,
+                        descriptor.get_block_output_address(granule, level).0
+                    )?;
+                }
                 DescriptorType::Table => {
                     let next_level_table =
                         unsafe { descriptor.get_next_level_table(granule, level) };
-                    debug!(
+                    writeln!(
+                        f,
                         "{} {:#010x} Table -> {:#010x}",
                         level_prefix,
                         va,
                         next_level_table.as_ptr() as usize
-                    );
-                    Self::print_table(level + 1, va, next_level_table, granule);
+                    )?;
+                    Self::dump_table(f, level + 1, va, next_level_table, granule)?;
                 }
                 _ => {}
             }
         }
+
+        Ok(())
     }
 
     /// Adds memory region from the translation table. The function splits the region to blocks and
@@ -918,3 +916,24 @@
         }
     }
 }
+
+impl<const VA_BITS: usize> fmt::Debug for Xlat<VA_BITS> {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> core::fmt::Result {
+        f.debug_struct("Xlat")
+            .field("regime", &self.regime)
+            .field("granule", &self.granule)
+            .field("VA_BITS", &VA_BITS)
+            .field("base_table", &self.base_table.get_pa())
+            .finish()?;
+
+        Self::dump_table(
+            f,
+            self.granule.initial_lookup_level(),
+            0,
+            unsafe { self.base_table.get_as_slice() },
+            self.granule,
+        )?;
+
+        Ok(())
+    }
+}