blob: 5f918fb284bae5e6e8844c1e84fb710d840d0224 [file] [log] [blame]
Andrew Walbran68a8c162022-03-07 15:38:42 +00001// Copyright 2022, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! pVM firmware.
16
17#![no_main]
18#![no_std]
19
Andrew Walbrandfb73372022-04-21 10:52:27 +000020mod exceptions;
Andrew Walbran68a8c162022-03-07 15:38:42 +000021
Pierre-Clément Tosi263ffd52022-10-05 20:27:50 +010022use core::fmt;
Andrew Walbranb996b4a2022-04-22 15:15:41 +000023
Pierre-Clément Tosi263ffd52022-10-05 20:27:50 +010024use vmbase::{main, power::reboot, println};
Andrew Walbran68a8c162022-03-07 15:38:42 +000025
Pierre-Clément Tosi263ffd52022-10-05 20:27:50 +010026#[derive(Debug, Clone)]
27enum Error {}
28
29impl fmt::Display for Error {
30 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
31 #[allow(clippy::match_single_binding)]
32 let msg = match self {
33 _ => "",
34 };
35 write!(f, "{}", msg)
36 }
37}
38
39fn main(fdt_address: u64, payload_start: u64, payload_size: u64, arg3: u64) -> Result<(), Error> {
Andrew Walbrane03395a2022-04-29 15:15:49 +000040 println!("pVM firmware");
41 println!(
Andrew Walbranf17c6512022-06-28 15:52:23 +000042 "fdt_address={:#018x}, payload_start={:#018x}, payload_size={:#018x}, x3={:#018x}",
Andrew Walbrane03395a2022-04-29 15:15:49 +000043 fdt_address, payload_start, payload_size, arg3,
44 );
Andrew Walbran5db32352022-05-06 13:58:11 +000045
46 println!("Starting payload...");
Pierre-Clément Tosi263ffd52022-10-05 20:27:50 +010047
48 Ok(())
49}
50
51main!(main_wrapper);
52
53/// Entry point for pVM firmware.
54pub fn main_wrapper(fdt_address: u64, payload_start: u64, payload_size: u64, arg3: u64) {
55 match main(fdt_address, payload_start, payload_size, arg3) {
56 Ok(()) => jump_to_payload(fdt_address, payload_start),
57 Err(e) => {
58 println!("Boot rejected: {}", e);
59 }
60 }
61 reboot()
62}
63
64fn jump_to_payload(fdt_address: u64, payload_start: u64) {
Andrew Walbran5db32352022-05-06 13:58:11 +000065 // Safe because this is a function we have implemented in assembly that matches its signature
66 // here.
67 unsafe {
68 start_payload(fdt_address, payload_start);
69 }
70}
71
72extern "C" {
73 fn start_payload(fdt_address: u64, payload_start: u64) -> !;
Andrew Walbran68a8c162022-03-07 15:38:42 +000074}