summaryrefslogtreecommitdiffstats
path: root/rsdos/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--rsdos/src/main.rs26
1 files changed, 12 insertions, 14 deletions
diff --git a/rsdos/src/main.rs b/rsdos/src/main.rs
index e6b7d2a..2ba5d32 100644
--- a/rsdos/src/main.rs
+++ b/rsdos/src/main.rs
@@ -1,6 +1,6 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3#![allow(static_mut_refs, unsafe_code)] 3#![allow(unsafe_code)]
4 4
5use core::panic::PanicInfo; 5use core::panic::PanicInfo;
6use rsnix::uefi::*; 6use rsnix::uefi::*;
@@ -31,8 +31,15 @@ fn panic(info: &PanicInfo) -> ! {
31// --------------------------------------------------------------------------- 31// ---------------------------------------------------------------------------
32// EFI entry point 32// EFI entry point
33// --------------------------------------------------------------------------- 33// ---------------------------------------------------------------------------
34/// EFI entry point.
35///
36/// # Safety
37///
38/// The firmware hands us raw pointers (image handle, system table) that
39/// must remain valid for the lifetime of the call — a contract guaranteed
40/// by the UEFI loader.
34#[no_mangle] 41#[no_mangle]
35pub extern "efiapi" fn efi_main(image_handle: Handle, system_table: *mut SystemTable) -> ! { 42pub unsafe extern "efiapi" fn efi_main(image_handle: Handle, system_table: *mut SystemTable) -> ! {
36 let st = unsafe { &mut *system_table }; 43 let st = unsafe { &mut *system_table };
37 let bs = unsafe { &mut *st.boot_services }; 44 let bs = unsafe { &mut *st.boot_services };
38 let con_out = unsafe { &mut *st.con_out }; 45 let con_out = unsafe { &mut *st.con_out };
@@ -83,22 +90,13 @@ pub extern "efiapi" fn efi_main(image_handle: Handle, system_table: *mut SystemT
83 rsnix::serial_println!("gop: not found (0x{:x})", gop_result); 90 rsnix::serial_println!("gop: not found (0x{:x})", gop_result);
84 } 91 }
85 rsnix::vt::init(); 92 rsnix::vt::init();
86 rsnix::serial_println!( 93 let (rows, cols) = rsnix::vt::size();
87 "vt: terminal ready ({}x{})", 94 rsnix::serial_println!("vt: terminal ready ({}x{})", rows, cols);
88 {
89 let (rows, cols) = rsnix::vt::size();
90 rows
91 },
92 {
93 let (rows, cols) = rsnix::vt::size();
94 cols
95 }
96 );
97 95
98 // ExitBootServices — we now own the machine 96 // ExitBootServices — we now own the machine
99 if unsafe { (bs.exit_boot_services)(image_handle, map_key) } != EFI_SUCCESS { 97 if unsafe { (bs.exit_boot_services)(image_handle, map_key) } != EFI_SUCCESS {
100 rsnix::serial_println!("WARN: ExitBootServices failed, retrying..."); 98 rsnix::serial_println!("WARN: ExitBootServices failed, retrying...");
101 match rsnix::memory::refresh_and_exit(bs, image_handle) { 99 match unsafe { rsnix::memory::refresh_and_exit(bs, image_handle) } {
102 Ok(_) => {} 100 Ok(_) => {}
103 Err(e) => { 101 Err(e) => {
104 rsnix::serial_println!("FATAL: cannot ExitBootServices (0x{:x})", e); 102 rsnix::serial_println!("FATAL: cannot ExitBootServices (0x{:x})", e);