summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTerminalCursor <tcurse@terminalcursor.xyz>2022-06-29 21:14:02 -0700
committerTerminalCursor <tcurse@terminalcursor.xyz>2022-06-29 21:14:02 -0700
commit27d323f7ce88b238b5dc94f350832b081e7ca6ff (patch)
tree0b9ef10eca68ce97a21565bdf3e1b2df345e25cf
Initial commit
-rw-r--r--.cargo/config6
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock116
-rw-r--r--Cargo.toml11
-rw-r--r--OVMF_CODE.fdbin0 -> 1966080 bytes
-rw-r--r--OVMF_VARS.fdbin0 -> 131072 bytes
-rwxr-xr-xqemu.sh7
-rw-r--r--rust-toolchain1
-rw-r--r--src/gfx.rs54
-rw-r--r--src/main.rs33
10 files changed, 229 insertions, 0 deletions
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
--- /dev/null
+++ b/OVMF_CODE.fd
Binary files differ
diff --git a/OVMF_VARS.fd b/OVMF_VARS.fd
new file mode 100644
index 0000000..35272d3
--- /dev/null
+++ b/OVMF_VARS.fd
Binary files 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<Boot>) -> Result<GOP<'boot>, uefi::Error> {
+ let res = st.boot_services().locate_protocol::<GraphicsOutput>();
+ match res {
+ Ok(protocol) => {
+ return Ok(unsafe { GOP(&mut *protocol.get()) })
+ },
+ Err(e) => {return Err(e)}
+ }
+ }
+
+ pub fn get_modes(&'boot self) -> impl ExactSizeIterator<Item = Mode> + '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<Boot>) -> 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
+}