xref: /cloud-hypervisor/vm-allocator/src/page_size.rs (revision 5a9dd7489cdd27ad83b278ae94609214350b07b1)
1*5a9dd748SJianyong Wu // Copyright 2023 Arm Limited (or its affiliates). All rights reserved.
2*5a9dd748SJianyong Wu // SPDX-License-Identifier: Apache-2.0
3*5a9dd748SJianyong Wu 
4*5a9dd748SJianyong Wu use libc::{sysconf, _SC_PAGESIZE};
5*5a9dd748SJianyong Wu 
6*5a9dd748SJianyong Wu /// get host page size
get_page_size() -> u647*5a9dd748SJianyong Wu pub fn get_page_size() -> u64 {
8*5a9dd748SJianyong Wu     // SAFETY: FFI call. Trivially safe.
9*5a9dd748SJianyong Wu     unsafe { sysconf(_SC_PAGESIZE) as u64 }
10*5a9dd748SJianyong Wu }
11*5a9dd748SJianyong Wu 
12*5a9dd748SJianyong Wu /// round up address to let it align page size
align_page_size_up(address: u64) -> u6413*5a9dd748SJianyong Wu pub fn align_page_size_up(address: u64) -> u64 {
14*5a9dd748SJianyong Wu     let page_size = get_page_size();
15*5a9dd748SJianyong Wu     (address + page_size - 1) & !(page_size - 1)
16*5a9dd748SJianyong Wu }
17*5a9dd748SJianyong Wu 
18*5a9dd748SJianyong Wu /// round down address to let it align page size
align_page_size_down(address: u64) -> u6419*5a9dd748SJianyong Wu pub fn align_page_size_down(address: u64) -> u64 {
20*5a9dd748SJianyong Wu     let page_size = get_page_size();
21*5a9dd748SJianyong Wu     address & !(page_size - 1)
22*5a9dd748SJianyong Wu }
23*5a9dd748SJianyong Wu 
24*5a9dd748SJianyong Wu /// Test if address is 4k aligned
is_4k_aligned(address: u64) -> bool25*5a9dd748SJianyong Wu pub fn is_4k_aligned(address: u64) -> bool {
26*5a9dd748SJianyong Wu     (address & 0xfff) == 0
27*5a9dd748SJianyong Wu }
28*5a9dd748SJianyong Wu 
29*5a9dd748SJianyong Wu /// Test if size is 4k aligned
is_4k_multiple(size: u64) -> bool30*5a9dd748SJianyong Wu pub fn is_4k_multiple(size: u64) -> bool {
31*5a9dd748SJianyong Wu     (size & 0xfff) == 0
32*5a9dd748SJianyong Wu }
33*5a9dd748SJianyong Wu 
34*5a9dd748SJianyong Wu /// Test if address is page size aligned
is_page_size_aligned(address: u64) -> bool35*5a9dd748SJianyong Wu pub fn is_page_size_aligned(address: u64) -> bool {
36*5a9dd748SJianyong Wu     let page_size = get_page_size();
37*5a9dd748SJianyong Wu     address & (page_size - 1) == 0
38*5a9dd748SJianyong Wu }
39