From 08b3dc72682253b931b273470bcb1c1783a38213 Mon Sep 17 00:00:00 2001 From: "Hui, Chunyang" Date: Wed, 21 Dec 2022 14:39:16 +0800 Subject: [PATCH] Update internal config tool for EDMM support --- test/Occlum.json | 1 + tools/gen_internal_conf/Cargo.lock | 7 +++ tools/gen_internal_conf/Cargo.toml | 1 + tools/gen_internal_conf/src/main.rs | 77 ++++++++++++++++++++++++++--- 4 files changed, 80 insertions(+), 6 deletions(-) diff --git a/test/Occlum.json b/test/Occlum.json index 703d391d..c8e51a39 100644 --- a/test/Occlum.json +++ b/test/Occlum.json @@ -1,6 +1,7 @@ { "resource_limits": { "kernel_space_heap_size": "40MB", + "kernel_space_heap_max_size": "512MB", "kernel_space_stack_size": "1MB", "user_space_size": "600MB", "max_num_of_threads": 32 diff --git a/tools/gen_internal_conf/Cargo.lock b/tools/gen_internal_conf/Cargo.lock index 431a9dff..7ef9c722 100644 --- a/tools/gen_internal_conf/Cargo.lock +++ b/tools/gen_internal_conf/Cargo.lock @@ -77,6 +77,7 @@ version = "0.2.0" dependencies = [ "clap", "env_logger", + "lazy_static", "log", "regex", "serde", @@ -109,6 +110,12 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.70" diff --git a/tools/gen_internal_conf/Cargo.toml b/tools/gen_internal_conf/Cargo.toml index 96a9272b..5014f56b 100644 --- a/tools/gen_internal_conf/Cargo.toml +++ b/tools/gen_internal_conf/Cargo.toml @@ -19,3 +19,4 @@ log = "0.4" env_logger = "0.7" serde-xml-rs = "0.4" regex = "1" +lazy_static = "1.4.0" diff --git a/tools/gen_internal_conf/src/main.rs b/tools/gen_internal_conf/src/main.rs index 46980c98..b0e24cff 100644 --- a/tools/gen_internal_conf/src/main.rs +++ b/tools/gen_internal_conf/src/main.rs @@ -7,6 +7,7 @@ extern crate serde_derive; extern crate serde_xml_rs; use clap::{App, Arg, SubCommand}; +use lazy_static::lazy_static; use log::debug; use serde_derive::{Deserialize, Serialize}; use serde_json::json; @@ -14,6 +15,37 @@ use std::fs::File; use std::io::Write; use std::path::Path; +// Some hardcode implicit config value. Please update the values defined in "init()" when necessary. +lazy_static! { + static ref DEFAULT_CONFIG: DefaultConfig = DefaultConfig::init(); +} + +struct DefaultConfig { + // Corresponds to HeapMaxSize in Enclave.xml + kernel_heap_max_size: &'static str, + // Corresponds to TCSMaxNum in Enclave.xml + num_of_tcs_max: u32, + // Corresponds to MiscSelect in Enclave.xml + misc_select: &'static str, + // Corresponds to MiscMask in Enclave.xml + misc_mask: &'static str, +} + +impl DefaultConfig { + fn init() -> Self { + Self { + kernel_heap_max_size: "1024MB", + num_of_tcs_max: 4096, + // If UserRegionSize is not configured, but the heap, stack and thread related + // configurations have dynamic part, set MiscSelect[0] = 1 and MiscMask[0] = 0, + // the enclave can be loaded on SGX 1.0 and 2.0 platform, and on SGX 2.0 platform, + // it can utilize the dynamic components. + misc_select: "1", + misc_mask: "0x0", + } + } +} + fn main() { env_logger::init(); @@ -125,6 +157,11 @@ fn main() { enclave_config_file_path ); + // get the number of TCS + let tcs_num = occlum_config.resource_limits.max_num_of_threads; + let tcs_min_pool = tcs_num; + let tcs_max_num = std::cmp::max(tcs_num, DEFAULT_CONFIG.num_of_tcs_max); + // get the kernel stack size let stack_max_size = parse_memory_size(&occlum_config.resource_limits.kernel_space_stack_size); @@ -135,16 +172,36 @@ fn main() { ); return; } + // get the kernel heap size - let heap_max_size = + let heap_init_size = parse_memory_size(&occlum_config.resource_limits.kernel_space_heap_size); - if heap_max_size.is_err() { + if heap_init_size.is_err() { println!( "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!( + "The kernel_space_heap_max_size \"{}\" is not correct.", + kernel_space_heap_max_size + ); + return; + } + heap_max_size + } else { + parse_memory_size(DEFAULT_CONFIG.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() { @@ -183,16 +240,19 @@ fn main() { ISVSVN: occlum_config.metadata.version_number, StackMaxSize: stack_max_size.unwrap() as u64, StackMinSize: stack_max_size.unwrap() as u64, // just use the same size as max size + HeapInitSize: heap_init_size.unwrap() as u64, HeapMaxSize: heap_max_size.unwrap() as u64, - HeapMinSize: heap_max_size.unwrap() as u64, // just use the same size as max size - TCSNum: occlum_config.resource_limits.max_num_of_threads, + HeapMinSize: heap_init_size.unwrap() as u64, + TCSNum: tcs_num, + TCSMinPool: tcs_min_pool, + TCSMaxNum: tcs_max_num, TCSPolicy: 1, DisableDebug: match occlum_config.metadata.debuggable { true => 0, false => 1, }, - MiscSelect: "0".to_string(), - MiscMask: "0xFFFFFFFF".to_string(), + MiscSelect: DEFAULT_CONFIG.misc_select.to_string(), + MiscMask: DEFAULT_CONFIG.misc_mask.to_string(), ReservedMemMaxSize: user_space_size.unwrap() as u64, ReservedMemMinSize: user_space_size.unwrap() as u64, ReservedMemInitSize: user_space_size.unwrap() as u64, @@ -426,6 +486,8 @@ struct OcclumConfiguration { struct OcclumResourceLimits { max_num_of_threads: u32, kernel_space_heap_size: String, + #[serde(default)] + kernel_space_heap_max_size: Option, kernel_space_stack_size: String, user_space_size: String, #[cfg(feature = "ms_buffer")] @@ -497,9 +559,12 @@ struct EnclaveConfiguration { ISVSVN: u32, StackMaxSize: u64, StackMinSize: u64, + HeapInitSize: u64, HeapMaxSize: u64, HeapMinSize: u64, TCSNum: u32, + TCSMaxNum: u32, + TCSMinPool: u32, TCSPolicy: u32, DisableDebug: u32, MiscSelect: String,