Switch to usize for alignment checks
This commit is contained in:
		
							parent
							
								
									ff12867b02
								
							
						
					
					
						commit
						bf291b917f
					
				|  | @ -78,7 +78,7 @@ impl PhysAddr { | |||
|     /// See the `align_up` function for more information.
 | ||||
|     pub fn aligned_up<U>(self, align: U) -> Self | ||||
|     where | ||||
|         U: Into<u64>, | ||||
|         U: Into<usize>, | ||||
|     { | ||||
|         PhysAddr(align_up(self.0, align.into())) | ||||
|     } | ||||
|  | @ -88,7 +88,7 @@ impl PhysAddr { | |||
|     /// See the `align_down` function for more information.
 | ||||
|     pub fn aligned_down<U>(self, align: U) -> Self | ||||
|     where | ||||
|         U: Into<u64>, | ||||
|         U: Into<usize>, | ||||
|     { | ||||
|         PhysAddr(align_down(self.0, align.into())) | ||||
|     } | ||||
|  | @ -96,7 +96,7 @@ impl PhysAddr { | |||
|     /// Checks whether the physical address has the demanded alignment.
 | ||||
|     pub fn is_aligned<U>(self, align: U) -> bool | ||||
|     where | ||||
|         U: Into<u64>, | ||||
|         U: Into<usize>, | ||||
|     { | ||||
|         self.aligned_down(align) == self | ||||
|     } | ||||
|  |  | |||
|  | @ -113,7 +113,7 @@ impl VirtAddr { | |||
|     /// See the `align_up` free function for more information.
 | ||||
|     pub fn aligned_up<U>(self, align: U) -> Self | ||||
|     where | ||||
|         U: Into<u64>, | ||||
|         U: Into<usize>, | ||||
|     { | ||||
|         VirtAddr(align_up(self.0, align.into())) | ||||
|     } | ||||
|  | @ -123,7 +123,7 @@ impl VirtAddr { | |||
|     /// See the `align_down` free function for more information.
 | ||||
|     pub fn aligned_down<U>(self, align: U) -> Self | ||||
|     where | ||||
|         U: Into<u64>, | ||||
|         U: Into<usize>, | ||||
|     { | ||||
|         VirtAddr(align_down(self.0, align.into())) | ||||
|     } | ||||
|  | @ -131,7 +131,7 @@ impl VirtAddr { | |||
|     /// Checks whether the virtual address has the demanded alignment.
 | ||||
|     pub fn is_aligned<U>(self, align: U) -> bool | ||||
|     where | ||||
|         U: Into<u64>, | ||||
|         U: Into<usize>, | ||||
|     { | ||||
|         self.aligned_down(align) == self | ||||
|     } | ||||
|  |  | |||
|  | @ -48,7 +48,7 @@ impl<S: PageSize> PhysFrame<S> { | |||
|     /// Returns the frame that contains the given physical address.
 | ||||
|     pub fn containing_address(address: PhysAddr) -> Self { | ||||
|         PhysFrame { | ||||
|             start_address: address.align_down(S::SIZE), | ||||
|             start_address: address.aligned_down(S::SIZE), | ||||
|             size: PhantomData, | ||||
|         } | ||||
|     } | ||||
|  | @ -86,8 +86,9 @@ impl<S: PageSize> fmt::Debug for PhysFrame<S> { | |||
| 
 | ||||
| impl<S: PageSize> Add<u64> for PhysFrame<S> { | ||||
|     type Output = Self; | ||||
|     /// Adds `rhs` same-sized frames to the current address.
 | ||||
|     fn add(self, rhs: u64) -> Self::Output { | ||||
|         PhysFrame::containing_address(self.start_address() + rhs * u64::from(S::SIZE)) | ||||
|         PhysFrame::containing_address(self.start_address() + rhs * S::SIZE as u64) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -99,8 +100,10 @@ impl<S: PageSize> AddAssign<u64> for PhysFrame<S> { | |||
| 
 | ||||
| impl<S: PageSize> Sub<u64> for PhysFrame<S> { | ||||
|     type Output = Self; | ||||
|     /// Subtracts `rhs` same-sized frames from the current address.
 | ||||
|     // @todo should I sub pages or just bytes here?
 | ||||
|     fn sub(self, rhs: u64) -> Self::Output { | ||||
|         PhysFrame::containing_address(self.start_address() - rhs * u64::from(S::SIZE)) | ||||
|         PhysFrame::containing_address(self.start_address() - rhs * S::SIZE as u64) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -111,13 +114,14 @@ impl<S: PageSize> SubAssign<u64> for PhysFrame<S> { | |||
| } | ||||
| 
 | ||||
| impl<S: PageSize> Sub<PhysFrame<S>> for PhysFrame<S> { | ||||
|     type Output = u64; | ||||
|     type Output = usize; | ||||
|     /// Return number of frames between start and end addresses.
 | ||||
|     fn sub(self, rhs: PhysFrame<S>) -> Self::Output { | ||||
|         (self.start_address - rhs.start_address) / S::SIZE | ||||
|         (self.start_address - rhs.start_address) as usize / S::SIZE | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// An range of physical memory frames, exclusive the upper bound.
 | ||||
| /// A range of physical memory frames, exclusive the upper bound.
 | ||||
| #[derive(Clone, Copy, PartialEq, Eq)] | ||||
| #[repr(C)] | ||||
| pub struct PhysFrameRange<S: PageSize = Size4KiB> { | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ impl<S: PageSize> Page<S> { | |||
|     /// Returns the page that contains the given virtual address.
 | ||||
|     pub fn containing_address(address: VirtAddr) -> Self { | ||||
|         Page { | ||||
|             start_address: address.align_down(S::SIZE), | ||||
|             start_address: address.aligned_down(S::SIZE), | ||||
|             size: PhantomData, | ||||
|         } | ||||
|     } | ||||
|  | @ -147,7 +147,7 @@ impl<S: PageSize> Add<u64> for Page<S> { | |||
|     type Output = Self; | ||||
|     // @todo should I add pages or just bytes here?
 | ||||
|     fn add(self, rhs: u64) -> Self::Output { | ||||
|         Page::containing_address(self.start_address() + rhs * u64::from(S::SIZE)) | ||||
|         Page::containing_address(self.start_address() + rhs * S::SIZE as u64) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -159,9 +159,10 @@ impl<S: PageSize> AddAssign<u64> for Page<S> { | |||
| 
 | ||||
| impl<S: PageSize> Sub<u64> for Page<S> { | ||||
|     type Output = Self; | ||||
|     /// Subtracts `rhs` same-sized pages from the current address.
 | ||||
|     // @todo should I sub pages or just bytes here?
 | ||||
|     fn sub(self, rhs: u64) -> Self::Output { | ||||
|         Page::containing_address(self.start_address() - rhs * u64::from(S::SIZE)) | ||||
|         Page::containing_address(self.start_address() - rhs * S::SIZE as u64) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -172,9 +173,9 @@ impl<S: PageSize> SubAssign<u64> for Page<S> { | |||
| } | ||||
| 
 | ||||
| impl<S: PageSize> Sub<Self> for Page<S> { | ||||
|     type Output = u64; | ||||
|     type Output = usize; | ||||
|     fn sub(self, rhs: Self) -> Self::Output { | ||||
|         (self.start_address - rhs.start_address) / S::SIZE | ||||
|         (self.start_address - rhs.start_address) as usize / S::SIZE | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -73,13 +73,13 @@ impl BootInfo { | |||
|             let mut new_reg: BootInfoMemRegion = BootInfoMemRegion::new(); | ||||
| 
 | ||||
|             /* Determine whether placing the region at the start or the end will create a bigger left over region */ | ||||
|             if reg_iter.start.aligned_up(1u64 << size_bits) - reg_iter.start | ||||
|                 < reg_iter.end - reg_iter.end.aligned_down(1u64 << size_bits) | ||||
|             if reg_iter.start.aligned_up(1usize << size_bits) - reg_iter.start | ||||
|                 < reg_iter.end - reg_iter.end.aligned_down(1usize << size_bits) | ||||
|             { | ||||
|                 new_reg.start = reg_iter.start.aligned_up(1u64 << size_bits); | ||||
|                 new_reg.start = reg_iter.start.aligned_up(1usize << size_bits); | ||||
|                 new_reg.end = new_reg.start + (1u64 << size_bits); | ||||
|             } else { | ||||
|                 new_reg.end = reg_iter.end.aligned_down(1u64 << size_bits); | ||||
|                 new_reg.end = reg_iter.end.aligned_down(1usize << size_bits); | ||||
|                 new_reg.start = new_reg.end - (1u64 << size_bits); | ||||
|             } | ||||
|             if new_reg.end > new_reg.start | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ | |||
| #![feature(asm)] | ||||
| #![feature(global_asm)] | ||||
| #![feature(decl_macro)] | ||||
| #![feature(const_fn)] | ||||
| #![feature(allocator_api)] | ||||
| #![feature(ptr_internals)] | ||||
| #![feature(format_args_nl)] | ||||
|  |  | |||
|  | @ -10,18 +10,18 @@ pub use bump_allocator::BumpAllocator; | |||
| ///
 | ||||
| /// Returns the greatest x with alignment `align` so that x <= addr.
 | ||||
| /// The alignment must be a power of 2.
 | ||||
| pub fn align_down(addr: u64, align: u64) -> u64 { | ||||
| pub fn align_down(addr: u64, align: usize) -> u64 { | ||||
|     assert!(align.is_power_of_two(), "`align` must be a power of two"); | ||||
|     addr & !(align - 1) | ||||
|     addr & !(align as u64 - 1) | ||||
| } | ||||
| 
 | ||||
| /// Align address upwards.
 | ||||
| ///
 | ||||
| /// Returns the smallest x with alignment `align` so that x >= addr.
 | ||||
| /// The alignment must be a power of 2.
 | ||||
| pub fn align_up(addr: u64, align: u64) -> u64 { | ||||
| pub fn align_up(addr: u64, align: usize) -> u64 { | ||||
|     assert!(align.is_power_of_two(), "`align` must be a power of two"); | ||||
|     let align_mask = align - 1; | ||||
|     let align_mask = align as u64 - 1; | ||||
|     if addr & align_mask == 0 { | ||||
|         addr // already aligned
 | ||||
|     } else { | ||||
|  | @ -31,6 +31,7 @@ pub fn align_up(addr: u64, align: u64) -> u64 { | |||
| 
 | ||||
| /// Calculate the next possible aligned address without sanity checking the
 | ||||
| /// input parameters.
 | ||||
| // u64 for return and addr?
 | ||||
| #[inline] | ||||
| fn aligned_addr_unchecked(addr: usize, alignment: usize) -> usize { | ||||
|     (addr + (alignment - 1)) & !(alignment - 1) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue