1#![cfg_attr(not(test), no_std)]
2#![doc = include_str!("../README.md")]
3
4mod addr;
5mod iter;
6mod range;
7
8pub use self::{
9 addr::{MemoryAddr, PhysAddr, VirtAddr},
10 iter::{DynPageIter, PageIter},
11 range::{AddrRange, PhysAddrRange, VirtAddrRange},
12};
13
14pub const PAGE_SIZE_4K: usize = 0x1000;
16
17pub const PAGE_SIZE_2M: usize = 0x20_0000;
19
20pub const PAGE_SIZE_1G: usize = 0x4000_0000;
22
23pub type PageIter4K<A> = PageIter<PAGE_SIZE_4K, A>;
25
26pub type PageIter2M<A> = PageIter<PAGE_SIZE_2M, A>;
28
29pub type PageIter1G<A> = PageIter<PAGE_SIZE_1G, A>;
31
32#[inline]
38pub const fn align_down(addr: usize, align: usize) -> usize {
39 addr & !(align - 1)
40}
41
42#[inline]
48pub const fn align_up(addr: usize, align: usize) -> usize {
49 (addr + align - 1) & !(align - 1)
50}
51
52#[inline]
56pub const fn align_offset(addr: usize, align: usize) -> usize {
57 addr & (align - 1)
58}
59
60#[inline]
64pub const fn is_aligned(addr: usize, align: usize) -> bool {
65 align_offset(addr, align) == 0
66}
67
68#[inline]
70pub const fn align_down_4k(addr: usize) -> usize {
71 align_down(addr, PAGE_SIZE_4K)
72}
73
74#[inline]
76pub const fn align_up_4k(addr: usize) -> usize {
77 align_up(addr, PAGE_SIZE_4K)
78}
79
80#[inline]
82pub const fn align_offset_4k(addr: usize) -> usize {
83 align_offset(addr, PAGE_SIZE_4K)
84}
85
86#[inline]
88pub const fn is_aligned_4k(addr: usize) -> bool {
89 is_aligned(addr, PAGE_SIZE_4K)
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95
96 #[test]
97 fn test_align() {
98 assert_eq!(align_down(0x12345678, 0x1000), 0x12345000);
99 assert_eq!(align_up(0x12345678, 0x1000), 0x12346000);
100 assert_eq!(align_offset(0x12345678, 0x1000), 0x678);
101 assert!(is_aligned(0x12345000, 0x1000));
102 assert!(!is_aligned(0x12345678, 0x1000));
103
104 assert_eq!(align_down_4k(0x12345678), 0x12345000);
105 assert_eq!(align_up_4k(0x12345678), 0x12346000);
106 assert_eq!(align_offset_4k(0x12345678), 0x678);
107 assert!(is_aligned_4k(0x12345000));
108 assert!(!is_aligned_4k(0x12345678));
109 }
110}