Clean up the frame buffer state in ostd::mm

This commit is contained in:
Zhang Junyang
2024-09-20 14:45:31 +08:00
committed by Tate, Hongliang Tian
parent 8b2ca77804
commit 9a79ecbcbe
4 changed files with 12 additions and 28 deletions

View File

@ -16,7 +16,7 @@ use core::{
use component::{init_component, ComponentInitError}; use component::{init_component, ComponentInitError};
use font8x8::UnicodeFonts; use font8x8::UnicodeFonts;
use ostd::{ use ostd::{
boot, boot::{self, memory_region::MemoryRegionType, memory_regions},
io_mem::IoMem, io_mem::IoMem,
mm::{VmIo, PAGE_SIZE}, mm::{VmIo, PAGE_SIZE},
sync::SpinLock, sync::SpinLock,
@ -39,8 +39,10 @@ pub(crate) fn init() {
let mut writer = { let mut writer = {
let framebuffer = boot::framebuffer_arg(); let framebuffer = boot::framebuffer_arg();
let mut size = 0; let mut size = 0;
for i in ostd::mm::FRAMEBUFFER_REGIONS.get().unwrap().iter() { for region in memory_regions() {
size = i.len(); if region.typ() == MemoryRegionType::Framebuffer {
size = region.len();
}
} }
let page_size = size / PAGE_SIZE; let page_size = size / PAGE_SIZE;

View File

@ -86,7 +86,7 @@ pub unsafe fn init() {
mm::page::allocator::init(); mm::page::allocator::init();
mm::kspace::init_kernel_page_table(mm::init_page_meta()); mm::kspace::init_kernel_page_table(mm::init_page_meta());
mm::misc_init(); mm::dma::init();
// SAFETY: This function is called only once in the entire system. // SAFETY: This function is called only once in the entire system.
unsafe { trap::softirq::init() }; unsafe { trap::softirq::init() };

View File

@ -53,9 +53,12 @@ use super::{
}, },
page_prop::{CachePolicy, PageFlags, PageProperty, PrivilegedPageFlags}, page_prop::{CachePolicy, PageFlags, PageProperty, PrivilegedPageFlags},
page_table::{KernelMode, PageTable}, page_table::{KernelMode, PageTable},
MemoryRegionType, Paddr, PagingConstsTrait, Vaddr, PAGE_SIZE, Paddr, PagingConstsTrait, Vaddr, PAGE_SIZE,
};
use crate::{
arch::mm::{PageTableEntry, PagingConsts},
boot::memory_region::MemoryRegionType,
}; };
use crate::arch::mm::{PageTableEntry, PagingConsts};
/// The shortest supported address width is 39 bits. And the literal /// The shortest supported address width is 39 bits. And the literal
/// values are written for 48 bits address width. Adjust the values /// values are written for 48 bits address width. Adjust the values

View File

@ -20,11 +20,8 @@ pub(crate) mod page_table;
pub mod stat; pub mod stat;
pub mod vm_space; pub mod vm_space;
use alloc::vec::Vec;
use core::{fmt::Debug, ops::Range}; use core::{fmt::Debug, ops::Range};
use spin::Once;
pub use self::{ pub use self::{
dma::{Daddr, DmaCoherent, DmaDirection, DmaStream, DmaStreamSlice, HasDaddr}, dma::{Daddr, DmaCoherent, DmaDirection, DmaStream, DmaStreamSlice, HasDaddr},
frame::{options::FrameAllocOptions, Frame, Segment}, frame::{options::FrameAllocOptions, Frame, Segment},
@ -39,10 +36,7 @@ pub(crate) use self::{
kspace::paddr_to_vaddr, page::meta::init as init_page_meta, page_prop::PrivilegedPageFlags, kspace::paddr_to_vaddr, page::meta::init as init_page_meta, page_prop::PrivilegedPageFlags,
page_table::PageTable, page_table::PageTable,
}; };
use crate::{ use crate::arch::mm::PagingConsts;
arch::mm::PagingConsts,
boot::memory_region::{MemoryRegion, MemoryRegionType},
};
/// The level of a page table node or a frame. /// The level of a page table node or a frame.
pub type PagingLevel = u8; pub type PagingLevel = u8;
@ -119,18 +113,3 @@ pub trait HasPaddr {
pub const fn is_page_aligned(p: usize) -> bool { pub const fn is_page_aligned(p: usize) -> bool {
(p & (PAGE_SIZE - 1)) == 0 (p & (PAGE_SIZE - 1)) == 0
} }
/// Memory regions used for frame buffer.
pub static FRAMEBUFFER_REGIONS: Once<Vec<MemoryRegion>> = Once::new();
pub(crate) fn misc_init() {
dma::init();
let mut framebuffer_regions = Vec::new();
for i in crate::boot::memory_regions() {
if i.typ() == MemoryRegionType::Framebuffer {
framebuffer_regions.push(*i);
}
}
FRAMEBUFFER_REGIONS.call_once(|| framebuffer_regions);
}