blob: 5cd67803691783d2bce549c6c806b32a3edccf35 [file] [log] [blame]
//! Trivial Shodan elf loader capsule
use kernel::{AppId, AppSlice, Callback, Driver, ReturnCode, Shared};
use matcha_hal::dprintf;
use matcha_hal::mailbox_hal::MailboxHAL;
pub struct ElfLoaderCapsule {
mailbox_hal: Option<&'static dyn MailboxHAL>,
}
impl ElfLoaderCapsule {
pub fn new() -> Self {
Self { mailbox_hal: None }
}
pub fn set_mailbox(&mut self, mailbox: &'static dyn MailboxHAL) {
self.mailbox_hal = Some(mailbox);
}
}
impl Driver for ElfLoaderCapsule {
fn subscribe(&self, _: usize, _: Option<Callback>, _: AppId) -> ReturnCode {
return ReturnCode::EINVAL;
}
fn command(&self, minor_num: usize, _r2: usize, _r3: usize, _app_id: AppId) -> ReturnCode {
dprintf!("ElfLoaderCapsule::command()\n");
if minor_num == matcha_config::CMD_ELFLOADER_BOOT_SEL4 {
self.mailbox_hal.map(|mb| matcha_utils::load_sel4(mb));
return ReturnCode::SUCCESS;
}
return ReturnCode::EINVAL;
}
fn allow(&self, _: AppId, _: usize, _: Option<AppSlice<Shared, u8>>) -> ReturnCode {
return ReturnCode::EINVAL;
}
}