kernel_stack.rs 638 B

12345678910111213141516171819202122232425262728
  1. use core::ptr::NonNull;
  2. use crate::kernel::mem::FolioOwned;
  3. #[derive(Debug)]
  4. pub struct KernelStack {
  5. folio: FolioOwned,
  6. }
  7. impl KernelStack {
  8. /// Kernel stack page order
  9. /// 7 for `2^7 = 128 pages = 512 KiB`
  10. const KERNEL_STACK_ORDER: u32 = 7;
  11. pub fn new() -> Self {
  12. Self {
  13. folio: FolioOwned::alloc_order(Self::KERNEL_STACK_ORDER),
  14. }
  15. }
  16. pub fn get_bottom(&self) -> NonNull<()> {
  17. let ptr = self.folio.get_bytes_ptr();
  18. let len = ptr.len();
  19. // SAFETY: The vaddr of the folio is guaranteed to be non-zero.
  20. unsafe { ptr.cast().byte_add(len) }
  21. }
  22. }