vm-allocator: Add page size related functions

To avoid code duplication extract page related functions to their
own module and add utility functions for manipulating addresses
related to page sizes

Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
This commit is contained in:
Jianyong Wu 2023-06-02 03:02:52 +00:00 committed by Michael Zhao
parent dec8d619d4
commit 5a9dd7489c
3 changed files with 43 additions and 10 deletions

View File

@ -12,6 +12,8 @@
mod address; mod address;
mod gsi; mod gsi;
/// page size related utility funtions
pub mod page_size;
mod system; mod system;
pub use crate::address::AddressAllocator; pub use crate::address::AddressAllocator;

View File

@ -0,0 +1,38 @@
// Copyright 2023 Arm Limited (or its affiliates). All rights reserved.
// SPDX-License-Identifier: Apache-2.0
use libc::{sysconf, _SC_PAGESIZE};
/// get host page size
pub fn get_page_size() -> u64 {
// SAFETY: FFI call. Trivially safe.
unsafe { sysconf(_SC_PAGESIZE) as u64 }
}
/// round up address to let it align page size
pub fn align_page_size_up(address: u64) -> u64 {
let page_size = get_page_size();
(address + page_size - 1) & !(page_size - 1)
}
/// round down address to let it align page size
pub fn align_page_size_down(address: u64) -> u64 {
let page_size = get_page_size();
address & !(page_size - 1)
}
/// Test if address is 4k aligned
pub fn is_4k_aligned(address: u64) -> bool {
(address & 0xfff) == 0
}
/// Test if size is 4k aligned
pub fn is_4k_multiple(size: u64) -> bool {
(size & 0xfff) == 0
}
/// Test if address is page size aligned
pub fn is_page_size_aligned(address: u64) -> bool {
let page_size = get_page_size();
address & (page_size - 1) == 0
}

View File

@ -14,14 +14,7 @@ use crate::gsi::GsiAllocator;
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
use crate::gsi::GsiApic; use crate::gsi::GsiApic;
use libc::{sysconf, _SC_PAGESIZE}; use crate::page_size::get_page_size;
/// Safe wrapper for `sysconf(_SC_PAGESIZE)`.
#[inline(always)]
fn pagesize() -> usize {
// SAFETY: FFI call. Trivially safe.
unsafe { sysconf(_SC_PAGESIZE) as usize }
}
/// Manages allocating system resources such as address space and interrupt numbers. /// Manages allocating system resources such as address space and interrupt numbers.
/// ///
@ -126,7 +119,7 @@ impl SystemAllocator {
self.platform_mmio_address_space.allocate( self.platform_mmio_address_space.allocate(
address, address,
size, size,
Some(align_size.unwrap_or(pagesize() as u64)), Some(align_size.unwrap_or(get_page_size())),
) )
} }
@ -140,7 +133,7 @@ impl SystemAllocator {
self.mmio_hole_address_space.allocate( self.mmio_hole_address_space.allocate(
address, address,
size, size,
Some(align_size.unwrap_or(pagesize() as u64)), Some(align_size.unwrap_or(get_page_size())),
) )
} }