Skip to content

Commit 0bee03e

Browse files
committed
rt: add FMC compatiblity checks
Add compatiblity check funcion to test FMC compatiblity in runtime. Signed-off-by: leongross <[email protected]>
1 parent 10ac42a commit 0bee03e

File tree

4 files changed

+58
-3
lines changed

4 files changed

+58
-3
lines changed

error/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,8 @@ impl CaliptraError {
464464
pub const RUNTIME_GET_FMC_CSR_UNSUPPORTED_FMC: CaliptraError =
465465
CaliptraError::new_const(0x000E0055);
466466

467+
pub const RUNTIME_FMC_NOT_COMPATIBLE: CaliptraError = CaliptraError::new_const(0x000E0058);
468+
467469
/// FMC Errors
468470
pub const FMC_GLOBAL_NMI: CaliptraError = CaliptraError::new_const(0x000F0001);
469471
pub const FMC_GLOBAL_EXCEPTION: CaliptraError = CaliptraError::new_const(0x000F0002);

runtime/src/compatibility.rs

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*++
2+
3+
Licensed under the Apache-2.0 license.
4+
5+
File Name:
6+
7+
compatibility.rs
8+
9+
Abstract:
10+
11+
File contains compatibility functions to to check if the runtime is
12+
compatible with FMC.
13+
14+
--*/
15+
16+
use caliptra_common::FirmwareHandoffTable;
17+
use caliptra_image_types::ImageManifest;
18+
19+
pub fn is_fmc_compatible(fht: &FirmwareHandoffTable, manifest: &ImageManifest) -> bool {
20+
u32::from(fht.fht_major_ver) == manifest.fmc.version
21+
}
22+
23+
#[test]
24+
fn test_is_fmc_compatible() {
25+
let mut fht = FirmwareHandoffTable::default();
26+
let mut manifest = ImageManifest::default();
27+
28+
fht.fht_major_ver = 1;
29+
fht.fht_minor_ver = 0;
30+
manifest.fmc.version = 1;
31+
32+
assert!(is_fmc_compatible(&fht, &manifest));
33+
34+
// change minor version should not affect compatibility
35+
fht.fht_minor_ver = 1;
36+
assert!(is_fmc_compatible(&fht, &manifest));
37+
38+
fht.fht_minor_ver = 0xff;
39+
assert!(is_fmc_compatible(&fht, &manifest));
40+
41+
fht.fht_major_ver = 2;
42+
assert!(!is_fmc_compatible(&fht, &manifest));
43+
}

runtime/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Abstract:
1616
mod authorize_and_stash;
1717
mod capabilities;
1818
mod certify_key_extended;
19+
pub mod compatibility;
1920
pub mod dice;
2021
mod disable;
2122
mod dpe_crypto;

runtime/src/main.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ Abstract:
1818
core::arch::global_asm!(include_str!("ext_intr.S"));
1919

2020
use caliptra_cfi_lib_git::CfiCounter;
21-
use caliptra_common::{cprintln, handle_fatal_error};
21+
use caliptra_common::{cprintln, handle_fatal_error, FirmwareHandoffTable};
2222
use caliptra_cpu::{log_trap_record, TrapRecord};
2323
use caliptra_error::CaliptraError;
24+
use caliptra_image_types::ImageManifest;
2425
use caliptra_registers::soc_ifc::SocIfcReg;
25-
use caliptra_runtime::Drivers;
26+
use caliptra_runtime::{compatibility, Drivers};
2627
use core::hint::black_box;
2728

2829
#[cfg(feature = "std")]
@@ -83,10 +84,18 @@ pub extern "C" fn entry_point() -> ! {
8384
handle_fatal_error(e.into());
8485
});
8586

86-
if !drivers.persistent_data.get().fht.is_valid() {
87+
let fht: &FirmwareHandoffTable = &drivers.persistent_data.get().fht;
88+
if !fht.is_valid() {
8789
cprintln!("[rt] Runtime can't load FHT");
8890
handle_fatal_error(caliptra_drivers::CaliptraError::RUNTIME_HANDOFF_FHT_NOT_LOADED.into());
8991
}
92+
93+
let manifest: &ImageManifest = &drivers.persistent_data.get().manifest1;
94+
if !compatibility::is_fmc_compatible(fht, manifest) {
95+
cprintln!("[rt] Runtime is not compatible with FMC");
96+
handle_fatal_error(caliptra_drivers::CaliptraError::RUNTIME_FMC_NOT_COMPATIBLE.into());
97+
}
98+
9099
cprintln!("[rt] Runtime listening for mailbox commands...");
91100
if let Err(e) = caliptra_runtime::handle_mailbox_commands(&mut drivers) {
92101
handle_fatal_error(e.into());

0 commit comments

Comments
 (0)