From b81c5a76d8fa62f6dbe7a006c52b3bbd51c47a7e Mon Sep 17 00:00:00 2001 From: husky Date: Tue, 19 Apr 2022 23:49:19 -0700 Subject: [PATCH] fuck it we're using the x86_64 crate --- Cargo.toml | 1 + src/internals/errors.rs | 75 ++++++---------------- src/internals/mod.rs | 136 ---------------------------------------- src/main.rs | 32 +++------- 4 files changed, 26 insertions(+), 218 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2f26c95..30174dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ members = [ [dependencies] bootloader = "0.10.12" spin = "0.9.1" +x86_64 = "0.14.9" [dependencies.lazy_static] version = "1.4.0" features = ["spin_no_std"] \ No newline at end of file diff --git a/src/internals/errors.rs b/src/internals/errors.rs index 1668d70..6daad11 100644 --- a/src/internals/errors.rs +++ b/src/internals/errors.rs @@ -88,73 +88,34 @@ fn draw_char(x: usize, y: usize, c: char, color: Colour, mut fb: &mut [u8]) { } } -fn draw_horizcentre_string(y: usize, s: &str, color: Colour, fb: &mut [u8]) { - let fb_width = FACEBOOK.fb_width.lock(); - - let mut x_tmp = (*fb_width - s.len() * 8) / 2; +fn draw_horizcentre_string(width: usize, y: usize, s: &str, color: Colour, fb: &mut [u8]) { + let mut x_tmp = (width - s.len() * 8) / 2; let mut y_tmp = y; for c in s.chars() { if c == '\n' { - x_tmp = (*fb_width - s.len() * 8) / 2; + x_tmp = (width - s.len() * 8) / 2; y_tmp += 8; } else { draw_char(x_tmp, y_tmp, c, color, fb.borrow_mut()); x_tmp += 8; } } +} + +pub extern "x86-interrupt" fn breakpoint_exception(stack_frame: InterruptStackFrame) { + // cover the screen in a nice communist red (: + let mut fb = FACEBOOK.fb_mutex.lock(); + let fb_width = FACEBOOK.fb_width.lock(); + let fb_height = FACEBOOK.fb_height.lock(); + + draw_box(0,0,*fb_width,*fb_height, COMMUNIST_RED, fb.borrow_mut()); + // draw our funny text + draw_horizcentre_string(*fb_width,(*fb_height / 2) - (14 * (8/2)), "OOPSY WOOPSY, THE KERNEL HAD A FUCKY WUCKY UWU", CUM_WHITE, fb.borrow_mut()); + draw_horizcentre_string(*fb_width,(*fb_height / 2) - (10 * (8/2)), "WHOEVER WAS PROGRAMMING THE KERNEL DECIDED TO LEAVE A BREAKPOINT IN IT, OOPS (:", CUM_WHITE, fb.borrow_mut()); + draw_horizcentre_string(*fb_width,(*fb_height / 2) - (4 * (8/2)), "THE KERNEL IS NOW HALTED, YOU CAN'T DO ANYTHING UNTIL YOU RESTART THE KERNEL", CUM_WHITE, fb.borrow_mut()); drop(fb_width); -} - -pub extern "x86-interrupt" fn generic_error(stack_frame: InterruptStackFrame) { - // cover the screen in a nice communist red (: - let mut fb = FACEBOOK.fb_mutex.lock(); - let fb_width = FACEBOOK.fb_width.lock(); - let fb_height = FACEBOOK.fb_height.lock(); - - draw_box(0,0,*fb_width,*fb_height, COMMUNIST_RED, fb.borrow_mut()); - // draw our funny text - draw_horizcentre_string((*fb_height / 2) - ((3 * 8)/2), "OOPSY WOOPSY, THE KERNEL HAD A FUCKY WUCKY UWU", CUM_WHITE, fb.borrow_mut()); - - loop {} -} - -pub extern "x86-interrupt" fn generic_error_with_code(stack_frame: InterruptStackFrame, error_code: u32) { - // cover the screen in a nice communist red (: - let mut fb = FACEBOOK.fb_mutex.lock(); - let fb_width = FACEBOOK.fb_width.lock(); - let fb_height = FACEBOOK.fb_height.lock(); - - draw_box(0,0,*fb_width,*fb_height, COMMUNIST_RED, fb.borrow_mut()); - // draw our funny text - draw_horizcentre_string((*fb_height / 2) - ((3 * 8)/2), "OOPSY WOOPSY, THE KERNEL HAD A FUCKY WUCKY UWU", CUM_WHITE, fb.borrow_mut()); - - loop {} -} - -pub extern "x86-interrupt" fn super_fuck_up_error(stack_frame: InterruptStackFrame) -> ! { - // cover the screen in a nice communist red (: - let mut fb = FACEBOOK.fb_mutex.lock(); - let fb_width = FACEBOOK.fb_width.lock(); - let fb_height = FACEBOOK.fb_height.lock(); - - draw_box(0,0,*fb_width,*fb_height, COMMUNIST_RED, fb.borrow_mut()); - // draw our funny text - draw_horizcentre_string((*fb_height / 2) - ((3 * 8)/2), "OOPSY WOOPSY, THE KERNEL HAD A FUCKY WUCKY UWU", CUM_WHITE, fb.borrow_mut()); - - loop {} -} - -pub extern "x86-interrupt" fn super_fuck_up_error_with_code(stack_frame: InterruptStackFrame, error_code: u32) -> ! { - // cover the screen in a nice communist red (: - let mut fb = FACEBOOK.fb_mutex.lock(); - let fb_width = FACEBOOK.fb_width.lock(); - let fb_height = FACEBOOK.fb_height.lock(); - - draw_box(0,0,*fb_width,*fb_height, COMMUNIST_RED, fb.borrow_mut()); - // draw our funny text - draw_horizcentre_string((*fb_height / 2) - ((3 * 8)/2), "OOPSY WOOPSY, THE KERNEL HAD A FUCKY WUCKY UWU", CUM_WHITE, fb.borrow_mut()); - - loop {} + drop(fb_height); + drop(fb); } \ No newline at end of file diff --git a/src/internals/mod.rs b/src/internals/mod.rs index 31c99d9..4050443 100644 --- a/src/internals/mod.rs +++ b/src/internals/mod.rs @@ -22,142 +22,6 @@ pub mod WhyDoTheyCallItOvenWhenYouOfInTheColdFoodOfOutHotEatTheFood { pub const COMMUNIST_RED: Colour = Colour{r:245,g:77,b:30}; pub const CUM_WHITE: Colour = Colour{r:255,g:255,b:255}; - #[derive(Clone, Copy)] - pub struct IDTEntry { - based_offset: u16, - code_selector: u16, - ist_offset_wastes_6_bits: u8, - attributes: u8, - offset_popping_off: u16, - what: PhantomData - } - - impl IDTEntry { - pub fn default() -> Self { - IDTEntry { - based_offset: 0, - code_selector: 0, - ist_offset_wastes_6_bits: 0, - attributes: 0, - offset_popping_off: 0, - what: PhantomData - } - } - } - - macro_rules! impl_idtentry { - ($f:ty) => { - impl IDTEntry<$f> { - pub fn set_handler(&mut self, handler: $f) { - unsafe { // no shit this is unsafe, i wrote it (: - let handler_addr = handler as u32; - self.based_offset = handler_addr as u16; - self.offset_popping_off = (handler_addr >> 16) as u16; - let code_selector : u16; - asm!("mov {0:x}, cs", out(reg) code_selector, options(nomem, nostack, preserves_flags)); - self.code_selector = code_selector; - self.attributes = 0b10001110; - } - } - } - }; - } - - - pub struct InterruptDescriptorTable { - pub divide_error: IDTEntry, - pub debug: IDTEntry, - pub dream_mask_sus_version: IDTEntry, // non-maskable interrupt - pub breakpoint: IDTEntry, - pub into_detected_overflow: IDTEntry, - pub in_the_fortnite_storm: IDTEntry, // bound range exceeded - pub owo_whats_this: IDTEntry, // invalid opcode - pub device_not_available: IDTEntry, - pub fucky_wucky_twice: IDTEntry, // double fault - we_are_all_about_backwards_compatibility: IDTEntry, // coprocessor segment overrun - pub invalid_tss: IDTEntry, - pub segment_not_present: IDTEntry, - pub stack_segment_fault: IDTEntry, - pub uh_oh_we_gotta_hacker_here: IDTEntry, // general protection fault - pub page_fault: IDTEntry, - reserved_1: IDTEntry, // what the fuck is this?? the only comment is "vector nr.15" - pub x87_floating_point_exception: IDTEntry, // compatibility B) - pub alignment_check: IDTEntry, - pub machine_check: IDTEntry, - pub the_point_of_the_mask_float_exception: IDTEntry, // simd floating point exception - pub virtualization_exception: IDTEntry, // qemu WILL be added to windows 12 B) - reserved_2: IDTEntry, // another reserved - pub vmm_communication_exception: IDTEntry, // honestly too tired to check what this is - pub security_exception: IDTEntry, - reserved_3: IDTEntry, - - pub interrupts: [IDTEntry; 256 - 32], // the original one didn't make this public, but who care (: - } - - impl InterruptDescriptorTable { - pub fn new() -> InterruptDescriptorTable { - InterruptDescriptorTable { - divide_error: IDTEntry::default(), - debug: IDTEntry::default(), - dream_mask_sus_version: IDTEntry::default(), - breakpoint: IDTEntry::default(), - into_detected_overflow: IDTEntry::default(), - in_the_fortnite_storm: IDTEntry::default(), - owo_whats_this: IDTEntry::default(), - device_not_available: IDTEntry::default(), - fucky_wucky_twice: IDTEntry::default(), - we_are_all_about_backwards_compatibility: IDTEntry::default(), - invalid_tss: IDTEntry::default(), - segment_not_present: IDTEntry::default(), - stack_segment_fault: IDTEntry::default(), - uh_oh_we_gotta_hacker_here: IDTEntry::default(), - page_fault: IDTEntry::default(), - reserved_1: IDTEntry::default(), - x87_floating_point_exception: IDTEntry::default(), - alignment_check: IDTEntry::default(), - machine_check: IDTEntry::default(), - the_point_of_the_mask_float_exception: IDTEntry::default(), - virtualization_exception: IDTEntry::default(), - reserved_2: IDTEntry::default(), - vmm_communication_exception: IDTEntry::default(), - security_exception: IDTEntry::default(), - reserved_3: IDTEntry::default(), - interrupts: [IDTEntry::default(); 256 - 32] - } - } - - pub fn load(&'static self) { - unsafe { - // load the IDT - let idt_ptr = &self as *const _ as *const _; - asm!("lidt [{}]", in(reg) idt_ptr, options(readonly, nostack, preserves_flags)); - } - } - } - - pub type InterruptHandler = extern "x86-interrupt" fn(_: InterruptStackFrame); - pub type ErrorWithErrorCodeHandler = extern "x86-interrupt" fn(_: InterruptStackFrame, error_code: u32); - pub type SeriousFuckUpHandler = extern "x86-interrupt" fn(_: InterruptStackFrame) -> !; - pub type SeriousFuckUpWithErrorCodeHandler = extern "x86-interrupt" fn(_: InterruptStackFrame, error_code: u32) -> !; - - impl_idtentry!(InterruptHandler); - impl_idtentry!(ErrorWithErrorCodeHandler); - impl_idtentry!(SeriousFuckUpHandler); - impl_idtentry!(SeriousFuckUpWithErrorCodeHandler); - - // y'know the x86 crate has a point with doing it this way, so i'm gonna do the same (: - - pub struct InterruptStackFrame { - pub value: InterruptStackValues, - } - - pub struct InterruptStackValues { - pub instruction_pointer: u32, - pub code_segment: u32, - pub cpu_flags: u32, - pub stack_pointer: u32, - } - pub enum ErrorKind { HardwareFuckUp, } diff --git a/src/main.rs b/src/main.rs index 12e368f..6cbddff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,7 @@ use core::panic::PanicInfo; use bootloader::boot_info::{FrameBuffer, FrameBufferInfo, PixelFormat}; use crate::internals::WhyDoTheyCallItOvenWhenYouOfInTheColdFoodOfOutHotEatTheFood::*; use crate::serial::potential_serial_ports; +use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame}; mod font; mod serial; @@ -37,27 +38,7 @@ pub struct FBInfo { lazy_static! { static ref IDT : InterruptDescriptorTable = { let mut idt = InterruptDescriptorTable::new(); - idt.divide_error.set_handler(internals::errors::generic_error); - idt.debug.set_handler(internals::errors::generic_error); - idt.dream_mask_sus_version.set_handler(internals::errors::generic_error); - idt.breakpoint.set_handler(internals::errors::generic_error); - idt.into_detected_overflow.set_handler(internals::errors::generic_error); - idt.in_the_fortnite_storm.set_handler(internals::errors::generic_error); - idt.owo_whats_this.set_handler(internals::errors::generic_error); - idt.device_not_available.set_handler(internals::errors::generic_error); - idt.fucky_wucky_twice.set_handler(internals::errors::super_fuck_up_error_with_code); - idt.invalid_tss.set_handler(internals::errors::generic_error_with_code); - idt.segment_not_present.set_handler(internals::errors::generic_error_with_code); - idt.stack_segment_fault.set_handler(internals::errors::generic_error_with_code); - idt.uh_oh_we_gotta_hacker_here.set_handler(internals::errors::generic_error_with_code); - idt.page_fault.set_handler(internals::errors::generic_error_with_code); - idt.x87_floating_point_exception.set_handler(internals::errors::generic_error); - idt.alignment_check.set_handler(internals::errors::generic_error_with_code); - idt.machine_check.set_handler(internals::errors::super_fuck_up_error); - idt.the_point_of_the_mask_float_exception.set_handler(internals::errors::generic_error); - idt.virtualization_exception.set_handler(internals::errors::generic_error); - idt.vmm_communication_exception.set_handler(internals::errors::generic_error_with_code); - idt.security_exception.set_handler(internals::errors::generic_error_with_code); + idt.breakpoint.set_handler_fn(internals::errors::breakpoint_exception); idt }; @@ -237,7 +218,7 @@ fn main(boot_info: &'static mut BootInfo) -> ! { drop(temp_fb_fb_height); let mut temp_fb_fb_pitch = FACEBOOK.fb_pitch.lock(); - *temp_fb_fb_pitch = framebuffer.info().stride; + *temp_fb_fb_pitch = framebuffer.info().stride * framebuffer.info().bytes_per_pixel; drop(temp_fb_fb_pitch); } // cover the screen in a nice blue @@ -254,9 +235,8 @@ fn main(boot_info: &'static mut BootInfo) -> ! { //draw_string(20,20, "),:\n\n\n\nuh oh! windows error! your computer is not compatible with windows 12\n\ncontact billgate@realmicrosoft.com to fix this issue!", Colour { r: 255, g: 255, b: 255}, framebuffer); - unsafe { - asm!("int3", options(nomem, nostack)); - } + x86_64::instructions::interrupts::int3(); + /* draw_horizcentre_string(((fb_height/2)-4)-16, "welcome to windows 12! here is info:", CUM_WHITE, framebuffer); @@ -275,7 +255,9 @@ fn main(boot_info: &'static mut BootInfo) -> ! { //draw_rainbow_string((fb_width/2) - ((7*8)/2), (fb_height/2) - 4, "gay sex", framebuffer); + */ } + loop{} } \ No newline at end of file