islet_rmm/realm/
config.rs1use crate::realm::mm::address::GuestPhysAddr;
2use crate::realm::mm::rtt::RTT_PAGE_LEVEL;
3use crate::realm::rd::{Rd, RPV_SIZE};
4use crate::rmi::error::Error;
5
6use autopadding::*;
7use safe_abstraction::raw_ptr::assume_safe;
8
9pad_struct_and_impl_default!(
10pub struct RealmConfig {
11 0x0 ipa_width: usize, 0x8 hash_algo: u8, 0x200 rpv: [u8; RPV_SIZE], 0x1000 => @END, }
16);
17
18impl RealmConfig {
19 pub fn init(
27 config_addr: usize,
28 ipa_width: usize,
29 hash_algo: u8,
30 rpv: &[u8],
31 ) -> Result<(), Error> {
32 Ok(assume_safe::<RealmConfig>(config_addr)
33 .map(|mut realm_config| realm_config.init_inner(ipa_width, hash_algo, rpv))?)
34 }
35
36 fn init_inner(&mut self, ipa_width: usize, hash_algo: u8, rpv: &[u8]) {
37 self.ipa_width = ipa_width;
38 self.hash_algo = hash_algo;
39 self.rpv.copy_from_slice(rpv);
40 }
41}
42
43pub fn realm_config(rd: &Rd, config_ipa: usize, ipa_bits: usize) -> Result<(), Error> {
44 let res = rd
45 .s2_table()
46 .lock()
47 .ipa_to_pa(GuestPhysAddr::from(config_ipa), RTT_PAGE_LEVEL);
48 let hash_algo = rd.hash_algo();
49 let rpv = rd.personalization_value();
50 if let Some(pa) = res {
51 RealmConfig::init(pa.into(), ipa_bits, hash_algo, rpv)
52 } else {
53 Err(Error::RmiErrorInput)
54 }
55}
56
57impl safe_abstraction::raw_ptr::RawPtr for RealmConfig {}
58
59impl safe_abstraction::raw_ptr::SafetyChecked for RealmConfig {}
60
61impl safe_abstraction::raw_ptr::SafetyAssured for RealmConfig {
62 fn is_initialized(&self) -> bool {
63 true
67 }
68
69 fn verify_ownership(&self) -> bool {
70 true
77 }
78}