Add support for AMX
This commit is contained in:
parent
0a00af4f31
commit
3c481d1297
@ -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)]
|
||||||
|
Loading…
Reference in New Issue
Block a user