Use framebuffer virtual address
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user