diff --git a/build.sh b/build.sh index 22542c7..629a070 100755 --- a/build.sh +++ b/build.sh @@ -131,7 +131,7 @@ case $1 in build_dev ;; run-qemu-gdb) - build + build_dev run_qemu_gdb ;; *) diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 553f547..d9a6780 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -42,7 +42,7 @@ extern "C" fn kmain(mb2p: *const BootInformationHeader) -> ! { let vc = std::vga::video::VideoControler::new(mb2p); // vc.set_px(0, 0, Color::new(0xFF, 0xFF, 0x0)); - // vc.fill_screen(Color::new(0xFF, 0x0, 0x0)); + vc.fill_screen(Color::new(0xFF, 0x0, 0x66)); log::info!("end of work"); loop { diff --git a/kernel/src/mem/mod.rs b/kernel/src/mem/mod.rs index 936afea..8ff06a2 100644 --- a/kernel/src/mem/mod.rs +++ b/kernel/src/mem/mod.rs @@ -152,7 +152,7 @@ impl MemInfo<'_> { let mb_end = boot_info.end_address(); let vv_info = boot_info.framebuffer_tag().unwrap().unwrap(); let vv_start = vv_info.address(); - let vv_size = vv_info.width() * vv_info.height(); + let vv_size = vv_info.pitch() * vv_info.height(); //log::debug!("Kernel: start: 0x{:x} sz: 0x{:x}", mi.kernel_start, mi.kernel_end - mi.kernel_start); //log::debug!("Multiboot: start: 0x{:x} sz: 0x{:x}", mi.mb_start, mi.mb_end - mi.mb_start); diff --git a/kernel/src/mem/paging/mod.rs b/kernel/src/mem/paging/mod.rs index e87aeee..23929d2 100644 --- a/kernel/src/mem/paging/mod.rs +++ b/kernel/src/mem/paging/mod.rs @@ -206,12 +206,14 @@ pub fn remap_the_kernel(allocator: &mut A, mem_info: &MemInfo) -> ActivePageT } } let vga_text_buffer_frame = Frame::containing_address(0xb8000); - let vga_video_buffer_frame_start = Frame::containing_address(mem_info.vga_vide_start); - let vga_video_buffer_frame_end = Frame::containing_address((mem_info.vga_vide_start + mem_info.vga_vide_size*3)); - for frame in Frame::range_inclusive(vga_video_buffer_frame_start, vga_video_buffer_frame_end) { - mapper.identity_map(frame, EntryFlags::PRESENT | EntryFlags::WRITABLE, allocator); - } mapper.identity_map(vga_text_buffer_frame, EntryFlags::WRITABLE, allocator); + + let vga_video_buffer_frame_start = Frame::containing_address(mem_info.vga_vide_start); + let vga_video_buffer_frame_end = Frame::containing_address(mem_info.vga_vide_start + (mem_info.vga_vide_size*4)); + for frame in Frame::range_inclusive(vga_video_buffer_frame_start, vga_video_buffer_frame_end) { + mapper.identity_map(frame, EntryFlags::WRITABLE | EntryFlags::WRITE_THROUGH, allocator); + } + let multiboot_start = Frame::containing_address(mem_info.boot_info.start_address()); let multiboot_end = Frame::containing_address(mem_info.boot_info.end_address() - 1); for frame in Frame::range_inclusive(multiboot_start, multiboot_end) { diff --git a/kernel/src/std/vga/video/mod.rs b/kernel/src/std/vga/video/mod.rs index 949d907..820874f 100644 --- a/kernel/src/std/vga/video/mod.rs +++ b/kernel/src/std/vga/video/mod.rs @@ -28,7 +28,9 @@ pub struct VideoControler{ g_ofs: u8, b_ofs: u8, buf_addr: u64, + pitch: usize, size: Vector2, + bpp: u8 } impl VideoControler { @@ -38,32 +40,37 @@ impl VideoControler { let FramebufferType::RGB { red, green, blue } = fbt.buffer_type().unwrap() else { panic!(); }; + assert!(red.size == green.size && green.size == blue.size); - log::info!("VGA VIDEO adddr: {:x}", fbt.address()); - log::info!("VGA VIDEO FB TYPE: {:?}", fbt.buffer_type()); + log::info!("VGA VIDEO addr: {:x}", fbt.address()); + log::info!("{fbt:#?}"); + Self { component_size: red.size, r_ofs: red.position, g_ofs: green.position, b_ofs: blue.position, buf_addr: fbt.address(), - size: Vector2::new(fbt.width() as usize, fbt.height() as usize) + size: Vector2::new(fbt.width() as usize, fbt.height() as usize), + pitch: fbt.pitch() as usize, + bpp: fbt.bpp(), } } pub fn set_px(&self, x: usize, y: usize, c: Color) { + assert!(x <= self.size.x && y <= self.size.x); let ptr = self.buf_addr as *mut () as *mut u8; - let px = ptr.wrapping_add(x * self.size.x + y); + let px = ptr.wrapping_add((self.bpp / 8) as usize * x + self.pitch * y); unsafe { - *px.wrapping_add((self.r_ofs % 8) as usize) = c.r; - *px.wrapping_add((self.g_ofs % 8) as usize) = c.g; - *px.wrapping_add((self.b_ofs % 8) as usize) = c.b; + *px.wrapping_add((self.r_ofs / 8) as usize) = c.r; + *px.wrapping_add((self.g_ofs / 8) as usize) = c.g; + *px.wrapping_add((self.b_ofs / 8) as usize) = c.b; } } pub fn fill_screen(&self, c: Color) { - for x in 0..100 { - for y in 0..100 { + for x in 0..self.size.x { + for y in 0..self.size.y { self.set_px(x, y, c); } }