@@ -280,6 +280,8 @@ pub struct ProtectionDomain {
280280pub enum CapMapType {
281281 Tcb = 0 ,
282282 Sc ,
283+ Vspace ,
284+ Cnode ,
283285 __Len,
284286}
285287
@@ -1241,6 +1243,8 @@ impl CapMap {
12411243 let cap_type = match checked_lookup ( xml_sdf, node, "type" ) ? {
12421244 "tcb" => CapMapType :: Tcb ,
12431245 "sc" => CapMapType :: Sc ,
1246+ "vspace" => CapMapType :: Vspace ,
1247+ "cnode" => CapMapType :: Cnode ,
12441248 _ => {
12451249 return Err ( value_error (
12461250 xml_sdf,
@@ -1952,6 +1956,8 @@ pub fn parse(filename: &str, xml: &str, config: &Config) -> Result<SystemDescrip
19521956 let mut user_cap_slots = Vec :: new ( ) ;
19531957 let mut user_tcb_names = Vec :: new ( ) ;
19541958 let mut user_sc_names = Vec :: new ( ) ;
1959+ let mut user_vspace_names = Vec :: new ( ) ;
1960+ let mut user_cnode_names = Vec :: new ( ) ;
19551961
19561962 for cap_map in pd. cap_maps . iter ( ) {
19571963 if user_cap_slots. contains ( & cap_map. dest_cspace_slot ) {
@@ -1981,6 +1987,24 @@ pub fn parse(filename: &str, xml: &str, config: &Config) -> Result<SystemDescrip
19811987 } else {
19821988 user_sc_names. push ( cap_map. pd_name . clone ( ) ) ;
19831989 }
1990+ } else if cap_map. cap_type == CapMapType :: Vspace {
1991+ if user_vspace_names. contains ( & cap_map. pd_name ) {
1992+ return Err ( format ! (
1993+ "Error: Duplicate vspace cap mapping. Src PD: '{}', dest PD: '{}'" ,
1994+ cap_map. pd_name, pd. name
1995+ ) ) ;
1996+ } else {
1997+ user_vspace_names. push ( cap_map. pd_name . clone ( ) ) ;
1998+ }
1999+ } else if cap_map. cap_type == CapMapType :: Cnode {
2000+ if user_cnode_names. contains ( & cap_map. pd_name ) {
2001+ return Err ( format ! (
2002+ "Error: Duplicate cnode cap mapping. Src PD: '{}', dest PD: '{}'" ,
2003+ cap_map. pd_name, pd. name
2004+ ) ) ;
2005+ } else {
2006+ user_cnode_names. push ( cap_map. pd_name . clone ( ) ) ;
2007+ }
19842008 }
19852009 }
19862010 }
0 commit comments