Put a frame back into the bitmap Input is the frame number returned by fetch_frame, not a physical address
(&mut self, frame_number: u64)
| 252 | /// Input is the frame number returned by fetch_frame, not |
| 253 | /// a physical address |
| 254 | fn return_frame(&mut self, frame_number: u64) { |
| 255 | if self.frame_stack_number < FRAME_ALLOCATOR_STACK_SIZE { |
| 256 | self.frame_stack[self.frame_stack_number] = frame_number; |
| 257 | self.frame_stack_number += 1; |
| 258 | return; |
| 259 | } |
| 260 | |
| 261 | // Calculate indices |
| 262 | let mut chunk_number = frame_number; |
| 263 | for level in 0..self.nlevels { |
| 264 | let ptr = unsafe{(self.bitmap_virt_addr[level].as_mut_ptr() as *mut u32) |
| 265 | .offset(chunk_number as isize)}; |
| 266 | let bitmap_was_empty = unsafe{*ptr} == 0; |
| 267 | let index = chunk_number & 31; // Low 5 bits are the index |
| 268 | |
| 269 | // Set bit |
| 270 | unsafe{*ptr |= 1 << index;} |
| 271 | |
| 272 | if !bitmap_was_empty { |
| 273 | // No need to change higher bitmaps |
| 274 | break; |
| 275 | } |
| 276 | // Divide by 32 to get chunk number of higher level |
| 277 | chunk_number = chunk_number >> 5; |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | pub fn deallocate_frame(&mut self, frame: PhysFrame) { |
| 282 | if frame.start_address() < self.frame_phys_addr { |