From 62905d08caae87595d1559e31dfafa899d2f9284 Mon Sep 17 00:00:00 2001 From: husky Date: Sun, 3 Apr 2022 00:44:08 -0700 Subject: [PATCH] added a few things --- .cargo/config.toml | 7 ++ .idea/windows.iml | 1 + assembly/boot.asm | 25 ++----- assets/logo.bmp | Bin 0 -> 90654 bytes simple_boot/Cargo.toml | 11 +++ simple_boot/src/main.rs | 78 ++++++++++++++++++++ src/font.rs | 134 ++++++++++++++++++++++++++++++++++ src/main.rs | 157 ++++++++++++++++++++++++++++++++++++---- x86_64-custom.json | 15 ++++ 9 files changed, 398 insertions(+), 30 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 assets/logo.bmp create mode 100644 simple_boot/Cargo.toml create mode 100644 simple_boot/src/main.rs create mode 100644 src/font.rs create mode 100644 x86_64-custom.json diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..b814980 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,7 @@ +[target.'cfg(target_os = "none")'] +runner = "cargo run --package simple_boot --" + +[alias] +kbuild = "build --target x86_64-custom.json -Zbuild-std=core -Zbuild-std-features=compiler-builtins-mem" +kimage = "run --target x86_64-custom.json -Zbuild-std=core -Zbuild-std-features=compiler-builtins-mem -- --no-run" +krun = "run --target x86_64-custom.json -Zbuild-std=core -Zbuild-std-features=compiler-builtins-mem" \ No newline at end of file diff --git a/.idea/windows.iml b/.idea/windows.iml index c254557..00f776b 100644 --- a/.idea/windows.iml +++ b/.idea/windows.iml @@ -2,6 +2,7 @@ + diff --git a/assembly/boot.asm b/assembly/boot.asm index bf4ebc7..a8bd353 100644 --- a/assembly/boot.asm +++ b/assembly/boot.asm @@ -4,29 +4,20 @@ xor ax, ax mov ds, ax +mov es,ax + +cli +mov ss,bx +mov sp,ax +sti ; set graphics mode mov ax, 00h mov ah, 0x00 int 0x10 -; write string to screen -mov bh, 0 -mov bl, 0b00001111 -mov al, 1 -mov ah, 13h -mov cx, WINDOWS_STR_END - WINDOWS_STR -mov dl, 0 -mov dh, 0 -push cs -pop es -mov bp, WINDOWS_STR -int 0x10 - - - -WINDOWS_STR: db 'microsoft windows', 0 -WINDOWS_STR_END: +; jump after bootloader +jmp 0x07E0:0x0000 times 510-($-$$) db 0 dw 0xAA55 \ No newline at end of file diff --git a/assets/logo.bmp b/assets/logo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1ea6ea2e5c0345e9f7547fdb9902d25b98a223f0 GIT binary patch literal 90654 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 Z9Po3%&jCLN{2cIez|R3c2mWgg{69Ui2;Tqz literal 0 HcmV?d00001 diff --git a/simple_boot/Cargo.toml b/simple_boot/Cargo.toml new file mode 100644 index 0000000..5302cdb --- /dev/null +++ b/simple_boot/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "simple_boot" +version = "0.1.0" +authors = ["Philipp Oppermann "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bootloader-locator = "0.0.4" # for locating the `bootloader` dependency on disk +locate-cargo-manifest = "0.2.0" # for locating the kernel's `Cargo.toml` diff --git a/simple_boot/src/main.rs b/simple_boot/src/main.rs new file mode 100644 index 0000000..92814ba --- /dev/null +++ b/simple_boot/src/main.rs @@ -0,0 +1,78 @@ +use std::{ + path::{Path, PathBuf}, + process::Command, +}; + +const RUN_ARGS: &[&str] = &["--no-reboot", "-s"]; + +fn main() { + let mut args = std::env::args().skip(1); // skip executable name + + let kernel_binary_path = { + let path = PathBuf::from(args.next().unwrap()); + path.canonicalize().unwrap() + }; + let no_boot = if let Some(arg) = args.next() { + match arg.as_str() { + "--no-run" => true, + other => panic!("unexpected argument `{}`", other), + } + } else { + false + }; + + let bios = create_disk_images(&kernel_binary_path); + + if no_boot { + println!("Created disk image at `{}`", bios.display()); + return; + } + + let mut run_cmd = Command::new("qemu-system-x86_64"); + run_cmd + .arg("-drive") + .arg(format!("format=raw,file={}", bios.display())); + run_cmd.args(RUN_ARGS); + + let exit_status = run_cmd.status().unwrap(); + if !exit_status.success() { + std::process::exit(exit_status.code().unwrap_or(1)); + } +} + +pub fn create_disk_images(kernel_binary_path: &Path) -> PathBuf { + let bootloader_manifest_path = bootloader_locator::locate_bootloader("bootloader").unwrap(); + let kernel_manifest_path = locate_cargo_manifest::locate_manifest().unwrap(); + + let mut build_cmd = Command::new(env!("CARGO")); + build_cmd.current_dir(bootloader_manifest_path.parent().unwrap()); + build_cmd.arg("builder"); + build_cmd + .arg("--kernel-manifest") + .arg(&kernel_manifest_path); + build_cmd.arg("--kernel-binary").arg(&kernel_binary_path); + build_cmd + .arg("--target-dir") + .arg(kernel_manifest_path.parent().unwrap().join("target")); + build_cmd + .arg("--out-dir") + .arg(kernel_binary_path.parent().unwrap()); + build_cmd.arg("--quiet"); + + if !build_cmd.status().unwrap().success() { + panic!("build failed"); + } + + let kernel_binary_name = kernel_binary_path.file_name().unwrap().to_str().unwrap(); + let disk_image = kernel_binary_path + .parent() + .unwrap() + .join(format!("boot-bios-{}.img", kernel_binary_name)); + if !disk_image.exists() { + panic!( + "Disk image does not exist at {} after bootloader build", + disk_image.display() + ); + } + disk_image +} diff --git a/src/font.rs b/src/font.rs new file mode 100644 index 0000000..b70819d --- /dev/null +++ b/src/font.rs @@ -0,0 +1,134 @@ +#![no_std] + +pub const NOTHING_TO_DISPLAY: [u8; 8] = [0x00; 8]; + +pub const BASIC_LEGACY: [[u8; 8]; 128] = [ + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + NOTHING_TO_DISPLAY, + [0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00], + [0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00], + [0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00], + [0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00], + [0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00], + [0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00], + [0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00], + [0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00], + [0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06], + [0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00], + [0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00], + [0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00], + [0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00], + [0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00], + [0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00], + [0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00], + [0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00], + [0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00], + [0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00], + [0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00], + [0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00], + [0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00], + [0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06], + [0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00], + [0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00], + [0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00], + [0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00], + [0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00], + [0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00], + [0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00], + [0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00], + [0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00], + [0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00], + [0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00], + [0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00], + [0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00], + [0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], + [0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00], + [0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00], + [0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00], + [0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00], + [0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00], + [0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00], + [0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00], + [0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00], + [0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00], + [0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00], + [0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], + [0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00], + [0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00], + [0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00], + [0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00], + [0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00], + [0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00], + [0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00], + [0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00], + [0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00], + [0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF], + [0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00], + [0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00], + [0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00], + [0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00], + [0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00], + [0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00], + [0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F], + [0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00], + [0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], + [0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E], + [0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00], + [0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00], + [0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00], + [0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00], + [0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00], + [0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F], + [0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78], + [0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00], + [0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00], + [0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00], + [0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00], + [0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00], + [0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00], + [0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00], + [0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F], + [0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00], + [0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00], + [0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00], + [0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00], + [0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + NOTHING_TO_DISPLAY, +]; diff --git a/src/main.rs b/src/main.rs index a1631bd..c9176ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,22 +1,153 @@ -#!no_std +#![no_std] +#![no_main] -fn print_vga_buffer(string : &str) { - // get address of VGA buffer - let mut vga_buffer = 0xb8000 as *mut u8; +use bootloader::{entry_point, BootInfo, boot_info}; +use core::panic::PanicInfo; +use bootloader::boot_info::{FrameBuffer, FrameBufferInfo, PixelFormat}; - // get length of string - let len = string.len(); +mod font; - // write string to VGA buffer - for i in 0..len { - unsafe { - *vga_buffer = string.as_bytes()[i]; - vga_buffer = vga_buffer.offset(2); + +#[derive(Clone, Copy)] +struct Point { + x: i32, + y: i32, +} + +#[derive(Clone, Copy)] +struct Colour { + r: u8, + g: u8, + b: u8, +} + + + +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}]; + +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} +} + +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; + + let pixel = (y * pitch) + (x * pixelwidth); + + if fb.info().pixel_format == PixelFormat::BGR { + fb.buffer_mut()[pixel + 0] = color.b; + fb.buffer_mut()[pixel + 1] = color.g; + fb.buffer_mut()[pixel + 2] = color.r; + } else if fb.info().pixel_format == PixelFormat::RGB { + fb.buffer_mut()[pixel + 0] = color.r; + fb.buffer_mut()[pixel + 1] = color.g; + fb.buffer_mut()[pixel + 2] = color.b; + } else { + // average values + let avg = (color.r as u16 + color.g as u16 + color.b as u16) / 3; + fb.buffer_mut()[pixel + 0] = avg as u8; + } +} + +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; + + for i in 0..width { + for j in 0..height { + let pixel = (y * pitch) + (x * pixelwidth) + (i * pixelwidth) + (j * pitch); + if fb.info().pixel_format == PixelFormat::BGR { + fb.buffer_mut()[pixel + 0] = color.b; + fb.buffer_mut()[pixel + 1] = color.g; + fb.buffer_mut()[pixel + 2] = color.r; + } else if fb.info().pixel_format == PixelFormat::RGB { + fb.buffer_mut()[pixel + 0] = color.r; + fb.buffer_mut()[pixel + 1] = color.g; + fb.buffer_mut()[pixel + 2] = color.b; + } else { + // average values + let avg = (color.r as u16 + color.g as u16 + color.b as u16) / 3; + fb.buffer_mut()[pixel + 0] = avg as u8; + } } } } +fn draw_char(x: usize, y: usize, c: char, color: Colour, fb: &mut FrameBuffer) { + let font = font::BASIC_LEGACY; + // font is 8x8, stored in a 2d array of bytes + let char_width = 8; + let char_height = 8; -fn main() { - print_vga_buffer("microsoft"); + 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_string(x: usize, y: usize, s: &str, color: Colour, fb: &mut FrameBuffer) { + let mut x_tmp = x; + let mut y_tmp = y; + + for c in s.chars() { + if c == '\n' { + x_tmp = x; + y_tmp += 8; + } else { + draw_char(x_tmp, y_tmp, c, color, fb); + x_tmp += 8; + } + } +} + +fn draw_rainbow_string(x: usize, y: usize, s: &str, fb: &mut FrameBuffer) { + let mut x_tmp = x; + let mut y_tmp = y; + + let mut i = 0; + + for c in s.chars() { + if c == '\n' { + x_tmp = x; + y_tmp += 8; + } else { + let color = RAINBOW[i % RAINBOW.len() as usize]; + draw_char(x_tmp, y_tmp, c, color, fb); + x_tmp += 8; + i += 1; + } + } +} + +entry_point!(main); + +fn main(boot_info: &'static mut BootInfo) -> ! { + + if let Some(framebuffer) = boot_info.framebuffer.as_mut() { + // 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; + + // 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); + + draw_rainbow_string((fb_width/2) - ((7*8)/2), (fb_height/2) - 4, "gay sex", framebuffer); + + } + + loop{} } \ No newline at end of file diff --git a/x86_64-custom.json b/x86_64-custom.json new file mode 100644 index 0000000..346fefd --- /dev/null +++ b/x86_64-custom.json @@ -0,0 +1,15 @@ +{ + "llvm-target": "x86_64-unknown-none", + "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", + "arch": "x86_64", + "target-endian": "little", + "target-pointer-width": "64", + "target-c-int-width": "32", + "os": "none", + "executables": true, + "linker-flavor": "ld.lld", + "linker": "rust-lld", + "panic-strategy": "abort", + "disable-redzone": true, + "features": "-mmx,-sse,+soft-float" +} \ No newline at end of file