Add new fields for config file to enable EDMM
This commit is contained in:
		
							parent
							
								
									cb75897085
								
							
						
					
					
						commit
						28c29c8896
					
				| @ -108,7 +108,8 @@ pub struct Config { | |||||||
| 
 | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct ConfigResourceLimits { | pub struct ConfigResourceLimits { | ||||||
|     pub user_space_size: usize, |     pub user_space_init_size: usize, | ||||||
|  |     pub user_space_max_size: usize, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| @ -213,8 +214,12 @@ impl Config { | |||||||
| 
 | 
 | ||||||
| impl ConfigResourceLimits { | impl ConfigResourceLimits { | ||||||
|     fn from_input(input: &InputConfigResourceLimits) -> Result<ConfigResourceLimits> { |     fn from_input(input: &InputConfigResourceLimits) -> Result<ConfigResourceLimits> { | ||||||
|         let user_space_size = parse_memory_size(&input.user_space_size)?; |         let user_space_init_size = parse_memory_size(&input.user_space_init_size)?; | ||||||
|         Ok(ConfigResourceLimits { user_space_size }) |         let user_space_max_size = parse_memory_size(&input.user_space_max_size)?; | ||||||
|  |         Ok(ConfigResourceLimits { | ||||||
|  |             user_space_init_size, | ||||||
|  |             user_space_max_size, | ||||||
|  |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -369,12 +374,19 @@ struct InputConfig { | |||||||
| #[derive(Deserialize, Debug)] | #[derive(Deserialize, Debug)] | ||||||
| #[serde(deny_unknown_fields)] | #[serde(deny_unknown_fields)] | ||||||
| struct InputConfigResourceLimits { | struct InputConfigResourceLimits { | ||||||
|     #[serde(default = "InputConfigResourceLimits::get_user_space_size")] |     #[serde(default = "InputConfigResourceLimits::get_user_space_init_size")] | ||||||
|     pub user_space_size: String, |     pub user_space_init_size: String, | ||||||
|  |     #[serde(default = "InputConfigResourceLimits::get_user_space_max_size")] | ||||||
|  |     pub user_space_max_size: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl InputConfigResourceLimits { | impl InputConfigResourceLimits { | ||||||
|     fn get_user_space_size() -> String { |     fn get_user_space_init_size() -> String { | ||||||
|  |         "128MB".to_string() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // For default, just make it equal with the init size
 | ||||||
|  |     fn get_user_space_max_size() -> String { | ||||||
|         "128MB".to_string() |         "128MB".to_string() | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -382,7 +394,8 @@ impl InputConfigResourceLimits { | |||||||
| impl Default for InputConfigResourceLimits { | impl Default for InputConfigResourceLimits { | ||||||
|     fn default() -> InputConfigResourceLimits { |     fn default() -> InputConfigResourceLimits { | ||||||
|         InputConfigResourceLimits { |         InputConfigResourceLimits { | ||||||
|             user_space_size: InputConfigResourceLimits::get_user_space_size(), |             user_space_init_size: InputConfigResourceLimits::get_user_space_init_size(), | ||||||
|  |             user_space_max_size: InputConfigResourceLimits::get_user_space_max_size(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,10 +1,12 @@ | |||||||
| { | { | ||||||
|     "resource_limits": { |     "resource_limits": { | ||||||
|         "kernel_space_heap_size": "40MB", |  | ||||||
|         "kernel_space_heap_max_size": "512MB", |  | ||||||
|         "kernel_space_stack_size": "1MB", |         "kernel_space_stack_size": "1MB", | ||||||
|         "user_space_size": "600MB", |         "kernel_space_heap_size": "1MB", | ||||||
|         "max_num_of_threads": 32 |         "kernel_space_heap_max_size": "40MB", | ||||||
|  |         "user_space_size": "1MB", | ||||||
|  |         "user_space_max_size": "600MB", | ||||||
|  |         "init_num_of_threads": 2, | ||||||
|  |         "max_num_of_threads": 64 | ||||||
|     }, |     }, | ||||||
|     "process": { |     "process": { | ||||||
|         "default_stack_size": "4MB", |         "default_stack_size": "4MB", | ||||||
|  | |||||||
| @ -20,28 +20,28 @@ lazy_static! { | |||||||
|     static ref DEFAULT_CONFIG: DefaultConfig = DefaultConfig::init(); |     static ref DEFAULT_CONFIG: DefaultConfig = DefaultConfig::init(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const MISC_FOR_EDMM_PLATFORM: (&str, &str) = ("1", "0xFFFFFFFF"); | ||||||
|  | const MISC_FOR_NON_EDMM_PLATFORM: (&str, &str) = ("0", "0"); | ||||||
|  | 
 | ||||||
| struct DefaultConfig { | struct DefaultConfig { | ||||||
|     // Corresponds to HeapMaxSize in Enclave.xml
 |     // Corresponds to HeapMaxSize in Enclave.xml
 | ||||||
|     kernel_heap_max_size: &'static str, |     kernel_heap_max_size: &'static str, | ||||||
|  |     user_space_max_size: &'static str, | ||||||
|  |     tcs_init_num: u32, | ||||||
|     // Corresponds to TCSMaxNum in Enclave.xml
 |     // Corresponds to TCSMaxNum in Enclave.xml
 | ||||||
|     num_of_tcs_max: u32, |     tcs_max_num: u32, | ||||||
|     // Corresponds to MiscSelect in Enclave.xml
 |     // Extra user region memory for SDK
 | ||||||
|     misc_select: &'static str, |     extra_user_region_for_sdk: &'static str, | ||||||
|     // Corresponds to MiscMask in Enclave.xml
 |  | ||||||
|     misc_mask: &'static str, |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl DefaultConfig { | impl DefaultConfig { | ||||||
|     fn init() -> Self { |     fn init() -> Self { | ||||||
|         Self { |         Self { | ||||||
|             kernel_heap_max_size: "1024MB", |             kernel_heap_max_size: "1024MB", | ||||||
|             num_of_tcs_max: 4096, |             user_space_max_size: "16GB", | ||||||
|             // If UserRegionSize is not configured, but the heap, stack and thread related
 |             tcs_init_num: 16, | ||||||
|             // configurations have dynamic part, set MiscSelect[0] = 1 and MiscMask[0] = 0,
 |             tcs_max_num: 4096, | ||||||
|             // the enclave can be loaded on SGX 1.0 and 2.0 platform, and on SGX 2.0 platform,
 |             extra_user_region_for_sdk: "1GB", | ||||||
|             // it can utilize the dynamic components.
 |  | ||||||
|             misc_select: "1", |  | ||||||
|             misc_mask: "0x0", |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -49,6 +49,13 @@ impl DefaultConfig { | |||||||
| fn main() { | fn main() { | ||||||
|     env_logger::init(); |     env_logger::init(); | ||||||
| 
 | 
 | ||||||
|  |     let instance_is_for_edmm_platform = { | ||||||
|  |         match std::env::var("INSTANCE_IS_FOR_EDMM_PLATFORM") { | ||||||
|  |             Ok(val) => val == "YES", | ||||||
|  |             _ => unreachable!(), | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     let matches = App::new("gen_internal_conf") |     let matches = App::new("gen_internal_conf") | ||||||
|         .version("0.2.0") |         .version("0.2.0") | ||||||
|         // Input: JSON file which users may change
 |         // Input: JSON file which users may change
 | ||||||
| @ -144,10 +151,56 @@ fn main() { | |||||||
|             enclave_config_file_path |             enclave_config_file_path | ||||||
|         ); |         ); | ||||||
| 
 | 
 | ||||||
|         // get the number of TCS
 |         debug!( | ||||||
|         let tcs_num = occlum_config.resource_limits.max_num_of_threads; |             "Build on platform {} EDMM support", | ||||||
|         let tcs_min_pool = tcs_num; |             if instance_is_for_edmm_platform { | ||||||
|         let tcs_max_num = std::cmp::max(tcs_num, DEFAULT_CONFIG.num_of_tcs_max); |                 "WITH" | ||||||
|  |             } else { | ||||||
|  |                 "WITHOUT" | ||||||
|  |             } | ||||||
|  |         ); | ||||||
|  |         debug!( | ||||||
|  |             "user config init num of threads = {:?}", | ||||||
|  |             occlum_config.resource_limits.init_num_of_threads | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         // For init TCS number, try to use the values provided by users. If not provided, use the default value
 | ||||||
|  |         let (tcs_init_num, tcs_min_pool, tcs_max_num) = { | ||||||
|  |             if instance_is_for_edmm_platform { | ||||||
|  |                 let tcs_init_num = if let Some(ref init_num_of_threads) = | ||||||
|  |                     occlum_config.resource_limits.init_num_of_threads | ||||||
|  |                 { | ||||||
|  |                     *init_num_of_threads | ||||||
|  |                 } else { | ||||||
|  |                     // The user doesn't provide a value
 | ||||||
|  |                     std::cmp::min(DEFAULT_CONFIG.tcs_init_num,occlum_config.resource_limits.max_num_of_threads ) | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 // For platforms with EDMM support, use the max value
 | ||||||
|  |                 let tcs_max_num = std::cmp::max( | ||||||
|  |                     occlum_config.resource_limits.max_num_of_threads, | ||||||
|  |                     DEFAULT_CONFIG.tcs_max_num, | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 (tcs_init_num, tcs_init_num, tcs_max_num) | ||||||
|  |             } else { | ||||||
|  |                 // For platforms without EDMM support (including SIM mode), use the "max_num_of_threads" provided by user
 | ||||||
|  |                 let tcs_max_num = occlum_config.resource_limits.max_num_of_threads; | ||||||
|  |                 (tcs_max_num, tcs_max_num, tcs_max_num) | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         debug!( | ||||||
|  |             "tcs init num: {}, tcs_min_pool: {}, tcs_max_num: {}", | ||||||
|  |             tcs_init_num, tcs_min_pool, tcs_max_num | ||||||
|  |         ); | ||||||
|  |         if tcs_init_num > tcs_max_num { | ||||||
|  |             println!( | ||||||
|  |                 "init_num_of_threads: {:?}, max_num_of_threads: {:?}, wrong configuration", | ||||||
|  |                 occlum_config.resource_limits.init_num_of_threads, occlum_config.resource_limits.max_num_of_threads, | ||||||
|  |             ); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         // get the kernel stack size
 |         // get the kernel stack size
 | ||||||
|         let stack_max_size = |         let stack_max_size = | ||||||
| @ -160,48 +213,189 @@ fn main() { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // get the kernel heap size
 |         let (kernel_heap_init_size, kernel_heap_max_size) = { | ||||||
|         let heap_init_size = |             let heap_init_size = { | ||||||
|             parse_memory_size(&occlum_config.resource_limits.kernel_space_heap_size); |                 let heap_init_size = | ||||||
|         if heap_init_size.is_err() { |                     parse_memory_size(&occlum_config.resource_limits.kernel_space_heap_size); | ||||||
|             println!( |                 if heap_init_size.is_err() { | ||||||
|                 "The kernel_space_heap_size \"{}\" is not correct.", |  | ||||||
|                 occlum_config.resource_limits.kernel_space_heap_size |  | ||||||
|             ); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         // For max heap size, try to use the values provided by users. If not provided, use the default value
 |  | ||||||
|         let heap_max_size = { |  | ||||||
|             if let Some(ref kernel_space_heap_max_size) = |  | ||||||
|                 occlum_config.resource_limits.kernel_space_heap_max_size |  | ||||||
|             { |  | ||||||
|                 let heap_max_size = parse_memory_size(&kernel_space_heap_max_size); |  | ||||||
|                 if heap_max_size.is_err() { |  | ||||||
|                     println!( |                     println!( | ||||||
|                         "The kernel_space_heap_max_size \"{}\" is not correct.", |                         "The kernel_space_heap_size \"{}\" is not correct.", | ||||||
|                         kernel_space_heap_max_size |                         occlum_config.resource_limits.kernel_space_heap_size | ||||||
|                     ); |                     ); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 heap_max_size |                 heap_init_size.unwrap() | ||||||
|             } else { |             }; | ||||||
|                 // If the user doesn't provide a value, use the max value as heap_max_size.
 | 
 | ||||||
|                 std::cmp::max( |             let optional_config_heap_max_size = { | ||||||
|                     heap_init_size, |                 if let Some(ref heap_max_size) = | ||||||
|                     parse_memory_size(DEFAULT_CONFIG.kernel_heap_max_size), |                     occlum_config.resource_limits.kernel_space_heap_max_size | ||||||
|                 ) |                 { | ||||||
|  |                     let config_kernel_heap_max_size = parse_memory_size(&heap_max_size); | ||||||
|  |                     if config_kernel_heap_max_size.is_err() { | ||||||
|  |                         println!( | ||||||
|  |                             "The kernel_space_heap_max_size \"{}\" is not correct.", | ||||||
|  |                             heap_max_size | ||||||
|  |                         ); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  |                     config_kernel_heap_max_size.ok() | ||||||
|  |                 } else { | ||||||
|  |                     None | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             debug!( | ||||||
|  |                 "optional_config_heap_max_size = {:?}", | ||||||
|  |                 optional_config_heap_max_size | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             match optional_config_heap_max_size { | ||||||
|  |                 Some(heap_max_size) => { | ||||||
|  |                     if instance_is_for_edmm_platform { | ||||||
|  |                         let heap_max_size = std::cmp::max( | ||||||
|  |                             heap_max_size, | ||||||
|  |                             parse_memory_size(DEFAULT_CONFIG.kernel_heap_max_size).unwrap(), | ||||||
|  |                         ); | ||||||
|  |                         (heap_init_size, heap_max_size) | ||||||
|  |                     } else { | ||||||
|  |                         // User specified heap_max but no EDMM support, use user specified as the heap value
 | ||||||
|  |                         (heap_max_size, heap_max_size) | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 None => { | ||||||
|  |                     if instance_is_for_edmm_platform { | ||||||
|  |                         let heap_max_size = std::cmp::max( | ||||||
|  |                             heap_init_size, | ||||||
|  |                             parse_memory_size(DEFAULT_CONFIG.kernel_heap_max_size).unwrap(), | ||||||
|  |                         ); | ||||||
|  |                         (heap_init_size, heap_max_size) | ||||||
|  |                     } else { | ||||||
|  |                         (heap_init_size, heap_init_size) | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| 
 |         if kernel_heap_init_size > kernel_heap_max_size { | ||||||
|         // get the user space size
 |  | ||||||
|         let user_space_size = parse_memory_size(&occlum_config.resource_limits.user_space_size); |  | ||||||
|         if user_space_size.is_err() { |  | ||||||
|             println!( |             println!( | ||||||
|                 "The user_space_size \"{}\" is not correct.", |                 "kernel_space_heap_size: {:?}, kernel_space_heap_max_size: {:?}, wrong configuration", | ||||||
|                 occlum_config.resource_limits.user_space_size |                 occlum_config.resource_limits.kernel_space_heap_size, occlum_config.resource_limits.kernel_space_heap_max_size, | ||||||
|             ); |             ); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |         debug!( | ||||||
|  |             "kernel heap init size = {}, kernel heap max size = {}", | ||||||
|  |             kernel_heap_init_size, kernel_heap_max_size | ||||||
|  |         ); | ||||||
|  |         assert!(kernel_heap_max_size >= kernel_heap_init_size); | ||||||
|  | 
 | ||||||
|  |         let (config_user_space_init_size, config_user_space_max_size) = { | ||||||
|  |             let user_space_init_size = { | ||||||
|  |                 let user_space_init_size = | ||||||
|  |                     parse_memory_size(&occlum_config.resource_limits.user_space_size); | ||||||
|  |                 if user_space_init_size.is_err() { | ||||||
|  |                     println!( | ||||||
|  |                         "The user_space_size \"{}\" is not correct.", | ||||||
|  |                         occlum_config.resource_limits.user_space_size | ||||||
|  |                     ); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 user_space_init_size.unwrap() | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             let optional_config_user_space_max_size = { | ||||||
|  |                 if let Some(ref user_space_max_size) = | ||||||
|  |                     occlum_config.resource_limits.user_space_max_size | ||||||
|  |                 { | ||||||
|  |                     let config_user_space_max_size = parse_memory_size(&user_space_max_size); | ||||||
|  |                     if config_user_space_max_size.is_err() { | ||||||
|  |                         println!( | ||||||
|  |                             "The kernel_space_heap_max_size \"{}\" is not correct.", | ||||||
|  |                             user_space_max_size | ||||||
|  |                         ); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  |                     config_user_space_max_size.ok() | ||||||
|  |                 } else { | ||||||
|  |                     None | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |             debug!( | ||||||
|  |                 "optional_config_user_space_max_size = {:?}", | ||||||
|  |                 optional_config_user_space_max_size | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             let user_space_max_size = match optional_config_user_space_max_size { | ||||||
|  |                 Some(user_space_max_size) => { | ||||||
|  |                     if instance_is_for_edmm_platform { | ||||||
|  |                         std::cmp::max( | ||||||
|  |                             user_space_max_size, | ||||||
|  |                             parse_memory_size(DEFAULT_CONFIG.user_space_max_size).unwrap(), | ||||||
|  |                         ) | ||||||
|  |                     } else { | ||||||
|  |                         // Without EDMM support, just use user-provided value
 | ||||||
|  |                         user_space_max_size | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 None => { | ||||||
|  |                     if instance_is_for_edmm_platform { | ||||||
|  |                         std::cmp::max( | ||||||
|  |                             user_space_init_size, | ||||||
|  |                             parse_memory_size(DEFAULT_CONFIG.user_space_max_size).unwrap(), | ||||||
|  |                         ) | ||||||
|  |                     } else { | ||||||
|  |                         user_space_init_size | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |             (user_space_init_size, user_space_max_size) | ||||||
|  |         }; | ||||||
|  |         if config_user_space_init_size > config_user_space_max_size { | ||||||
|  |             println!( | ||||||
|  |                 "user_space_size: {:?}, user_space_max_size: {:?}, wrong configuration", | ||||||
|  |                 occlum_config.resource_limits.user_space_size, occlum_config.resource_limits.user_space_max_size, | ||||||
|  |             ); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         debug!( | ||||||
|  |             "config user space init size = {},config user space max size = {}", | ||||||
|  |             config_user_space_init_size, config_user_space_max_size | ||||||
|  |         ); | ||||||
|  |         assert!(config_user_space_init_size <= config_user_space_max_size); | ||||||
|  | 
 | ||||||
|  |         // Calculate the actual memory size for different regions
 | ||||||
|  |         let (reserved_mem_size, user_region_mem_size) = { | ||||||
|  |             if instance_is_for_edmm_platform { | ||||||
|  |                 // For platforms with EDMM support, we need extra memory for SDK usage. This might be fixed by SGX SDK in the future.
 | ||||||
|  |                 let extra_user_region = parse_memory_size(DEFAULT_CONFIG.extra_user_region_for_sdk); | ||||||
|  |                 if extra_user_region.is_err() { | ||||||
|  |                     println!("The extra_user_region_for_sdk in default config is not correct."); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |                 let user_region_mem_size = if config_user_space_max_size == config_user_space_init_size { | ||||||
|  |                     // SDK still need user region to track the EMA.
 | ||||||
|  |                     config_user_space_max_size | ||||||
|  |                 } else { | ||||||
|  |                     config_user_space_max_size + extra_user_region.unwrap() | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 ( | ||||||
|  |                     config_user_space_init_size as u64, | ||||||
|  |                     Some(user_region_mem_size as u64), | ||||||
|  |                 ) | ||||||
|  |             } else { | ||||||
|  |                 // For platforms without EDMM support, use the max value for the user space
 | ||||||
|  |                 let reserved_mem_size = config_user_space_max_size; | ||||||
|  |                 (reserved_mem_size as u64, None) | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         debug!( | ||||||
|  |             "reserved memory size = {:?}, user_region_memory size = {:?}", | ||||||
|  |             reserved_mem_size, user_region_mem_size | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|         #[cfg(feature = "ms_buffer")] |         #[cfg(feature = "ms_buffer")] | ||||||
|         let marshal_buffer_size = if occlum_config.resource_limits.marshal_buffer_size.is_some() { |         let marshal_buffer_size = if occlum_config.resource_limits.marshal_buffer_size.is_some() { | ||||||
|             let marshal_buffer_size = parse_memory_size( |             let marshal_buffer_size = parse_memory_size( | ||||||
| @ -225,16 +419,26 @@ fn main() { | |||||||
| 
 | 
 | ||||||
|         let kss_tuple = parse_kss_conf(&occlum_config); |         let kss_tuple = parse_kss_conf(&occlum_config); | ||||||
| 
 | 
 | ||||||
|  |         let (misc_select, misc_mask) = if instance_is_for_edmm_platform { | ||||||
|  |             MISC_FOR_EDMM_PLATFORM | ||||||
|  |         } else { | ||||||
|  |             MISC_FOR_NON_EDMM_PLATFORM | ||||||
|  |         }; | ||||||
|  |         debug!( | ||||||
|  |             "misc_select = {:?}, misc_mask = {:?}", | ||||||
|  |             misc_select, misc_mask | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|         // Generate the enclave configuration
 |         // Generate the enclave configuration
 | ||||||
|         let sgx_enclave_configuration = EnclaveConfiguration { |         let sgx_enclave_configuration = EnclaveConfiguration { | ||||||
|             ProdID: occlum_config.metadata.product_id, |             ProdID: occlum_config.metadata.product_id, | ||||||
|             ISVSVN: occlum_config.metadata.version_number, |             ISVSVN: occlum_config.metadata.version_number, | ||||||
|             StackMaxSize: stack_max_size.unwrap() as u64, |             StackMaxSize: stack_max_size.unwrap() as u64, | ||||||
|             StackMinSize: stack_max_size.unwrap() as u64, // just use the same size as max size
 |             StackMinSize: stack_max_size.unwrap() as u64, // just use the same size as max size
 | ||||||
|             HeapInitSize: heap_init_size.unwrap() as u64, |             HeapInitSize: kernel_heap_init_size as u64, | ||||||
|             HeapMaxSize: heap_max_size.unwrap() as u64, |             HeapMaxSize: kernel_heap_max_size as u64, | ||||||
|             HeapMinSize: heap_init_size.unwrap() as u64, |             HeapMinSize: kernel_heap_init_size as u64, | ||||||
|             TCSNum: tcs_num, |             TCSNum: tcs_init_num, | ||||||
|             TCSMinPool: tcs_min_pool, |             TCSMinPool: tcs_min_pool, | ||||||
|             TCSMaxNum: tcs_max_num, |             TCSMaxNum: tcs_max_num, | ||||||
|             TCSPolicy: 1, |             TCSPolicy: 1, | ||||||
| @ -242,12 +446,13 @@ fn main() { | |||||||
|                 true => 0, |                 true => 0, | ||||||
|                 false => 1, |                 false => 1, | ||||||
|             }, |             }, | ||||||
|             MiscSelect: DEFAULT_CONFIG.misc_select.to_string(), |             MiscSelect: misc_select.to_string(), | ||||||
|             MiscMask: DEFAULT_CONFIG.misc_mask.to_string(), |             MiscMask: misc_mask.to_string(), | ||||||
|             ReservedMemMaxSize: user_space_size.unwrap() as u64, |             ReservedMemMaxSize: reserved_mem_size, | ||||||
|             ReservedMemMinSize: user_space_size.unwrap() as u64, |             ReservedMemMinSize: reserved_mem_size, | ||||||
|             ReservedMemInitSize: user_space_size.unwrap() as u64, |             ReservedMemInitSize: reserved_mem_size, | ||||||
|             ReservedMemExecutable: 1, |             ReservedMemExecutable: 1, | ||||||
|  |             UserRegionSize: user_region_mem_size, | ||||||
|             #[cfg(feature = "ms_buffer")] |             #[cfg(feature = "ms_buffer")] | ||||||
|             MarshalBufferSize: marshal_buffer_size as u64, |             MarshalBufferSize: marshal_buffer_size as u64, | ||||||
|             EnableKSS: kss_tuple.0, |             EnableKSS: kss_tuple.0, | ||||||
| @ -262,13 +467,12 @@ fn main() { | |||||||
| 
 | 
 | ||||||
|         // Generate app config, including "init" and user app
 |         // Generate app config, including "init" and user app
 | ||||||
|         let app_config = { |         let app_config = { | ||||||
|             let app_config = |             let app_config = gen_app_config( | ||||||
|                 gen_app_config( |                 occlum_config.entry_points, | ||||||
|                     occlum_config.entry_points, |                 occlum_config.mount, | ||||||
|                     occlum_config.mount, |                 occlum_conf_user_fs_mac.to_string(), | ||||||
|                     occlum_conf_user_fs_mac.to_string(), |                 occlum_conf_init_fs_mac.to_string(), | ||||||
|                     occlum_conf_init_fs_mac.to_string(), |             ); | ||||||
|                 ); |  | ||||||
|             if app_config.is_err() { |             if app_config.is_err() { | ||||||
|                 println!("Mount configuration invalid: {:?}", app_config); |                 println!("Mount configuration invalid: {:?}", app_config); | ||||||
|                 return; |                 return; | ||||||
| @ -278,7 +482,8 @@ fn main() { | |||||||
| 
 | 
 | ||||||
|         let occlum_json_config = InternalOcclumJson { |         let occlum_json_config = InternalOcclumJson { | ||||||
|             resource_limits: InternalResourceLimits { |             resource_limits: InternalResourceLimits { | ||||||
|                 user_space_size: occlum_config.resource_limits.user_space_size.to_string(), |                 user_space_init_size: config_user_space_init_size.to_string() + "B", | ||||||
|  |                 user_space_max_size: config_user_space_max_size.to_string() + "B", | ||||||
|             }, |             }, | ||||||
|             process: OcclumProcess { |             process: OcclumProcess { | ||||||
|                 default_stack_size: occlum_config.process.default_stack_size, |                 default_stack_size: occlum_config.process.default_stack_size, | ||||||
| @ -429,9 +634,7 @@ fn gen_app_config( | |||||||
|         .unwrap() = serde_json::Value::String(occlum_conf_init_fs_mac); |         .unwrap() = serde_json::Value::String(occlum_conf_init_fs_mac); | ||||||
| 
 | 
 | ||||||
|     // Update app entry points
 |     // Update app entry points
 | ||||||
|     *app_config |     *app_config.pointer_mut("/app/1/entry_points").unwrap() = entry_points; | ||||||
|         .pointer_mut("/app/1/entry_points") |  | ||||||
|         .unwrap() = entry_points; |  | ||||||
| 
 | 
 | ||||||
|     debug!("User provided root mount config: {:?}", mount_conf); |     debug!("User provided root mount config: {:?}", mount_conf); | ||||||
|     let mut root_mount_config = mount_conf; |     let mut root_mount_config = mount_conf; | ||||||
| @ -484,12 +687,16 @@ struct OcclumConfiguration { | |||||||
| 
 | 
 | ||||||
| #[derive(Debug, PartialEq, Deserialize)] | #[derive(Debug, PartialEq, Deserialize)] | ||||||
| struct OcclumResourceLimits { | struct OcclumResourceLimits { | ||||||
|  |     #[serde(default)] | ||||||
|  |     init_num_of_threads: Option<u32>, | ||||||
|     max_num_of_threads: u32, |     max_num_of_threads: u32, | ||||||
|     kernel_space_heap_size: String, |     kernel_space_heap_size: String, | ||||||
|     #[serde(default)] |     #[serde(default)] | ||||||
|     kernel_space_heap_max_size: Option<String>, |     kernel_space_heap_max_size: Option<String>, | ||||||
|     kernel_space_stack_size: String, |     kernel_space_stack_size: String, | ||||||
|     user_space_size: String, |     user_space_size: String, | ||||||
|  |     #[serde(default)] | ||||||
|  |     user_space_max_size: Option<String>, | ||||||
|     #[cfg(feature = "ms_buffer")] |     #[cfg(feature = "ms_buffer")] | ||||||
|     marshal_buffer_size: Option<String>, |     marshal_buffer_size: Option<String>, | ||||||
| } | } | ||||||
| @ -575,6 +782,8 @@ struct EnclaveConfiguration { | |||||||
|     ReservedMemMinSize: u64, |     ReservedMemMinSize: u64, | ||||||
|     ReservedMemInitSize: u64, |     ReservedMemInitSize: u64, | ||||||
|     ReservedMemExecutable: u32, |     ReservedMemExecutable: u32, | ||||||
|  |     #[serde(default, skip_serializing_if = "Option::is_none")] | ||||||
|  |     UserRegionSize: Option<u64>, | ||||||
|     #[cfg(feature = "ms_buffer")] |     #[cfg(feature = "ms_buffer")] | ||||||
|     MarshalBufferSize: u64, |     MarshalBufferSize: u64, | ||||||
|     EnableKSS: u32, |     EnableKSS: u32, | ||||||
| @ -587,7 +796,8 @@ struct EnclaveConfiguration { | |||||||
| 
 | 
 | ||||||
| #[derive(Debug, PartialEq, Clone, Serialize)] | #[derive(Debug, PartialEq, Clone, Serialize)] | ||||||
| struct InternalResourceLimits { | struct InternalResourceLimits { | ||||||
|     user_space_size: String, |     user_space_init_size: String, | ||||||
|  |     user_space_max_size: String, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, PartialEq, Clone, Serialize)] | #[derive(Debug, PartialEq, Clone, Serialize)] | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								tools/occlum
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										22
									
								
								tools/occlum
									
									
									
									
									
								
							| @ -64,7 +64,7 @@ Usage: | |||||||
|         Initialize a directory as the Occlum instance. |         Initialize a directory as the Occlum instance. | ||||||
|         If flag --init-ra specifies, generate initfs with RA KMS client function. |         If flag --init-ra specifies, generate initfs with RA KMS client function. | ||||||
| 
 | 
 | ||||||
|     occlum build [--sign-key <key_path>] [--sign-tool <tool_path>] [--image-key <key_path>] [--buildin-image-key] [-f/--force] |     occlum build [--sign-key <key_path>] [--sign-tool <tool_path>] [--image-key <key_path>] [--buildin-image-key] [-f/--force] [--enable-edmm <Y/N>] | ||||||
|         Build and sign an Occlum SGX enclave (.so) and generate its associated secure |         Build and sign an Occlum SGX enclave (.so) and generate its associated secure | ||||||
|         FS image according to the user-provided image directory and Occlum.json config file. |         FS image according to the user-provided image directory and Occlum.json config file. | ||||||
|         The whole building process is incremental: the building artifacts are built only |         The whole building process is incremental: the building artifacts are built only | ||||||
| @ -375,7 +375,6 @@ cmd_init() { | |||||||
| 
 | 
 | ||||||
| cmd_build() { | cmd_build() { | ||||||
|     check_has_init |     check_has_init | ||||||
| 
 |  | ||||||
|     pal_lib=libocclum-pal.so |     pal_lib=libocclum-pal.so | ||||||
|     libos_lib=libocclum-libos.so |     libos_lib=libocclum-libos.so | ||||||
|     BUILDIN_IMAGE_KEY=false |     BUILDIN_IMAGE_KEY=false | ||||||
| @ -385,10 +384,11 @@ cmd_build() { | |||||||
|         --sign-key)     [ -n "$2" ] && ENCLAVE_SIGN_KEY=$2 ; shift 2 || exit_error "empty signing key path"     ;; |         --sign-key)     [ -n "$2" ] && ENCLAVE_SIGN_KEY=$2 ; shift 2 || exit_error "empty signing key path"     ;; | ||||||
|         --sign-tool)    [ -n "$2" ] && ENCLAVE_SIGN_TOOL=$2 ; shift 2 || exit_error "empty signing tool path"   ;; |         --sign-tool)    [ -n "$2" ] && ENCLAVE_SIGN_TOOL=$2 ; shift 2 || exit_error "empty signing tool path"   ;; | ||||||
|         --sgx-mode)     [[ -n "$2" && "$2" != "HW" ]] && export SGX_MODE=$2 ; shift 2 || exit_error "empty sgx mode";; |         --sgx-mode)     [[ -n "$2" && "$2" != "HW" ]] && export SGX_MODE=$2 ; shift 2 || exit_error "empty sgx mode";; | ||||||
|  |         --enable-edmm)  [[ -n "$2" && "$2" != "N" ]] && export ENABLE_EDMM=Y ; shift 2 || exit_error "empty edmm mode";; | ||||||
|         --image-key)    [ -n "$2" ] && SECURE_IMAGE_KEY=$2 ; shift 2 || exit_error "empty secure image key path"   ;; |         --image-key)    [ -n "$2" ] && SECURE_IMAGE_KEY=$2 ; shift 2 || exit_error "empty secure image key path"   ;; | ||||||
|         --buildin-image-key)  BUILDIN_IMAGE_KEY=true ; shift ;; |         --buildin-image-key)  BUILDIN_IMAGE_KEY=true ; shift ;; | ||||||
|         --force | -f)   MAKE_OPTION="clean" ; shift ;; |         --force | -f)   MAKE_OPTION="clean" ; shift ;; | ||||||
|         *) exit_error "Unknown option: $1"                                                                      ;; |         *) exit_error "Unknown option: $1" ;; | ||||||
|         esac |         esac | ||||||
|     done |     done | ||||||
|     [ -e "$ENCLAVE_SIGN_KEY" ] || exit_error "invalid signing key path: $ENCLAVE_SIGN_KEY" |     [ -e "$ENCLAVE_SIGN_KEY" ] || exit_error "invalid signing key path: $ENCLAVE_SIGN_KEY" | ||||||
| @ -410,8 +410,22 @@ cmd_build() { | |||||||
|             libos_lib=libocclum-libos_hyper.so |             libos_lib=libocclum-libos_hyper.so | ||||||
|         fi |         fi | ||||||
|         echo "SGX mode: $SGX_MODE" |         echo "SGX mode: $SGX_MODE" | ||||||
|  |         echo "Enable EDMM: No" | ||||||
|  |         INSTANCE_IS_FOR_EDMM_PLATFORM="NO" | ||||||
|     else |     else | ||||||
|         echo "SGX mode: HW" |         echo "SGX mode: HW" | ||||||
|  | 
 | ||||||
|  |          # ENABLE_EDMM is only valid for HW mode and is not enabled by default | ||||||
|  |         case "$ENABLE_EDMM" in | ||||||
|  |             "Y" | "YES" | "Yes" | "yes" | "True" | "true" | "1") | ||||||
|  |                 INSTANCE_IS_FOR_EDMM_PLATFORM="YES" | ||||||
|  |                 echo "Enable EDMM: Yes" | ||||||
|  |             ;; | ||||||
|  |             *) | ||||||
|  |                 INSTANCE_IS_FOR_EDMM_PLATFORM="NO" | ||||||
|  |                 echo "Enable EDMM: No" | ||||||
|  |             ;; | ||||||
|  |         esac | ||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     if [[ -f "$instance_dir/init_ra_conf.json" ]]; then |     if [[ -f "$instance_dir/init_ra_conf.json" ]]; then | ||||||
| @ -436,7 +450,7 @@ cmd_build() { | |||||||
|         make -f $build_makefile $MAKE_OPTION |         make -f $build_makefile $MAKE_OPTION | ||||||
|     fi |     fi | ||||||
|     occlum_dir=$occlum_dir instance_dir=$instance_dir pal_lib=$pal_lib major_ver=$major_ver \ |     occlum_dir=$occlum_dir instance_dir=$instance_dir pal_lib=$pal_lib major_ver=$major_ver \ | ||||||
|     occlum_version=$occlum_version libos_lib=$libos_lib \ |     occlum_version=$occlum_version libos_lib=$libos_lib INSTANCE_IS_FOR_EDMM_PLATFORM=$INSTANCE_IS_FOR_EDMM_PLATFORM \ | ||||||
|     ENCLAVE_SIGN_KEY=$ENCLAVE_SIGN_KEY ENCLAVE_SIGN_TOOL=$ENCLAVE_SIGN_TOOL \ |     ENCLAVE_SIGN_KEY=$ENCLAVE_SIGN_KEY ENCLAVE_SIGN_TOOL=$ENCLAVE_SIGN_TOOL \ | ||||||
|     SECURE_IMAGE_KEY=$SECURE_IMAGE_KEY BUILDIN_IMAGE_KEY=$BUILDIN_IMAGE_KEY \ |     SECURE_IMAGE_KEY=$SECURE_IMAGE_KEY BUILDIN_IMAGE_KEY=$BUILDIN_IMAGE_KEY \ | ||||||
|     make -f $build_makefile --no-builtin-rules |     make -f $build_makefile --no-builtin-rules | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user