From 27d323f7ce88b238b5dc94f350832b081e7ca6ff Mon Sep 17 00:00:00 2001 From: TerminalCursor Date: Wed, 29 Jun 2022 21:14:02 -0700 Subject: Initial commit --- .cargo/config | 6 +++ .gitignore | 1 + Cargo.lock | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 11 ++++++ OVMF_CODE.fd | Bin 0 -> 1966080 bytes OVMF_VARS.fd | Bin 0 -> 131072 bytes qemu.sh | 7 ++++ rust-toolchain | 1 + src/gfx.rs | 54 +++++++++++++++++++++++++++ src/main.rs | 33 ++++++++++++++++ 10 files changed, 229 insertions(+) create mode 100644 .cargo/config create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 OVMF_CODE.fd create mode 100644 OVMF_VARS.fd create mode 100755 qemu.sh create mode 100644 rust-toolchain create mode 100644 src/gfx.rs create mode 100644 src/main.rs diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..d33a138 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,6 @@ +[build] +target = "x86_64-unknown-uefi" + +[unstable] +build-std = ["core", "compiler_builtins", "alloc"] +build-std-features = ["compiler-builtins-mem"] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..6576b38 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,116 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bit_field" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb6dd1c2376d2e096796e234a70e17e94cc2d5d54ff8ce42b28cef1d0d359a4" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "gb" +version = "0.1.0" +dependencies = [ + "uefi", + "uefi-services", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "proc-macro2" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "ucs2" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad643914094137d475641b6bab89462505316ec2ce70907ad20102d28a79ab8" +dependencies = [ + "bit_field", +] + +[[package]] +name = "uefi" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "705535cf386e4b033cc7acdea55ec8710f3dde2f07457218791aac35c83be21f" +dependencies = [ + "bitflags", + "log", + "ucs2", + "uefi-macros", +] + +[[package]] +name = "uefi-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9917831bc5abb78c2e6a0f4fba2be165105ed53d288718c999e0efbd433bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "uefi-services" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa8d57b5388d35f8203951a41ef64672a93a5ce2a00414f63b73fe96d9c5348" +dependencies = [ + "cfg-if", + "log", + "uefi", +] + +[[package]] +name = "unicode-ident" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..fca4ee6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "gb" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +uefi = { version = "0.16.0", features = ["exts"] } +uefi-services = "0.13.0" + diff --git a/OVMF_CODE.fd b/OVMF_CODE.fd new file mode 100644 index 0000000..8f5bad0 Binary files /dev/null and b/OVMF_CODE.fd differ diff --git a/OVMF_VARS.fd b/OVMF_VARS.fd new file mode 100644 index 0000000..35272d3 Binary files /dev/null and b/OVMF_VARS.fd differ diff --git a/qemu.sh b/qemu.sh new file mode 100755 index 0000000..e4459ed --- /dev/null +++ b/qemu.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +mkdir -p target/x86_64-unknown-uefi/debug/efi +cp target/x86_64-unknown-uefi/debug/gb.efi target/x86_64-unknown-uefi/debug/efi/gb.efi +qemu-system-x86_64 -drive if=pflash,format=raw,unit=0,file=OVMF_CODE.fd,readonly=on -drive if=pflash,format=raw,unit=1,file=OVMF_VARS.fd,readonly=on -drive file=fat:rw:target/x86_64-unknown-uefi/debug/efi/ +#cp target/x86_64-unknown-uefi/release/gb.efi .tmp/bootx64.efi +#qemu-system-x86_64 -drive if=pflash,format=raw,unit=0,file=OVMF_CODE.fd,readonly=on -drive if=pflash,format=raw,unit=1,file=OVMF_VARS.fd,readonly=on -drive file=fat:rw:.tmp diff --git a/rust-toolchain b/rust-toolchain new file mode 100644 index 0000000..bf867e0 --- /dev/null +++ b/rust-toolchain @@ -0,0 +1 @@ +nightly diff --git a/src/gfx.rs b/src/gfx.rs new file mode 100644 index 0000000..fda870c --- /dev/null +++ b/src/gfx.rs @@ -0,0 +1,54 @@ +use uefi::prelude::*; +use uefi::proto::console::gop::*; + +pub struct GOP<'boot>(&'boot mut GraphicsOutput<'boot>); + +impl<'boot> GOP<'boot> { + pub fn new(st: &SystemTable) -> Result, uefi::Error> { + let res = st.boot_services().locate_protocol::(); + match res { + Ok(protocol) => { + return Ok(unsafe { GOP(&mut *protocol.get()) }) + }, + Err(e) => {return Err(e)} + } + } + + pub fn get_modes(&'boot self) -> impl ExactSizeIterator + 'boot { + self.0.modes() + } + + pub fn set_mode(&mut self, mode: &Mode) -> Result<(), uefi::Error> { + self.0.set_mode(mode) + } + + pub fn set_highest_resolution(&mut self) -> Result<(), uefi::Error> { + let mut last_mode; + let res = self.0.query_mode(0); + match res { + Ok(mode) => {last_mode = mode;}, + Err(e) => {return Err(e)} + } + for mode in self.0.modes() { + last_mode = mode; + } + self.0.set_mode(&last_mode) + } + + pub fn get_resolution(&self) -> (usize, usize) { + self.0.current_mode_info().resolution() + } + + pub fn fill_box(&mut self, + x: usize, y: usize, + dx: usize, dy: usize, + r: u8, g: u8, b: u8) + -> Result<(), uefi::Error> { + let blt_op = BltOp::VideoFill { + color: BltPixel::new(r, g, b), + dest: (x, y), + dims: (dx, dy) + }; + self.0.blt(blt_op) + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..da78328 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,33 @@ +#![no_main] +#![no_std] +#![feature(abi_efiapi)] + +mod gfx; +use crate::gfx::*; + +use uefi::prelude::*; +use core::fmt::Write; + +#[entry] +fn main(_handle: Handle, mut system_table: SystemTable) -> Status { + uefi_services::init(&mut system_table).unwrap(); + + system_table.stdout().clear().unwrap(); + writeln!(system_table.stdout(), "Clearing the screen!").unwrap(); + + let mut gop = GOP::new(&system_table).unwrap(); + gop.set_highest_resolution().unwrap(); + writeln!(system_table.stdout(), "Set max resolution!").unwrap(); + + let gop = GOP::new(&system_table).unwrap(); + let (dx, dy) = gop.get_resolution(); + writeln!(system_table.stdout(), "Resolution: {}x{}", dx, dy).unwrap(); + + let mut gop = GOP::new(&system_table).unwrap(); + gop.fill_box(0, 0, 16, 16, 128, 0, 0).unwrap(); + + #[cfg(not(debug_assertions))] + loop {} + #[allow(unreachable_code)] + Status::SUCCESS +} -- cgit v1.2.1