@@ -2027,6 +2027,8 @@ fn build_system(
20272027 }
20282028 }
20292029
2030+ let mut frame_cap = BASE_FRAME_CAP ;
2031+
20302032 for ( pd_idx, _) in system. protection_domains . iter ( ) . enumerate ( ) {
20312033 for maybe_child_pd in system. protection_domains . iter ( ) {
20322034 if maybe_child_pd. parent . is_some_and ( |x| x == pd_idx) {
@@ -2038,7 +2040,7 @@ fn build_system(
20382040 config,
20392041 InvocationArgs :: CnodeMint {
20402042 cnode : cnode_objs[ pd_idx] . cap_addr ,
2041- dest_index : BASE_FRAME_CAP ,
2043+ dest_index : frame_cap ,
20422044 dest_depth : PD_CAP_BITS ,
20432045 src_root : root_cnode_cap,
20442046 src_obj : mr_pages[ mr] [ 0 ] . cap_addr ,
@@ -2064,85 +2066,16 @@ fn build_system(
20642066
20652067 for mr_idx in 0 ..mr_pages[ mr] . len ( ) {
20662068 let vaddr = mp. vaddr + mr. page_size_bytes ( ) * mr_idx as u64 ;
2067- let minted_cap = BASE_FRAME_CAP + mr_idx as u64 ;
2069+ let minted_cap = frame_cap + mr_idx as u64 ;
20682070
20692071 all_child_page_tables[ pd_idx]
20702072 . as_mut ( )
20712073 . unwrap ( ) [ maybe_child_pd. id . unwrap ( ) as usize ]
20722074 . add_page_at_vaddr ( vaddr, minted_cap, mr. page_size ) ;
20732075 }
2074- }
2075- }
2076- }
2077- }
2078- }
20792076
2080- let mut sorted_mp_mr_pairs: Vec < ( & SysMap , & SysMemoryRegion , String ) > = vec ! [ ] ;
2081- for pd in system. protection_domains . iter ( ) {
2082- for map_set in [ & pd. maps , & pd_extra_maps[ pd] ] {
2083- for mp in map_set {
2084- let mr = all_mr_by_name[ mp. mr . as_str ( ) ] ;
2085- let id = mr. name . clone ( ) + " " + & pd. name ;
2086- sorted_mp_mr_pairs. push ( ( mp, mr, id) ) ;
2087- }
2088- }
2089- }
2090- sorted_mp_mr_pairs. sort_by ( |a, b| a. 1 . name . cmp ( & b. 1 . name ) ) ;
2091- let mut frame_cap = BASE_FRAME_CAP ;
2092-
2093- // If a pd has a parent, we mint the child's frame caps into the parent's vspace
2094- // We additionally place these frame caps into the corresponding page in our copy of the tables
2095- for ( pd_idx, parent) in system. protection_domains . iter ( ) . enumerate ( ) {
2096- for ( _maybe_child_idx, maybe_child_pd) in system. protection_domains . iter ( ) . enumerate ( ) {
2097- if let Some ( parent_idx) = maybe_child_pd. parent {
2098- if parent_idx == pd_idx && parent. child_pts {
2099- for mp_mr_pair in & sorted_mp_mr_pairs {
2100- let child_mp = mp_mr_pair. 0 ;
2101- let child_mr = mp_mr_pair. 1 ;
2102- let name = & mp_mr_pair. 2 ;
2103- if name. contains ( & maybe_child_pd. name ) {
2104- let mut invocation = Invocation :: new (
2105- config,
2106- InvocationArgs :: CnodeMint {
2107- cnode : cnode_objs[ pd_idx] . cap_addr ,
2108- dest_index : frame_cap,
2109- dest_depth : PD_CAP_BITS ,
2110- src_root : root_cnode_cap,
2111- src_obj : mr_pages[ child_mr] [ 0 ] . cap_addr ,
2112- src_depth : config. cap_address_bits ,
2113- rights : ( Rights :: Read as u64 | Rights :: Write as u64 ) ,
2114- badge : 0 ,
2115- } ,
2116- ) ;
2117-
2118- invocation. repeat (
2119- mr_pages[ child_mr] . len ( ) as u32 ,
2120- InvocationArgs :: CnodeMint {
2121- cnode : 0 ,
2122- dest_index : 1 ,
2123- dest_depth : 0 ,
2124- src_root : 0 ,
2125- src_obj : 1 ,
2126- src_depth : 0 ,
2127- rights : 0 ,
2128- badge : 0 ,
2129- } ,
2130- ) ;
2131-
2132- for mr_idx in 0 ..mr_pages[ child_mr] . len ( ) {
2133- let vaddr = child_mp. vaddr + child_mr. page_size_bytes ( ) * mr_idx as u64 ;
2134- let minted_cap = frame_cap + mr_idx as u64 ;
2135-
2136- // Check if we have a small or large page.
2137- all_child_page_tables[ parent_idx]
2138- . as_mut ( )
2139- . unwrap ( ) [ maybe_child_pd. id . unwrap ( ) as usize ]
2140- . add_page_at_vaddr ( vaddr, minted_cap, child_mr. page_size ) ;
2141- }
2142-
2143- frame_cap += mr_pages[ child_mr] . len ( ) as u64 ;
2144- system_invocations. push ( invocation) ;
2145- }
2077+ frame_cap += mr_pages[ mr] . len ( ) as u64 ;
2078+ system_invocations. push ( invocation) ;
21462079 }
21472080 }
21482081 }
0 commit comments