|
@@ -0,0 +1,93 @@
|
|
|
|
+//! Confidential VM Extension (CoVE) structure and constant definitions.
|
|
|
|
+//!
|
|
|
|
+//! Confidential VM Extension (CoVE) provides an interface for a scalable
|
|
|
|
+//! Trusted Execution Environment (TEE) that supports hardware virtual-machine-based
|
|
|
|
+//! workloads on RISC-V platforms.
|
|
|
|
+//!
|
|
|
|
+//! This crate can be integrated as part of RustSBI and used in Prototyper,
|
|
|
|
+//! or included as a component of Rust-based bare-metal applications or operating
|
|
|
|
+//! systems to facilitate invoking services provided by the Confidential VM Extension.
|
|
|
|
+#![no_std]
|
|
|
|
+
|
|
|
|
+// §10
|
|
|
|
+pub mod host;
|
|
|
|
+// §11
|
|
|
|
+pub mod interrupt;
|
|
|
|
+// §12
|
|
|
|
+pub mod guest;
|
|
|
|
+
|
|
|
|
+/// Converts SBI EID from str.
|
|
|
|
+const fn eid_from_str(name: &str) -> i32 {
|
|
|
|
+ match *name.as_bytes() {
|
|
|
|
+ [a] => i32::from_be_bytes([0, 0, 0, a]),
|
|
|
|
+ [a, b] => i32::from_be_bytes([0, 0, a, b]),
|
|
|
|
+ [a, b, c] => i32::from_be_bytes([0, a, b, c]),
|
|
|
|
+ [a, b, c, d] => i32::from_be_bytes([a, b, c, d]),
|
|
|
|
+ _ => unreachable!(),
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+#[cfg(test)]
|
|
|
|
+mod tests {
|
|
|
|
+ use static_assertions::const_assert_eq;
|
|
|
|
+ // §10
|
|
|
|
+ #[test]
|
|
|
|
+ fn test_cove_host() {
|
|
|
|
+ use crate::host::*;
|
|
|
|
+ const_assert_eq!(0x434F5648, EID_COVH);
|
|
|
|
+ const_assert_eq!(0, GET_TSM_INFO);
|
|
|
|
+ const_assert_eq!(1, CONVERT_PAGES);
|
|
|
|
+ const_assert_eq!(2, RECLAIM_PAGES);
|
|
|
|
+ const_assert_eq!(3, GLOBAL_FENCE);
|
|
|
|
+ const_assert_eq!(4, LOCAL_FENCE);
|
|
|
|
+ const_assert_eq!(5, CREATE_TVM);
|
|
|
|
+ const_assert_eq!(6, FINALIZE_TVM);
|
|
|
|
+ const_assert_eq!(8, DESTROY_TVM);
|
|
|
|
+ const_assert_eq!(9, ADD_TVM_MEMORY_REGION);
|
|
|
|
+ const_assert_eq!(10, ADD_TVM_PAGE_TABLE_PAGES);
|
|
|
|
+ const_assert_eq!(11, ADD_TVM_MEASURED_PAGES);
|
|
|
|
+ const_assert_eq!(12, ADD_TVM_ZERO_PAGES);
|
|
|
|
+ const_assert_eq!(13, ADD_TVM_SHARED_PAGES);
|
|
|
|
+ const_assert_eq!(14, CREATE_TVM_VCPU);
|
|
|
|
+ const_assert_eq!(15, RUN_TVM_VCPU);
|
|
|
|
+ const_assert_eq!(16, TVM_FENCE);
|
|
|
|
+ const_assert_eq!(17, TVM_INVALIDATE_PAGES);
|
|
|
|
+ const_assert_eq!(18, TVM_VALIDATE_PAGES);
|
|
|
|
+ const_assert_eq!(19, TVM_REMOVE_PAGES);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // §11
|
|
|
|
+ #[test]
|
|
|
|
+ fn test_cove_interrupt() {
|
|
|
|
+ use crate::interrupt::*;
|
|
|
|
+ const_assert_eq!(0x434F5649, EID_COVI);
|
|
|
|
+ const_assert_eq!(0, INIT_TVM_AIA);
|
|
|
|
+ const_assert_eq!(1, SET_TVM_AIA_CPU_IMSIC_ADDR);
|
|
|
|
+ const_assert_eq!(2, CONVERT_AIA_IMSIC);
|
|
|
|
+ const_assert_eq!(3, RECLAIM_TVM_AIA_IMSIC);
|
|
|
|
+ const_assert_eq!(4, BIND_AIA_IMSIC);
|
|
|
|
+ const_assert_eq!(5, UNBIND_AIA_IMSIC_BEGIN);
|
|
|
|
+ const_assert_eq!(6, UNBIND_AIA_IMSIC_END);
|
|
|
|
+ const_assert_eq!(7, INJECT_TVM_CPU);
|
|
|
|
+ const_assert_eq!(8, REBIND_AIA_IMSIC_BEGIN);
|
|
|
|
+ const_assert_eq!(9, REBIND_AIA_IMSIC_CLONE);
|
|
|
|
+ const_assert_eq!(10, REBIND_AIA_IMSIC_END);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // §12
|
|
|
|
+ #[test]
|
|
|
|
+ fn test_cove_guest() {
|
|
|
|
+ use crate::guest::*;
|
|
|
|
+ const_assert_eq!(0x434F5647, EID_COVG);
|
|
|
|
+ const_assert_eq!(0, ADD_MMIO_REGION);
|
|
|
|
+ const_assert_eq!(1, REMOVE_MMIO_REGION);
|
|
|
|
+ const_assert_eq!(2, SHARE_MEMORY_REGION);
|
|
|
|
+ const_assert_eq!(3, UNSHARE_MEMORY_REGION);
|
|
|
|
+ const_assert_eq!(4, ALLOW_EXTERNAL_INTERRUPT);
|
|
|
|
+ const_assert_eq!(5, DENY_EXTERNAL_INTERRUPT);
|
|
|
|
+ const_assert_eq!(6, GET_ATTESTATION_CAPABILITIES);
|
|
|
|
+ const_assert_eq!(7, EXTEND_MEASUREMENT);
|
|
|
|
+ const_assert_eq!(8, GET_EVIDENCE);
|
|
|
|
+ const_assert_eq!(9, RETRIEVE_SECRET);
|
|
|
|
+ const_assert_eq!(10, READ_MEASUREMENT);
|
|
|
|
+ }
|
|
|
|
+}
|