vmbase: Move crosvm layout to aarch64

Crosvm provide architecture specific memory layout and set of peripheral devices. This commit move layout definition to aarch64 specific code directories as  a preparation before adding new CPU architecture.

Bug: 362733888
Test: m libvmbase

Change-Id: Ia8e82eb928d5fdc444581ca6fee145d2324a3591
diff --git a/libs/libvmbase/src/arch.rs b/libs/libvmbase/src/arch.rs
index 5cb578b..d6095e5 100644
--- a/libs/libvmbase/src/arch.rs
+++ b/libs/libvmbase/src/arch.rs
@@ -20,6 +20,9 @@
 #[cfg(target_arch = "aarch64")]
 pub use aarch64::platform;
 
+#[cfg(target_arch = "aarch64")]
+pub use aarch64::layout;
+
 /// Write with well-defined compiled behavior.
 ///
 /// See https://github.com/rust-lang/rust/issues/131894
@@ -47,7 +50,6 @@
             let line_size = aarch64::min_dcache_line_size();
             let end = start + size;
             let start = crate::util::unchecked_align_down(start, line_size);
-
             for line in (start..end).step_by(line_size) {
                 crate::dc!("cvau", line);
             }
diff --git a/libs/libvmbase/src/arch/aarch64.rs b/libs/libvmbase/src/arch/aarch64.rs
index 068e001..86a3a03 100644
--- a/libs/libvmbase/src/arch/aarch64.rs
+++ b/libs/libvmbase/src/arch/aarch64.rs
@@ -14,6 +14,7 @@
 
 //! Wrappers of assembly calls.
 
+pub mod layout;
 pub mod platform;
 
 /// Reads a value from a system register.
diff --git a/libs/libvmbase/src/layout/crosvm.rs b/libs/libvmbase/src/arch/aarch64/layout.rs
similarity index 62%
rename from libs/libvmbase/src/layout/crosvm.rs
rename to libs/libvmbase/src/arch/aarch64/layout.rs
index 39a8147..fe72919 100644
--- a/libs/libvmbase/src/layout/crosvm.rs
+++ b/libs/libvmbase/src/arch/aarch64/layout.rs
@@ -16,7 +16,9 @@
 //!
 //! https://crosvm.dev/book/appendix/memory_layout.html#common-layout
 
+use crate::memory::page_4kb_of;
 use core::ops::Range;
+use static_assertions::const_assert_eq;
 
 /// The start address of MMIO space.
 pub const MMIO_START: usize = 0x0;
@@ -33,3 +35,18 @@
 
 /// Size of the FDT region as defined by crosvm, both in kernel and BIOS modes.
 pub const FDT_MAX_SIZE: usize = 2 << 20;
+
+/// First address that can't be translated by a level 1 TTBR0_EL1.
+pub const MAX_VIRT_ADDR: usize = 1 << 40;
+
+/// Base memory-mapped addresses of the UART devices.
+///
+/// See SERIAL_ADDR in https://crosvm.dev/book/appendix/memory_layout.html#common-layout.
+pub const UART_ADDRESSES: [usize; 4] = [0x3f8, 0x2f8, 0x3e8, 0x2e8];
+
+/// Address of the single page containing all the UART devices.
+pub const UART_PAGE_ADDR: usize = 0;
+const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[0]));
+const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[1]));
+const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[2]));
+const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[3]));
diff --git a/libs/libvmbase/src/entry.rs b/libs/libvmbase/src/entry.rs
index b681aea..1bd38ca 100644
--- a/libs/libvmbase/src/entry.rs
+++ b/libs/libvmbase/src/entry.rs
@@ -15,9 +15,8 @@
 //! Rust entry point.
 
 use crate::{
-    bionic, console, heap,
-    layout::{UART_ADDRESSES, UART_PAGE_ADDR},
-    logger,
+    arch::layout::{UART_ADDRESSES, UART_PAGE_ADDR},
+    bionic, console, heap, logger,
     memory::{switch_to_dynamic_page_tables, PAGE_SIZE, SIZE_16KB, SIZE_4KB},
     power::{reboot, shutdown},
     rand,
diff --git a/libs/libvmbase/src/exceptions.rs b/libs/libvmbase/src/exceptions.rs
index b04cb16..5965bda 100644
--- a/libs/libvmbase/src/exceptions.rs
+++ b/libs/libvmbase/src/exceptions.rs
@@ -15,8 +15,8 @@
 //! Helper functions and structs for exception handlers.
 
 use crate::{
+    arch::aarch64::layout::UART_PAGE_ADDR,
     eprintln,
-    layout::UART_PAGE_ADDR,
     memory::{page_4kb_of, MemoryTrackerError, MEMORY},
     read_sysreg,
 };
diff --git a/libs/libvmbase/src/layout.rs b/libs/libvmbase/src/layout.rs
index 4c45eb2..56d689d 100644
--- a/libs/libvmbase/src/layout.rs
+++ b/libs/libvmbase/src/layout.rs
@@ -16,33 +16,24 @@
 
 #![allow(unused_unsafe)]
 
-pub mod crosvm;
-
+#[cfg(target_arch = "aarch64")]
 use crate::linker::__stack_chk_guard;
-use crate::memory::{max_stack_size, page_4kb_of, PAGE_SIZE};
+use crate::memory::{max_stack_size, PAGE_SIZE};
+#[cfg(target_arch = "aarch64")]
 use aarch64_paging::paging::VirtualAddress;
 use core::ops::Range;
-use static_assertions::const_assert_eq;
+
+#[cfg(target_arch = "aarch64")]
+pub use crate::arch::aarch64::layout as crosvm;
 
 /// First address that can't be translated by a level 1 TTBR0_EL1.
 pub const MAX_VIRT_ADDR: usize = 1 << 40;
 
-/// Base memory-mapped addresses of the UART devices.
-///
-/// See SERIAL_ADDR in https://crosvm.dev/book/appendix/memory_layout.html#common-layout.
-pub const UART_ADDRESSES: [usize; 4] = [0x3f8, 0x2f8, 0x3e8, 0x2e8];
-
-/// Address of the single page containing all the UART devices.
-pub const UART_PAGE_ADDR: usize = 0;
-const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[0]));
-const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[1]));
-const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[2]));
-const_assert_eq!(UART_PAGE_ADDR, page_4kb_of(UART_ADDRESSES[3]));
-
 /// Get an address from a linker-defined symbol.
 #[macro_export]
 macro_rules! linker_addr {
     ($symbol:ident) => {{
+        #[cfg(target_arch = "aarch64")]
         let addr = (&raw const $crate::linker::$symbol) as usize;
         VirtualAddress(addr)
     }};
@@ -54,7 +45,6 @@
     ($begin:ident,$end:ident) => {{
         let start = linker_addr!($begin);
         let end = linker_addr!($end);
-
         start..end
     }};
 }
@@ -110,8 +100,9 @@
 }
 
 /// Range of the page at UART_PAGE_ADDR of PAGE_SIZE.
+#[cfg(target_arch = "aarch64")]
 pub fn console_uart_page() -> Range<VirtualAddress> {
-    VirtualAddress(UART_PAGE_ADDR)..VirtualAddress(UART_PAGE_ADDR + PAGE_SIZE)
+    VirtualAddress(crosvm::UART_PAGE_ADDR)..VirtualAddress(crosvm::UART_PAGE_ADDR + PAGE_SIZE)
 }
 
 /// Read-write data (original).
diff --git a/libs/libvmbase/src/memory/shared.rs b/libs/libvmbase/src/memory/shared.rs
index 7e5e7e9..a4eb93a 100644
--- a/libs/libvmbase/src/memory/shared.rs
+++ b/libs/libvmbase/src/memory/shared.rs
@@ -74,7 +74,7 @@
         let base = unchecked_align_down(phys, self.granule);
 
         // TODO(ptosi): Share the UART using this method and remove the hardcoded check.
-        if self.frames.contains(&base) || base == layout::UART_PAGE_ADDR {
+        if self.frames.contains(&base) || base == layout::crosvm::UART_PAGE_ADDR {
             return Err(MemoryTrackerError::DuplicateMmioShare(base));
         }
 
diff --git a/libs/libvmbase/src/memory/tracker.rs b/libs/libvmbase/src/memory/tracker.rs
index bbff254..3d1561f 100644
--- a/libs/libvmbase/src/memory/tracker.rs
+++ b/libs/libvmbase/src/memory/tracker.rs
@@ -119,7 +119,7 @@
 /// Unshare the UART page, previously shared with the host.
 pub fn unshare_uart() -> Result<()> {
     let Some(mmio_guard) = get_mmio_guard() else { return Ok(()) };
-    Ok(mmio_guard.unmap(layout::UART_PAGE_ADDR)?)
+    Ok(mmio_guard.unmap(layout::crosvm::UART_PAGE_ADDR)?)
 }
 
 /// Map the provided range as normal memory, with R/W permissions.