blob: aad07fbf216b08b1711b311c236c644bf7599a2c [file] [log] [blame]
// Copyright 2023, The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// This EFI application implements a demo for booting Android/Fuchsia from disk. See
// bootable/libbootloader/gbl/README.md for how to run the demo. See comments of
// `android_boot:android_boot_demo()` and `fuchsia_boot:fuchsia_boot_demo()` for
// supported/unsupported features at the moment.
#![no_std]
#![no_main]
// For the `vec!` macro
#[macro_use]
extern crate alloc;
use core::fmt::Write;
use efi::defs::EfiSystemTable;
use efi::{efi_print, efi_println, initialize};
#[macro_use]
mod utils;
use error::Result;
use utils::{loaded_image_path, wait_key_stroke};
#[cfg(target_arch = "riscv64")]
mod riscv64;
mod android_boot;
mod avb;
mod error;
mod fastboot;
mod fuchsia_boot;
mod net;
fn main(image_handle: *mut core::ffi::c_void, systab_ptr: *mut EfiSystemTable) -> Result<()> {
// SAFETY: Called only once here upon EFI app entry.
let entry = unsafe { initialize(image_handle, systab_ptr)? };
efi_println!(entry, "****Rust EFI Application****");
if let Ok(v) = loaded_image_path(&entry) {
efi_println!(entry, "Image path: {}", v);
}
efi_println!(entry, "Press 'f' to enter fastboot. TODO(b/328786603)");
match wait_key_stroke(&entry, 'f', 2000) {
Ok(true) => {
efi_println!(entry, "'f' pressed.");
fastboot::run_fastboot(&entry)?;
}
_ => {}
}
// For simplicity, we pick bootflow based on GPT layout.
if fuchsia_boot::is_fuchsia_gpt(&entry).is_ok() {
fuchsia_boot::fuchsia_boot_demo(entry)?;
} else {
android_boot::android_boot_demo(entry)?;
}
Ok(())
}
#[no_mangle]
pub extern "C" fn efi_main(image_handle: *mut core::ffi::c_void, systab_ptr: *mut EfiSystemTable) {
main(image_handle, systab_ptr).unwrap();
loop {}
}