Untitled Paste

rust
Wrap Lines
Raw
    fn init_frame_info(
        &mut self,
        memory_map: &MemoryMap,
        frames: Range<usize>,
    ) {
        let mut head: Option<usize> = None;
        let mut count: usize = 0;

        for i in frames.clone() {}

        for region in memory_map.iter() {
            let start_frame_index = ku::memory::size::from(region.range.start_frame_number);
            let end_frame_index = ku::memory::size::from(region.range.end_frame_number);

            let frame_block = match Block::<Frame>::from_index_u64(
                region.range.start_frame_number,
                region.range.end_frame_number,
            ) {
                Ok(b) => b,
                Err(_) => continue,
            };

            for frame in frame_block {
                let index = frame.index() as usize;

                if !frames.contains(&index) {
                    continue;
                }

                let frame_info = &mut self.frame_info[index];

                match region.region_type {
                    MemoryRegionType::Usable => {
                        let old_head = core::mem::replace(&mut head, Some(index));
                        *frame_info = FrameInfo::Free {
                            next_free: old_head,
                        };
                        count += 1;
                    },
                    MemoryRegionType::Kernel |
                    MemoryRegionType::KernelStack |
                    MemoryRegionType::PageTable => {
                        *frame_info = FrameInfo::Used { reference_count: 1 };
                    },
                    _ => {},
                }
            }
        }

        self.free_frame = head;
        self.free_count = count;
    }