Add support for AMX

This commit is contained in:
Hui, Chunyang 2023-09-22 09:04:57 +00:00 committed by volcano
parent 0a00af4f31
commit 3c481d1297
4 changed files with 31 additions and 2 deletions

@ -34,7 +34,8 @@
"high": "0x0", "high": "0x0",
"low": "0x0" "low": "0x0"
}, },
"pkru": 0 "pkru": 0,
"amx": 0
}, },
"mount": [ "mount": [
{ {

@ -1,17 +1,40 @@
use crate::prelude::*; use crate::prelude::*;
use crate::util::mem_util::from_user::check_mut_ptr;
pub fn do_arch_prctl(code: ArchPrctlCode, addr: *mut usize) -> Result<()> { pub fn do_arch_prctl(code: ArchPrctlCode, addr: *mut usize) -> Result<()> {
debug!("do_arch_prctl: code: {:?}, addr: {:?}", code, addr); debug!("do_arch_prctl: code: {:?}, addr: {:?}", code, addr);
match code { match code {
ArchPrctlCode::ARCH_SET_FS => { ArchPrctlCode::ARCH_SET_FS => {
check_mut_ptr(addr)?;
current!().task().set_user_fs(addr as usize); current!().task().set_user_fs(addr as usize);
} }
ArchPrctlCode::ARCH_GET_FS => unsafe { ArchPrctlCode::ARCH_GET_FS => unsafe {
check_mut_ptr(addr)?;
*addr = current!().task().user_fs(); *addr = current!().task().user_fs();
}, },
ArchPrctlCode::ARCH_SET_GS | ArchPrctlCode::ARCH_GET_GS => { ArchPrctlCode::ARCH_SET_GS | ArchPrctlCode::ARCH_GET_GS => {
check_mut_ptr(addr)?;
return_errno!(EINVAL, "GS cannot be accessed from the user space"); return_errno!(EINVAL, "GS cannot be accessed from the user space");
} }
ArchPrctlCode::ARCH_REQ_XCOMP_PERM => {
// Allows to request permission for a dynamically enabled feature or a feature set
// Currently only used to enable AMX
use crate::util::sgx::get_self_target;
const XFEATURE_XTILEDATA: u64 = 18;
let features = addr as u64;
if features == XFEATURE_XTILEDATA {
// Check if AMX is enabled for current Enclave
let target_info = get_self_target()?;
if target_info.attributes.xfrm & SGX_XFRM_AMX != SGX_XFRM_AMX {
return_errno!(EINVAL, "AMX is not enabled for this enclave");
} else {
info!("AMX is enabled for this enclave");
}
} else {
return_errno!(ENOSYS, "feature not supported");
}
}
} }
Ok(()) Ok(())
} }
@ -23,6 +46,7 @@ pub enum ArchPrctlCode {
ARCH_SET_FS = 0x1002, ARCH_SET_FS = 0x1002,
ARCH_GET_FS = 0x1003, ARCH_GET_FS = 0x1003,
ARCH_GET_GS = 0x1004, ARCH_GET_GS = 0x1004,
ARCH_REQ_XCOMP_PERM = 0x1023,
} }
impl ArchPrctlCode { impl ArchPrctlCode {
@ -32,6 +56,7 @@ impl ArchPrctlCode {
0x1002 => Ok(ArchPrctlCode::ARCH_SET_FS), 0x1002 => Ok(ArchPrctlCode::ARCH_SET_FS),
0x1003 => Ok(ArchPrctlCode::ARCH_GET_FS), 0x1003 => Ok(ArchPrctlCode::ARCH_GET_FS),
0x1004 => Ok(ArchPrctlCode::ARCH_GET_GS), 0x1004 => Ok(ArchPrctlCode::ARCH_GET_GS),
0x1023 => Ok(ArchPrctlCode::ARCH_REQ_XCOMP_PERM),
_ => return_errno!(EINVAL, "Unknown code for arch_prctl"), _ => return_errno!(EINVAL, "Unknown code for arch_prctl"),
} }
} }

@ -345,7 +345,6 @@ pub fn do_prctl(option: i32, arg2: u64, arg3: u64, arg4: u64, arg5: u64) -> Resu
pub fn do_arch_prctl(code: u32, addr: *mut usize) -> Result<isize> { pub fn do_arch_prctl(code: u32, addr: *mut usize) -> Result<isize> {
let code = ArchPrctlCode::from_u32(code)?; let code = ArchPrctlCode::from_u32(code)?;
check_mut_ptr(addr)?;
super::do_arch_prctl::do_arch_prctl(code, addr).map(|_| 0) super::do_arch_prctl::do_arch_prctl(code, addr).map(|_| 0)
} }

@ -461,6 +461,7 @@ fn main() {
ISVFAMILYID_H: kss_tuple.3, ISVFAMILYID_H: kss_tuple.3,
ISVFAMILYID_L: kss_tuple.4, ISVFAMILYID_L: kss_tuple.4,
PKRU: occlum_config.metadata.pkru, PKRU: occlum_config.metadata.pkru,
AMX: occlum_config.metadata.amx,
}; };
let enclave_config = serde_xml_rs::to_string(&sgx_enclave_configuration).unwrap(); let enclave_config = serde_xml_rs::to_string(&sgx_enclave_configuration).unwrap();
debug!("The enclave config:{:?}", enclave_config); debug!("The enclave config:{:?}", enclave_config);
@ -724,6 +725,8 @@ struct OcclumMetadata {
ext_prod_id: OcclumMetaID, ext_prod_id: OcclumMetaID,
#[serde(default)] #[serde(default)]
pkru: u32, pkru: u32,
#[serde(default)]
amx: u32,
} }
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
@ -792,6 +795,7 @@ struct EnclaveConfiguration {
ISVFAMILYID_H: u64, ISVFAMILYID_H: u64,
ISVFAMILYID_L: u64, ISVFAMILYID_L: u64,
PKRU: u32, PKRU: u32,
AMX: u32,
} }
#[derive(Debug, PartialEq, Clone, Serialize)] #[derive(Debug, PartialEq, Clone, Serialize)]