mirror of
https://github.com/phil-opp/blog_os.git
synced 2025-12-16 14:27:49 +00:00
loading UEFI using ovmf_prebuilt=0.2.3 with ovmf_code and ovmf_vars
This commit is contained in:
@@ -1011,27 +1011,35 @@ Now we can create our `qemu-uefi` executable at `src/bin/qemu-uefi.rs`:
|
|||||||
|
|
||||||
```rust ,hl_lines=3-15
|
```rust ,hl_lines=3-15
|
||||||
// src/bin/qemu-uefi.rs
|
// src/bin/qemu-uefi.rs
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
env,
|
env, process::{self, Command}
|
||||||
process::{self, Command},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use ovmf_prebuilt::{Arch, FileType, Prebuilt, Source};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
let prebuilt =
|
||||||
|
Prebuilt::fetch(Source::LATEST, "target/ovmf").unwrap();
|
||||||
|
let ovmf_code = prebuilt.get_file(Arch::X64, FileType::Code);
|
||||||
|
let ovmf_vars = prebuilt.get_file(Arch::X64, FileType::Vars);
|
||||||
let mut qemu = Command::new("qemu-system-x86_64");
|
let mut qemu = Command::new("qemu-system-x86_64");
|
||||||
qemu.arg("-drive");
|
qemu.args([
|
||||||
qemu.arg(format!("format=raw,file={}", env!("UEFI_IMAGE")));
|
"-drive",
|
||||||
qemu.arg("-bios").arg(ovmf_prebuilt::ovmf_pure_efi());
|
&format!("format=raw,if=pflash,readonly=on,file={}", ovmf_code.to_str().unwrap()),
|
||||||
|
"-drive",
|
||||||
|
&format!("format=raw,if=pflash,file={}", ovmf_vars.to_str().unwrap()),
|
||||||
|
"-drive",
|
||||||
|
&format!("format=raw,file={}", env!("UEFI_IMAGE")),
|
||||||
|
]);
|
||||||
let exit_status = qemu.status().unwrap();
|
let exit_status = qemu.status().unwrap();
|
||||||
process::exit(exit_status.code().unwrap_or(-1));
|
process::exit(exit_status.code().unwrap_or(-1));
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
It's very similar to our `qemu-bios` executable.
|
It's very similar to our `qemu-bios` executable.
|
||||||
The only two differences are that it passes an additional `-bios` argument and that it uses the `UEFI_IMAGE` instead of the `BIOS_IMAGE`.
|
The only two differences are that it passes two additional `-drive if=pflash,..` arguments to load UEFI firmware (`OVMF_CODE.fd`) and writable NVRAM (`OVMF_VARS.fd`), and that it uses the `UEFI_IMAGE` instead of the `BIOS_IMAGE`.
|
||||||
Using a quick `cargo run --bin qemu-uefi`, we can confirm that it works as intended.
|
Using a quick `cargo run --bin qemu-uefi`, we can confirm that it works as intended.
|
||||||
|
|
||||||
|
|
||||||
### Screen Output
|
### Screen Output
|
||||||
|
|
||||||
While we see some screen output from the bootloader, our kernel still does nothing.
|
While we see some screen output from the bootloader, our kernel still does nothing.
|
||||||
|
|||||||
Reference in New Issue
Block a user