Kernel: Make get_bootboot return a reference to avoid continuously copying data

This commit is contained in:
apio 2022-11-01 10:54:46 +01:00
parent 75219763da
commit 6a41c4fc4e
3 changed files with 11 additions and 10 deletions

View File

@ -4,13 +4,13 @@ use crate::util::get_bootboot;
use crate::arch::cpu; use crate::arch::cpu;
pub fn halt_other_cores() -> () { pub fn halt_other_cores() -> () {
let boot: BOOTBOOT = get_bootboot(); let boot: &BOOTBOOT = get_bootboot();
if cpu::get_processor_id() != boot.bspid as u32 { if cpu::get_processor_id() != boot.bspid as u32 {
cpu::halt(); cpu::halt();
} }
} }
pub fn check_magic() -> () { pub fn check_magic() -> () {
let boot: BOOTBOOT = get_bootboot(); let boot: &BOOTBOOT = get_bootboot();
assert_eq!(boot.magic, BOOTBOOT_MAGIC[..4]); assert_eq!(boot.magic, BOOTBOOT_MAGIC[..4]);
} }

View File

@ -1,5 +1,5 @@
use crate::bootboot::{BOOTBOOT, BOOTBOOT_INFO}; use crate::bootboot::{BOOTBOOT, BOOTBOOT_INFO};
pub fn get_bootboot() -> BOOTBOOT { pub fn get_bootboot() -> &'static BOOTBOOT {
return unsafe { *(BOOTBOOT_INFO as *const BOOTBOOT) } return unsafe { & *(BOOTBOOT_INFO as *const BOOTBOOT) }
} }

View File

@ -39,7 +39,7 @@ impl Color {
bswap(self as u32) bswap(self as u32)
} }
fn to_layout(self, layout: u32) -> u32 { fn to_data_layout(self, layout: u32) -> u32 {
match layout { match layout {
FB_ARGB => self.to_argb(), FB_ARGB => self.to_argb(),
FB_BGRA => self.to_bgra(), FB_BGRA => self.to_bgra(),
@ -49,24 +49,25 @@ impl Color {
} }
pub fn put_pixel(x: u32, y: u32, color: Color) -> () { pub fn put_pixel(x: u32, y: u32, color: Color) -> () {
let boot: BOOTBOOT = get_bootboot(); let boot: &BOOTBOOT = get_bootboot();
let ptr: u64 = FB + (boot.fb_scanline * y) as u64 + (x * 4) as u64; let ptr: u64 = FB + (boot.fb_scanline * y) as u64 + (x * 4) as u64;
unsafe { *(ptr as *mut u32) = color.to_layout(boot.fb_type as u32) }; unsafe { *(ptr as *mut u32) = color.to_data_layout(boot.fb_type as u32) };
} }
pub fn draw_rect(x: u32, y: u32, width: u32, height: u32, color: Color) -> () { pub fn draw_rect(x: u32, y: u32, width: u32, height: u32, color: Color) -> () {
let boot: BOOTBOOT = get_bootboot(); let boot: &BOOTBOOT = get_bootboot();
let col: u32 = color.to_data_layout(boot.fb_type as u32);
for i in y..(y + height) for i in y..(y + height)
{ {
let addr: u64 = FB + (boot.fb_scanline * i) as u64 + (x * 4) as u64; let addr: u64 = FB + (boot.fb_scanline * i) as u64 + (x * 4) as u64;
for ptr in (addr..(addr + (width*4) as u64)).step_by(4) for ptr in (addr..(addr + (width*4) as u64)).step_by(4)
{ {
unsafe { *(ptr as *mut u32) = color.to_layout(boot.fb_type as u32) }; unsafe { *(ptr as *mut u32) = col };
} }
} }
} }
pub fn clear(color: Color) -> () { pub fn clear(color: Color) -> () {
let boot: BOOTBOOT = get_bootboot(); let boot: &BOOTBOOT = get_bootboot();
draw_rect(0, 0, boot.fb_width, boot.fb_height, color) draw_rect(0, 0, boot.fb_width, boot.fb_height, color)
} }