Use framebuffer virtual address

This commit is contained in:
Jeremy Soller
2022-08-23 20:07:30 -06:00
parent 2b8af1cf07
commit 54d9d011aa
4 changed files with 30 additions and 45 deletions

View File

@@ -177,25 +177,17 @@ unsafe fn inner<A: Arch>(
// Ensure graphical debug region remains paged
#[cfg(feature = "graphical_debug")]
{
use crate::devices::graphical_debug::DEBUG_DISPLAY;
use crate::devices::graphical_debug::FRAMEBUFFER;
use super::paging::entry::EntryFlags;
let (base, size) = if let Some(debug_display) = &*DEBUG_DISPLAY.lock() {
let data = &debug_display.display.onscreen;
(
data.as_ptr() as usize - crate::PHYS_OFFSET,
data.len() * 4
)
} else {
(0, 0)
};
let (phys, virt, size) = *FRAMEBUFFER.lock();
let pages = (size + A::PAGE_SIZE - 1) / A::PAGE_SIZE;
for i in 0..pages {
let phys = PhysicalAddress::new(base + i * A::PAGE_SIZE);
let virt = A::phys_to_virt(phys);
let flags = PageFlags::new().write(true)
.custom_flag(EntryFlags::HUGE_PAGE.bits(), true);
let phys = PhysicalAddress::new(phys + i * A::PAGE_SIZE);
let virt = VirtualAddress::new(virt + i * A::PAGE_SIZE);
let flags = PageFlags::new().write(true);
//TODO: Write combining flag
let flush = mapper.map_phys(
virt,
phys,

View File

@@ -173,24 +173,17 @@ unsafe fn inner<A: Arch>(
// Ensure graphical debug region remains paged
#[cfg(feature = "graphical_debug")]
{
use crate::devices::graphical_debug::DEBUG_DISPLAY;
use crate::devices::graphical_debug::FRAMEBUFFER;
use super::paging::entry::EntryFlags;
let (base, size) = if let Some(debug_display) = &*DEBUG_DISPLAY.lock() {
let data = &debug_display.display.onscreen;
(
data.as_ptr() as usize - crate::PHYS_OFFSET,
data.len() * 4
)
} else {
(0, 0)
};
let (phys, virt, size) = *FRAMEBUFFER.lock();
let pages = (size + A::PAGE_SIZE - 1) / A::PAGE_SIZE;
for i in 0..pages {
let phys = PhysicalAddress::new(base + i * A::PAGE_SIZE);
let virt = A::phys_to_virt(phys);
let phys = PhysicalAddress::new(phys + i * A::PAGE_SIZE);
let virt = VirtualAddress::new(virt + i * A::PAGE_SIZE);
let flags = PageFlags::new().write(true)
// Write combining flag
.custom_flag(EntryFlags::HUGE_PAGE.bits(), true);
let flush = mapper.map_phys(
virt,

View File

@@ -164,24 +164,17 @@ unsafe fn inner<A: Arch>(
// Ensure graphical debug region remains paged
#[cfg(feature = "graphical_debug")]
{
use crate::devices::graphical_debug::DEBUG_DISPLAY;
use crate::devices::graphical_debug::FRAMEBUFFER;
use super::paging::entry::EntryFlags;
let (base, size) = if let Some(debug_display) = &*DEBUG_DISPLAY.lock() {
let data = &debug_display.display.onscreen;
(
data.as_ptr() as usize - crate::PHYS_OFFSET,
data.len() * 4
)
} else {
(0, 0)
};
let (phys, virt, size) = *FRAMEBUFFER.lock();
let pages = (size + A::PAGE_SIZE - 1) / A::PAGE_SIZE;
for i in 0..pages {
let phys = PhysicalAddress::new(base + i * A::PAGE_SIZE);
let virt = A::phys_to_virt(phys);
let phys = PhysicalAddress::new(phys + i * A::PAGE_SIZE);
let virt = VirtualAddress::new(virt + i * A::PAGE_SIZE);
let flags = PageFlags::new().write(true)
// Write combining flag
.custom_flag(EntryFlags::HUGE_PAGE.bits(), true);
let flush = mapper.map_phys(
virt,

View File

@@ -11,12 +11,15 @@ pub static FONT: &'static [u8] = include_bytes!("../../../res/unifont.font");
pub static DEBUG_DISPLAY: Mutex<Option<DebugDisplay>> = Mutex::new(None);
pub static FRAMEBUFFER: Mutex<(usize, usize, usize)> = Mutex::new((0, 0, 0));
pub fn init(env: &[u8]) {
println!("Starting graphical debug");
let mut phys = 0;
let mut virt = 0;
let mut width = 0;
let mut height = 0;
let mut physbaseptr = 0;
//TODO: should errors be reported?
for line in str::from_utf8(env).unwrap_or("").lines() {
@@ -25,7 +28,11 @@ pub fn init(env: &[u8]) {
let value = parts.next().unwrap_or("");
if name == "FRAMEBUFFER_ADDR" {
physbaseptr = usize::from_str_radix(value, 16).unwrap_or(0);
phys = usize::from_str_radix(value, 16).unwrap_or(0);
}
if name == "FRAMEBUFFER_VIRT" {
virt = usize::from_str_radix(value, 16).unwrap_or(0);
}
if name == "FRAMEBUFFER_WIDTH" {
@@ -37,17 +44,17 @@ pub fn init(env: &[u8]) {
}
}
if physbaseptr == 0 || width == 0 || height == 0 {
*FRAMEBUFFER.lock() = (phys, virt, width * height * 4);
if phys == 0 || virt == 0 || width == 0 || height == 0 {
println!("Framebuffer not found");
return;
}
println!("Framebuffer {}x{} at {:X}", width, height, physbaseptr);
println!("Framebuffer {}x{} at {:X} mapped to {:X}", width, height, phys, virt);
{
let virtbaseptr = physbaseptr + crate::PHYS_OFFSET;
let display = Display::new(width, height, virtbaseptr as *mut u32);
let display = Display::new(width, height, virt as *mut u32);
let debug_display = DebugDisplay::new(display);
*DEBUG_DISPLAY.lock() = Some(debug_display);
}