#![no_std]

mod dprintf;
mod mailbox_client;

use crate::mailbox_client::MailboxClient;
use libtock::result::TockResult;
use libtock::syscalls;
use matcha_config::*;

libtock_core::stack_size! {0x1000}

// Global static message buffer. The mailbox driver will copy incoming messages
// here when they arrive.
static mut MESSAGE_BUF: [u8; 4096] = [0; 4096];

//------------------------------------------------------------------------------

#[libtock::main]
async fn main() -> TockResult<()> {
    dprintf!("SEC: sw/matcha/app/src/main.rs::main()\n");

    dprintf!("SEC: Booting sel4 from TockOS app!\n");
    let _result = syscalls::command(CAPSULE_ELFLOADER, CMD_ELFLOADER_BOOT_SEL4, 0, 0);
    dprintf!("SEC: Booting sel4 from TockOS app done!\n");

    MailboxClient::init();

    unsafe {
        loop {
            dprintf!("SEC: Waiting for request\n");
            let message_size = MailboxClient::wait_message_async(&mut MESSAGE_BUF).await;
            dprintf!("SEC: Request arrived, {} bytes\n", message_size);

            let dst: *mut u32 = core::mem::transmute(MESSAGE_BUF.as_ptr());

            // We don't actually have any message handling set up, so we just
            // tweak the first and last dword of the message so the sender can
            // tell we were able to modify it.
            let last = (message_size / 4) - 1;
            dprintf!("request[0] = {:X}\n", dst.offset(0).read());
            dprintf!(
                "request[{}] = {:X}\n",
                last,
                dst.offset(last as isize).read()
            );

            dst.offset(0).write(0x12345678);
            dst.offset(last as isize).write(0x87654321);

            dprintf!("SEC: Sending response\n");
            MailboxClient::send_message_sync(message_size, &MESSAGE_BUF);

            dprintf!("SEC: Response sent\n");
        }
    }
    // Unreachable
}
