Free frames used for a thread stack given virtual address
(
stack_end: VirtAddr
)
| 833 | /// Free frames used for a thread stack |
| 834 | /// given virtual address |
| 835 | pub fn free_user_stack( |
| 836 | stack_end: VirtAddr |
| 837 | ) -> Result<(), &'static str> { |
| 838 | let addr = stack_end - 1u64; // Address in last page |
| 839 | let table = active_level_1_table_containing(addr); |
| 840 | |
| 841 | let memory_info = unsafe {MEMORY_INFO.as_mut().unwrap()}; |
| 842 | |
| 843 | let iend = usize::from(addr.p1_index()); |
| 844 | for index in ((iend - 6)..=iend).rev() { |
| 845 | let entry = &mut table[index]; |
| 846 | if entry.flags().contains(PageTableFlags::WRITABLE) { |
| 847 | // Free this frame |
| 848 | memory_info.frame_allocator.deallocate_frame( |
| 849 | entry.frame().unwrap()); |
| 850 | } |
| 851 | entry.set_flags(PageTableFlags::empty()); |
| 852 | } |
| 853 | |
| 854 | Ok(()) |
| 855 | } |
no test coverage detected