diff --git a/.idea/customTargets.xml b/.idea/customTargets.xml deleted file mode 100644 index 7e79cb4..0000000 --- a/.idea/customTargets.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 283b9b4..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/tools/External Tools.xml b/.idea/tools/External Tools.xml deleted file mode 100644 index 7d5fa72..0000000 --- a/.idea/tools/External Tools.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/windows.iml b/.idea/windows.iml index b0cef5f..00f776b 100644 --- a/.idea/windows.iml +++ b/.idea/windows.iml @@ -4,9 +4,6 @@ - - - diff --git a/Cargo.toml b/Cargo.toml index 30174dd..8fd850e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,9 +9,4 @@ 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 +bootloader = "0.10.12" \ No newline at end of file diff --git a/src/allocator/mod.rs b/src/allocator/mod.rs deleted file mode 100644 index 1083d78..0000000 --- a/src/allocator/mod.rs +++ /dev/null @@ -1,55 +0,0 @@ -use core::alloc::{GlobalAlloc, Layout}; -use core::cell::UnsafeCell; -use core::ptr::null_mut; -use core::sync::atomic::AtomicUsize; -use core::sync::atomic::Ordering::SeqCst; - -const ARENA_SIZE: usize = 128 * 1024; -const MAX_SUPPORTED_ALIGN: usize = 4096; -#[repr(C, align(4096))] // 4096 == MAX_SUPPORTED_ALIGN -struct SimpleAllocator { - arena: UnsafeCell<[u8; ARENA_SIZE]>, - remaining: AtomicUsize, // we allocate from the top, counting down -} - -#[global_allocator] -static ALLOCATOR: SimpleAllocator = SimpleAllocator { - arena: UnsafeCell::new([0x55; ARENA_SIZE]), - remaining: AtomicUsize::new(ARENA_SIZE), -}; - -unsafe impl Sync for SimpleAllocator {} - -unsafe impl GlobalAlloc for SimpleAllocator { - unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - let size = layout.size(); - let align = layout.align(); - - // `Layout` contract forbids making a `Layout` with align=0, or align not power of 2. - // So we can safely use a mask to ensure alignment without worrying about UB. - let align_mask_to_round_down = !(align - 1); - - if align > MAX_SUPPORTED_ALIGN { - return null_mut(); - } - - let mut allocated = 0; - if self - .remaining - .fetch_update(SeqCst, SeqCst, |mut remaining| { - if size > remaining { - return None; - } - remaining -= size; - remaining &= align_mask_to_round_down; - allocated = remaining; - Some(remaining) - }) - .is_err() - { - return null_mut(); - }; - (self.arena.get() as *mut u8).add(allocated) - } - unsafe fn dealloc(&self, _ptr: *mut u8, _layout: Layout) {} -} \ No newline at end of file diff --git a/src/internals/errors.rs b/src/internals/errors.rs deleted file mode 100644 index 6daad11..0000000 --- a/src/internals/errors.rs +++ /dev/null @@ -1,121 +0,0 @@ - -use core::borrow::{BorrowMut}; - - -use crate::{InterruptStackFrame, font, FACEBOOK}; -use crate::internals::WhyDoTheyCallItOvenWhenYouOfInTheColdFoodOfOutHotEatTheFood::{COMMUNIST_RED, CUM_WHITE, Colour}; - -fn draw_box(x: usize, y: usize, width: usize, height: usize, color: Colour, mut fb: &mut [u8]) { - let pixelwidth = FACEBOOK.fb_pixelwidth.lock(); - let pitch = FACEBOOK.fb_pitch.lock(); - let colourtype = FACEBOOK.fb_colourtype.lock(); - - for i in 0..width { - for j in 0..height { - let pixel = (y * &*pitch) + (x * &*pixelwidth) + (i * &*pixelwidth) + (j * &*pitch); - if *colourtype == 0 { //BGR - unsafe { - fb[pixel + 0] = color.b; - fb[pixel + 1] = color.g; - fb[pixel + 2] = color.r; - } - } else if *colourtype == 1 { //RGB - unsafe { - fb[pixel + 0] = color.r; - fb[pixel + 1] = color.g; - fb[pixel + 2] = color.b; - } - } else { - // average values - let avg = (color.r as u16 + color.g as u16 + color.b as u16) / 3; - unsafe {fb[pixel + 0] = avg as u8;} - } - } - } - - drop(pixelwidth); - drop(pitch); - drop(colourtype); -} - -fn put_pixel(x: usize, y: usize, color: Colour, mut fb: &mut [u8]) { - let pixelwidth = FACEBOOK.fb_pixelwidth.lock(); - let pitch = FACEBOOK.fb_pitch.lock(); - let colourtype = FACEBOOK.fb_colourtype.lock(); - - let pixel = (y * &*pitch) + (x * &*pixelwidth); - - if *colourtype == 0 { //BGR - unsafe { - fb[pixel + 0] = color.b; - fb[pixel + 1] = color.g; - fb[pixel + 2] = color.r; - } - } else if *colourtype == 1 { //RGB - unsafe { - fb[pixel + 0] = color.r; - fb[pixel + 1] = color.g; - fb[pixel + 2] = color.b; - } - } else { - // average values - let avg = (color.r as u16 + color.g as u16 + color.b as u16) / 3; - unsafe {fb[pixel + 0] = avg as u8;} - } - - drop(pixelwidth); - drop(pitch); - drop(colourtype); -} - - -fn draw_char(x: usize, y: usize, c: char, color: Colour, mut fb: &mut [u8]) { - let font = font::BASIC_LEGACY; - // font is 8x8, stored in a 2d array of bytes - let char_width = 8; - let char_height = 8; - - let char_index = c as usize; - let char_data = font[char_index]; - - for row in 0..char_height { - for col in 0..char_width { - let bit = (char_data[row] >> col) & 1; - if bit >= 1 { - put_pixel(x + col, y + row, color, fb); - } - } - } -} - -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 = (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); - drop(fb_height); - drop(fb); -} \ No newline at end of file diff --git a/src/internals/mod.rs b/src/internals/mod.rs index 4050443..941ed87 100644 --- a/src/internals/mod.rs +++ b/src/internals/mod.rs @@ -1,7 +1,4 @@ -pub mod errors; - pub mod WhyDoTheyCallItOvenWhenYouOfInTheColdFoodOfOutHotEatTheFood { - use core::arch::asm; use core::marker::PhantomData; #[derive(Clone, Copy)] @@ -22,6 +19,36 @@ 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}; + pub struct IDTEntry { + based_offset: u16, + code_selector: u16, + ist_offset_wastes_6_bits: u8, + attributes: u8, + mid_offset: u16, + offset_popping_off: u32, + what: PhantomData + } + + 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 struct ErrorHandler(()); + pub enum ErrorKind { HardwareFuckUp, } diff --git a/src/main.rs b/src/main.rs index 6cbddff..6fa17cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,58 +1,16 @@ -#![feature(abi_x86_interrupt)] -#![feature(default_alloc_error_handler)] #![no_std] #![no_main] -use allocator::*; - -extern crate alloc; - -use alloc::vec::Vec; -use spin::Mutex; -use core::arch::asm; -use lazy_static::lazy_static; use bootloader::{entry_point, BootInfo, boot_info}; 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; mod internals; -mod allocator; -pub struct FBInfo { - pub fb_mutex: Mutex>, - pub fb_pixelwidth: Mutex, - pub fb_colourtype: Mutex, - pub fb_pitch: Mutex, - pub fb_width: Mutex, - pub fb_height: Mutex, -} - -// THIS IS THE ONLY GLOBAL VARIABLE WE WILL EVER HAVE, MARK THIS ON MY FUCKING GRAVE -//pub static mut FRAMEBUFFER: Option = None; - -lazy_static! { - static ref IDT : InterruptDescriptorTable = { - let mut idt = InterruptDescriptorTable::new(); - idt.breakpoint.set_handler_fn(internals::errors::breakpoint_exception); - idt - }; - - static ref FACEBOOK : FBInfo = { - FBInfo { - fb_mutex: Mutex::new(Vec::new()), - fb_pixelwidth: Mutex::new(0), - fb_colourtype: Mutex::new(0), - fb_pitch: Mutex::new(0), - fb_width: Mutex::new(0), - fb_height: Mutex::new(0), - } - }; -} const RAINBOW : [Colour; 6] = [Colour{r:255,g:0,b:0}, Colour{r:255,g:127,b:0}, Colour{r:255,g:255,b:0}, Colour{r:0,g:255,b:0}, Colour{r:0,g:255,b:255}, Colour{r:0,g:0,b:255}]; @@ -70,7 +28,7 @@ fn KernelPanic(msg: KernelError, fb: &mut FrameBuffer) { } } -pub fn put_pixel(x: usize, y: usize, color: Colour, fb: &mut FrameBuffer) { +fn put_pixel(x: usize, y: usize, color: Colour, fb: &mut FrameBuffer) { let pixelwidth = fb.info().bytes_per_pixel; let pitch = fb.info().stride * pixelwidth; @@ -91,7 +49,7 @@ pub fn put_pixel(x: usize, y: usize, color: Colour, fb: &mut FrameBuffer) { } } -pub fn draw_box(x: usize, y: usize, width: usize, height: usize, color: Colour, fb: &mut FrameBuffer) { +fn draw_box(x: usize, y: usize, width: usize, height: usize, color: Colour, fb: &mut FrameBuffer) { let pixelwidth = fb.info().bytes_per_pixel; let pitch = fb.info().stride * pixelwidth; @@ -134,7 +92,7 @@ fn draw_char(x: usize, y: usize, c: char, color: Colour, fb: &mut FrameBuffer) { } } -pub fn draw_string(x: usize, y: usize, s: &str, color: Colour, fb: &mut FrameBuffer) { +fn draw_string(x: usize, y: usize, s: &str, color: Colour, fb: &mut FrameBuffer) { let mut x_tmp = x; let mut y_tmp = y; @@ -149,7 +107,7 @@ pub fn draw_string(x: usize, y: usize, s: &str, color: Colour, fb: &mut FrameBuf } } -pub fn draw_horizcentre_string(y: usize, s: &str, color: Colour, fb: &mut FrameBuffer) { +fn draw_horizcentre_string(y: usize, s: &str, color: Colour, fb: &mut FrameBuffer) { let mut x_tmp = (fb.info().horizontal_resolution - s.len() * 8) / 2; let mut y_tmp = y; @@ -164,7 +122,7 @@ pub fn draw_horizcentre_string(y: usize, s: &str, color: Colour, fb: &mut FrameB } } -pub fn draw_rainbow_string(x: usize, y: usize, s: &str, fb: &mut FrameBuffer) { +fn draw_rainbow_string(x: usize, y: usize, s: &str, fb: &mut FrameBuffer) { let mut x_tmp = x; let mut y_tmp = y; @@ -183,61 +141,23 @@ pub fn draw_rainbow_string(x: usize, y: usize, s: &str, fb: &mut FrameBuffer) { } } - entry_point!(main); fn main(boot_info: &'static mut BootInfo) -> ! { if let Some(framebuffer) = boot_info.framebuffer.as_mut() { - // set up the framebuffer - unsafe { - let mut colourtype: u8; - if framebuffer.info().pixel_format == PixelFormat::RGB { - colourtype = 1; - } else { - colourtype = 0; - } - let mut temp_fb = FACEBOOK.fb_mutex.lock(); - *temp_fb = Vec::from_raw_parts(framebuffer.buffer_mut().as_mut_ptr(), framebuffer.buffer_mut().len(), framebuffer.buffer_mut().len()); - drop(temp_fb); - - let mut temp_fb_pixel_width = FACEBOOK.fb_pixelwidth.lock(); - *temp_fb_pixel_width = framebuffer.info().bytes_per_pixel; - drop(temp_fb_pixel_width); - - let mut temp_fb_fb_colourtype = FACEBOOK.fb_colourtype.lock(); - *temp_fb_fb_colourtype = colourtype; - drop(temp_fb_fb_colourtype); - - let mut temp_fb_fb_width = FACEBOOK.fb_width.lock(); - *temp_fb_fb_width = framebuffer.info().horizontal_resolution; - drop(temp_fb_fb_width); - - let mut temp_fb_fb_height = FACEBOOK.fb_height.lock(); - *temp_fb_fb_height = framebuffer.info().vertical_resolution; - drop(temp_fb_fb_height); - - let mut temp_fb_fb_pitch = FACEBOOK.fb_pitch.lock(); - *temp_fb_fb_pitch = framebuffer.info().stride * framebuffer.info().bytes_per_pixel; - drop(temp_fb_fb_pitch); - } // cover the screen in a nice blue draw_box(0, 0, framebuffer.info().horizontal_resolution, framebuffer.info().vertical_resolution, Colour{r:30,g:129,b:176}, framebuffer); let fb_width = framebuffer.info().horizontal_resolution; let fb_height = framebuffer.info().vertical_resolution; - IDT.load(); - // draw a test string //draw_string(20, 20, "i love drinking cum\nnewline test", Colour { r: 255, g: 0, b: 255 }, framebuffer); //draw_rainbow_string(20, 40, "gay sex", framebuffer); //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); - x86_64::instructions::interrupts::int3(); - /* - draw_horizcentre_string(((fb_height/2)-4)-16, "welcome to windows 12! here is info:", CUM_WHITE, framebuffer); // time for some funny com port stuff @@ -255,9 +175,7 @@ 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