This is an automated email from the ASF dual-hosted git repository.

rduan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave-sgx-sdk.git


The following commit(s) were added to refs/heads/master by this push:
     new 3c903bda Support intel-sdk-2.20 and dcap-1.17
3c903bda is described below

commit 3c903bdac4e503dd27b9b1f761c4abfc55f2464c
Author: volcano <[email protected]>
AuthorDate: Tue Jul 25 18:17:46 2023 +0800

    Support intel-sdk-2.20 and dcap-1.17
---
 dockerfile/02_binutils.sh                          |   2 +-
 dockerfile/03_sdk.sh                               |   4 +-
 dockerfile/Dockerfile.1804.nightly                 |   6 +-
 dockerfile/Dockerfile.2004.nightly                 |  12 +--
 dockerfile/Dockerfile.centos8.nightly              |   9 +-
 samplecode/unit-test/enclave/src/test_exception.rs |   7 +-
 samplecode/unit-test/enclave/src/test_fp.rs        |  68 +++++++-------
 sgx_signal/src/exception.rs                        |  78 ++++++++++++----
 sgx_signal/src/manager.rs                          |   4 +-
 sgx_trts/src/aex.rs                                | 101 +++++++++++++++++++++
 sgx_trts/src/enclave.rs                            |   9 ++
 sgx_trts/src/lib.rs                                |   1 +
 sgx_tseal/src/internal.rs                          |   1 -
 sgx_types/src/error.rs                             |  15 ++-
 sgx_types/src/function.rs                          |  38 ++++++--
 sgx_types/src/marker.rs                            |   1 +
 sgx_types/src/types.rs                             |  66 ++++++++++++--
 17 files changed, 330 insertions(+), 92 deletions(-)

diff --git a/dockerfile/02_binutils.sh b/dockerfile/02_binutils.sh
index bf52603c..cf3477ef 100644
--- a/dockerfile/02_binutils.sh
+++ b/dockerfile/02_binutils.sh
@@ -1,7 +1,7 @@
 if [ $BINUTILS_DIST != "SELF_BUILT" ]
 then
     cd /root && \
-    wget 
https://download.01.org/intel-sgx/sgx-linux/2.17/as.ld.objdump.r4.tar.gz && \
+    wget 
https://download.01.org/intel-sgx/sgx-linux/2.20/as.ld.objdump.r4.tar.gz && \
     tar xzf as.ld.objdump.r4.tar.gz && \
     cp -r external/toolset/$BINUTILS_DIST/* /usr/bin/ && \
     rm -rf ./external ./as.ld.objdump.r4.tar.gz
diff --git a/dockerfile/03_sdk.sh b/dockerfile/03_sdk.sh
index eb5d0152..99dd24b0 100644
--- a/dockerfile/03_sdk.sh
+++ b/dockerfile/03_sdk.sh
@@ -10,10 +10,10 @@ else
     cd /root && \
     git clone --recursive https://github.com/intel/linux-sgx && \
     cd linux-sgx && \
-    git checkout sgx_2.17.1 && \
+    git checkout sgx_2.20 && \
     ./download_prebuilt.sh && \
     make -j "$(nproc)" sdk_install_pkg && \
-    echo -e 'no\n/opt' | 
./linux/installer/bin/sgx_linux_x64_sdk_2.17.101.1.bin && \
+    echo -e 'no\n/opt' | 
./linux/installer/bin/sgx_linux_x64_sdk_2.20.100.4.bin && \
     echo 'source /opt/sgxsdk/environment' >> /root/.bashrc && \
     cd /root && \
     rm -rf /root/linux-sgx
diff --git a/dockerfile/Dockerfile.1804.nightly 
b/dockerfile/Dockerfile.1804.nightly
index 0c2f163b..b6f761a6 100644
--- a/dockerfile/Dockerfile.1804.nightly
+++ b/dockerfile/Dockerfile.1804.nightly
@@ -23,15 +23,15 @@ RUN bash /root/03_sdk.sh
 # Sixth, PSW
 
 ENV CODENAME        bionic
-ENV VERSION         2.17.100.3-bionic1
-ENV DCAP_VERSION    1.14.100.3-bionic1
+ENV VERSION         2.20.100.4-bionic1
+ENV DCAP_VERSION    1.17.100.4-bionic1
 
 COPY 04_psw.sh /root
 RUN bash /root/04_psw.sh
 
 # Seventh, Rust
 
-ENV rust_toolchain  nightly-2022-02-23
+ENV rust_toolchain  nightly-2022-10-22
 COPY 05_rust.sh /root
 RUN bash /root/05_rust.sh
 
diff --git a/dockerfile/Dockerfile.2004.nightly 
b/dockerfile/Dockerfile.2004.nightly
index ab393aa6..319310da 100644
--- a/dockerfile/Dockerfile.2004.nightly
+++ b/dockerfile/Dockerfile.2004.nightly
@@ -5,10 +5,6 @@ ENV DEBIAN_FRONTEND=noninteractive
 RUN apt update && apt install -y unzip lsb-release debhelper cmake reprepro 
autoconf automake bison build-essential curl dpkg-dev expect flex gcc-8 gdb git 
git-core gnupg kmod libboost-system-dev libboost-thread-dev 
libcurl4-openssl-dev libiptcdata0-dev libjsoncpp-dev liblog4cpp5-dev 
libprotobuf-dev libssl-dev libtool libxml2-dev ocaml ocamlbuild pkg-config 
protobuf-compiler python texinfo uuid-dev vim wget software-properties-common 
&& \
     rm -rf /var/lib/apt/lists/*
 
-#20.04 does have gcc-9
-#ADD 01_gcc_8.sh /root
-#RUN bash /root/01_gcc_8.sh
-
 ENV BINUTILS_DIST="ubuntu20.04"
 #ENV BINUTILS_DIST="SELF_BUILT"
 ENV LD_LIBRARY_PATH=/usr/lib:/usr/local/lib
@@ -19,22 +15,22 @@ RUN bash /root/02_binutils.sh
 
 #ENV SDK_DIST="SELF_BUILT"
 ENV SDK_DIST="INTEL_BUILT"
-ENV 
SDK_URL="https://download.01.org/intel-sgx/sgx-linux/2.17.1/distro/ubuntu20.04-server/sgx_linux_x64_sdk_2.17.101.1.bin";
+ENV 
SDK_URL="https://download.01.org/intel-sgx/sgx-linux/2.20/distro/ubuntu20.04-server/sgx_linux_x64_sdk_2.20.100.4.bin";
 ADD 03_sdk.sh /root
 RUN bash /root/03_sdk.sh
 
 # Sixth, PSW
 
 ENV CODENAME        focal
-ENV VERSION         2.17.100.3-focal1
-ENV DCAP_VERSION    1.14.100.3-focal1
+ENV VERSION         2.20.100.4-focal1
+ENV DCAP_VERSION    1.17.100.4-focal1
 
 ADD 04_psw.sh /root
 RUN bash /root/04_psw.sh
 
 # Seventh, Rust
 
-ENV rust_toolchain  nightly-2022-02-23
+ENV rust_toolchain  nightly-2022-10-22
 ADD 05_rust.sh /root
 RUN bash /root/05_rust.sh
 
diff --git a/dockerfile/Dockerfile.centos8.nightly 
b/dockerfile/Dockerfile.centos8.nightly
index aeada924..9ebd366c 100644
--- a/dockerfile/Dockerfile.centos8.nightly
+++ b/dockerfile/Dockerfile.centos8.nightly
@@ -4,25 +4,22 @@ RUN dnf group install -y 'Development Tools' && \
     dnf --enablerepo=powertools install -y ocaml ocaml-ocamlbuild 
redhat-rpm-config openssl-devel wget rpm-build git cmake perl python2 
libcurl-devel protobuf-devel && \
     alternatives --set python /usr/bin/python2
 
-#ADD 01_gcc_8.sh /root
-#RUN bash /root/01_gcc_8.sh
-
 ENV BINUTILS_DIST="centos8"
 
 ADD 02_binutils.sh /root
 RUN bash /root/02_binutils.sh
 
 ENV SDK_DIST="INTEL_BUILT"
-ENV 
SDK_URL="https://download.01.org/intel-sgx/sgx-linux/2.17.1/distro/centos-stream/sgx_linux_x64_sdk_2.17.101.1.bin";
+ENV 
SDK_URL="https://download.01.org/intel-sgx/sgx-linux/2.20/distro/centos-stream/sgx_linux_x64_sdk_2.20.100.4.bin";
 #ENV SDK_DIST="SELF_BUILT"
 ADD 03_sdk.sh /root
 RUN bash /root/03_sdk.sh
 
-ENV 
PSW_REPO="https://download.01.org/intel-sgx/sgx-linux/2.17/distro/centos-stream/sgx_rpm_local_repo.tgz";
+ENV 
PSW_REPO="https://download.01.org/intel-sgx/sgx-linux/2.20/distro/centos-stream/sgx_rpm_local_repo.tgz";
 ADD 04_psw_rpm.sh /root
 RUN bash /root/04_psw_rpm.sh
 
-ENV rust_toolchain  nightly-2022-02-23
+ENV rust_toolchain   nightly-2022-10-22
 ADD 05_rust.sh /root
 RUN bash /root/05_rust.sh
 
diff --git a/samplecode/unit-test/enclave/src/test_exception.rs 
b/samplecode/unit-test/enclave/src/test_exception.rs
index ae2d0578..88a832b7 100644
--- a/samplecode/unit-test/enclave/src/test_exception.rs
+++ b/samplecode/unit-test/enclave/src/test_exception.rs
@@ -16,9 +16,8 @@
 // under the License..
 
 use sgx_signal::exception::{register_exception, unregister};
-use sgx_signal::ContinueType;
+use sgx_signal::{ContinueType, ExceptionInfo};
 use sgx_trts::enclave;
-use sgx_types::sgx_exception_info_t;
 use std::backtrace::{self, PrintFormat};
 use std::panic;
 use std::sync::atomic::{AtomicUsize, Ordering};
@@ -49,7 +48,7 @@ pub fn test_exception_handler() {
     let status = Arc::new(AtomicUsize::new(2));
     let handler1 = {
         let status = Arc::clone(&status);
-        move |_info: &mut sgx_exception_info_t| {
+        move |_info: &mut ExceptionInfo| {
             status.fetch_add(2, Ordering::Relaxed);
             ContinueType::Search
         }
@@ -57,7 +56,7 @@ pub fn test_exception_handler() {
 
     let handler2 = {
         let status = Arc::clone(&status);
-        move |_info: &mut sgx_exception_info_t| {
+        move |_info: &mut ExceptionInfo| {
             status.store(1, Ordering::Relaxed);
             ContinueType::Search
         }
diff --git a/samplecode/unit-test/enclave/src/test_fp.rs 
b/samplecode/unit-test/enclave/src/test_fp.rs
index 85f7aac7..51f0ed37 100644
--- a/samplecode/unit-test/enclave/src/test_fp.rs
+++ b/samplecode/unit-test/enclave/src/test_fp.rs
@@ -19,7 +19,7 @@ pub fn test_fp64() {
     let f = 3.7_f64;
     let g = 3.0_f64;
     let h = -3.7_f64;
-    
+
     assert_eq!(f.floor(), 3.0);
     assert_eq!(g.floor(), 3.0);
     assert_eq!(h.floor(), -4.0);
@@ -28,26 +28,26 @@ pub fn test_fp64() {
     let g = 4.0_f64;
     assert_eq!(f.ceil(), 4.0);
     assert_eq!(g.ceil(), 4.0);
-    
+
     let f = 3.3_f64;
     let g = -3.3_f64;
     assert_eq!(f.round(), 3.0);
     assert_eq!(g.round(), -3.0);
-    
+
     let f = 3.7_f64;
     let g = 3.0_f64;
     let h = -3.7_f64;
     assert_eq!(f.trunc(), 3.0);
     assert_eq!(g.trunc(), 3.0);
     assert_eq!(h.trunc(), -3.0);
-    
+
     let x = 3.6_f64;
     let y = -3.6_f64;
     let abs_difference_x = (x.fract() - 0.6).abs();
     let abs_difference_y = (y.fract() - (-0.6)).abs();
     assert!(abs_difference_x < 1e-10);
     assert!(abs_difference_y < 1e-10);
-    
+
     let x = 3.5_f64;
     let y = -3.5_f64;
     let abs_difference_x = (x.abs() - x).abs();
@@ -60,28 +60,28 @@ pub fn test_fp64() {
     assert_eq!(f.signum(), 1.0);
     assert_eq!(f64::NEG_INFINITY.signum(), -1.0);
     assert!(f64::NAN.signum().is_nan());
-    
+
     let f = 3.5_f64;
     assert_eq!(f.copysign(0.42), 3.5_f64);
     assert_eq!(f.copysign(-0.42), -3.5_f64);
     assert_eq!((-f).copysign(0.42), 3.5_f64);
     assert_eq!((-f).copysign(-0.42), -3.5_f64);
     assert!(f64::NAN.copysign(1.0).is_nan());
-    
+
     let m = 10.0_f64;
     let x = 4.0_f64;
     let b = 60.0_f64;
     // 100.0
     let abs_difference = (m.mul_add(x, b) - ((m * x) + b)).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let a: f64 = 7.0;
     let b = 4.0;
     assert_eq!(a.div_euclid(b), 1.0); // 7.0 > 4.0 * 1.0
     assert_eq!((-a).div_euclid(b), -2.0); // -7.0 >= 4.0 * -2.0
     assert_eq!(a.div_euclid(-b), -1.0); // 7.0 >= -4.0 * -1.0
     assert_eq!((-a).div_euclid(-b), 2.0); // -7.0 >= -4.0 * 2.0
-    
+
     let a: f64 = 7.0;
     let b = 4.0;
     assert_eq!(a.rem_euclid(b), 3.0);
@@ -90,11 +90,11 @@ pub fn test_fp64() {
     assert_eq!((-a).rem_euclid(-b), 1.0);
     // limitation due to round-off error
     assert!((-f64::EPSILON).rem_euclid(3.0) != 0.0);
-    
+
     let x = 2.0_f64;
     let abs_difference = (x.powi(2) - (x * x)).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let x = 2.0_f64;
     let abs_difference = (x.powf(2.0) - (x * x)).abs();
     assert!(abs_difference < 1e-10);
@@ -104,77 +104,77 @@ pub fn test_fp64() {
     let abs_difference = (positive.sqrt() - 2.0).abs();
     assert!(abs_difference < 1e-10);
     assert!(negative.sqrt().is_nan());
-    
+
     let one = 1.0_f64;
     // e^1
     let e = one.exp();
     // ln(e) - 1 == 0
     let abs_difference = (e.ln() - 1.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let f = 2.0_f64;
     // 2^2 - 4 == 0
     let abs_difference = (f.exp2() - 4.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let one = 1.0_f64;
     // e^1
     let e = one.exp();
     // ln(e) - 1 == 0
     let abs_difference = (e.ln() - 1.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let twenty_five = 25.0_f64;
     // log5(25) - 2 == 0
     let abs_difference = (twenty_five.log(5.0) - 2.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let four = 4.0_f64;
     // log2(4) - 2 == 0
     let abs_difference = (four.log2() - 2.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let hundred = 100.0_f64;
     // log10(100) - 2 == 0
     let abs_difference = (hundred.log10() - 2.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let x = 3.0_f64;
     let y = -3.0_f64;
     let abs_difference_x = (x.abs_sub(1.0) - 2.0).abs();
     let abs_difference_y = (y.abs_sub(1.0) - 0.0).abs();
     assert!(abs_difference_x < 1e-10);
     assert!(abs_difference_y < 1e-10);
-    
+
     let x = 8.0_f64;
     // x^(1/3) - 2 == 0
     let abs_difference = (x.cbrt() - 2.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let x = 2.0_f64;
     let y = 3.0_f64;
     // sqrt(x^2 + y^2)
     let abs_difference = (x.hypot(y) - (x.powi(2) + y.powi(2)).sqrt()).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let x = std::f64::consts::FRAC_PI_2;
     let abs_difference = (x.sin() - 1.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let x = 2.0 * std::f64::consts::PI;
     let abs_difference = (x.cos() - 1.0).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let f = std::f64::consts::FRAC_PI_2;
     // asin(sin(pi/2))
     let abs_difference = (f.sin().asin() - std::f64::consts::FRAC_PI_2).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let f = std::f64::consts::FRAC_PI_4;
     // acos(cos(pi/4))
     let abs_difference = (f.cos().acos() - std::f64::consts::FRAC_PI_4).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let f = 1.0_f64;
     // atan(tan(1))
     let abs_difference = (f.tan().atan() - 1.0).abs();
@@ -192,26 +192,26 @@ pub fn test_fp64() {
     let abs_difference_2 = (y2.atan2(x2) - (3.0 * 
std::f64::consts::FRAC_PI_4)).abs();
     assert!(abs_difference_1 < 1e-10);
     assert!(abs_difference_2 < 1e-10);
-    
+
     let x = std::f64::consts::FRAC_PI_4;
     let f = x.sin_cos();
     let abs_difference_0 = (f.0 - x.sin()).abs();
     let abs_difference_1 = (f.1 - x.cos()).abs();
     assert!(abs_difference_0 < 1e-10);
     assert!(abs_difference_1 < 1e-10);
-    
+
     let x = 1e-16_f64;
     // for very small x, e^x is approximately 1 + x + x^2 / 2
     let approx = x + x * x / 2.0;
     let abs_difference = (x.exp_m1() - approx).abs();
     assert!(abs_difference < 1e-20);
-    
+
     let x = 1e-16_f64;
     // for very small x, ln(1 + x) is approximately x - x^2 / 2
     let approx = x - x * x / 2.0;
     let abs_difference = (x.ln_1p() - approx).abs();
     assert!(abs_difference < 1e-20);
-    
+
     let e = std::f64::consts::E;
     let x = 1.0_f64;
     let f = x.sinh();
@@ -219,7 +219,7 @@ pub fn test_fp64() {
     let g = ((e * e) - 1.0) / (2.0 * e);
     let abs_difference = (f - g).abs();
     assert!(abs_difference < 1e-10);
-    
+
     let e = std::f64::consts::E;
     let x = 1.0_f64;
     let f = x.cosh();
@@ -228,7 +228,7 @@ pub fn test_fp64() {
     let abs_difference = (f - g).abs();
     // Same result
     assert!(abs_difference < 1.0e-10);
-    
+
     let e = std::f64::consts::E;
     let x = 1.0_f64;
     let f = x.tanh();
@@ -236,17 +236,17 @@ pub fn test_fp64() {
     let g = (1.0 - e.powi(-2)) / (1.0 + e.powi(-2));
     let abs_difference = (f - g).abs();
     assert!(abs_difference < 1.0e-10);
-    
+
     let x = 1.0_f64;
     let f = x.sinh().asinh();
     let abs_difference = (f - x).abs();
     assert!(abs_difference < 1.0e-10);
-    
+
     let x = 1.0_f64;
     let f = x.cosh().acosh();
     let abs_difference = (f - x).abs();
     assert!(abs_difference < 1.0e-10);
-    
+
     let e = std::f64::consts::E;
     let f = e.tanh().atanh();
     let abs_difference = (f - e).abs();
diff --git a/sgx_signal/src/exception.rs b/sgx_signal/src/exception.rs
index dfeb0627..5ca83d26 100644
--- a/sgx_signal/src/exception.rs
+++ b/sgx_signal/src/exception.rs
@@ -20,13 +20,16 @@ use sgx_trts::veh::{
     exception_handle, rsgx_register_exception_handler, 
rsgx_unregister_exception_handler,
 };
 use sgx_types::SE_WORDSIZE;
-use sgx_types::{sgx_exception_info_t, sgx_exception_vector_t};
+use sgx_types::{
+    sgx_cpu_context_t, sgx_exception_info_t, sgx_exception_type_t, 
sgx_exception_vector_t,
+};
 use sgx_types::{EXCEPTION_CONTINUE_EXECUTION, EXCEPTION_CONTINUE_SEARCH};
 use std::collections::LinkedList;
 use std::convert::From;
 use std::num::NonZeroU64;
 use std::ops::Drop;
-use std::sync::{Arc, Once, SgxRwLock, SgxMutex, PoisonError, ONCE_INIT};
+use std::slice;
+use std::sync::{Arc, Once, PoisonError, SgxMutex, SgxRwLock, ONCE_INIT};
 use std::u64;
 
 #[repr(u32)]
@@ -46,7 +49,7 @@ impl From<ContinueType> for i32 {
 }
 
 #[allow(unknown_lints, bare_trait_objects)]
-type ExceptionHandler = dyn Fn(&mut sgx_exception_info_t) -> ContinueType + 
Send + Sync;
+type ExceptionHandler = dyn Fn(&mut ExceptionInfo) -> ContinueType + Send + 
Sync;
 
 #[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
 pub struct HandlerId(NonZeroU64);
@@ -71,6 +74,45 @@ impl HandlerId {
     }
 }
 
+pub struct ExceptionInfo<'a>(&'a mut sgx_exception_info_t);
+
+impl<'a> ExceptionInfo<'a> {
+    #[inline]
+    fn new(exception_info: &'a mut sgx_exception_info_t) -> ExceptionInfo {
+        ExceptionInfo(exception_info)
+    }
+
+    #[inline]
+    pub fn cpu_context(&mut self) -> &mut sgx_cpu_context_t {
+        &mut self.0.cpu_context
+    }
+
+    #[inline]
+    pub fn faulting_address(&self) -> u64 {
+        self.0.exinfo.faulting_address
+    }
+
+    #[inline]
+    pub fn error_code(&self) -> u32 {
+        self.0.exinfo.error_code
+    }
+
+    #[inline]
+    pub fn exception_vector(&self) -> sgx_exception_vector_t {
+        self.0.exception_vector
+    }
+
+    #[inline]
+    pub fn exception_type(&self) -> sgx_exception_type_t {
+        self.0.exception_type
+    }
+
+    #[inline]
+    pub fn xsave_area(&self) -> &[u8] {
+        unsafe { slice::from_raw_parts(&self.0.xsave_area as *const _, 
self.0.xsave_size as usize) }
+    }
+}
+
 struct HandlerNode {
     id: HandlerId,
     handler: Arc<ExceptionHandler>,
@@ -114,32 +156,34 @@ impl GlobalData {
 }
 
 extern "C" fn native_exception_handler(info: *mut sgx_exception_info_t) -> 
int32_t {
+    let mut exception_info = ExceptionInfo::new(unsafe { 
info.as_mut().unwrap() });
     if let Ok(handlers) = GlobalData::get().manager.exception_handler.read() {
-        let info = unsafe { info.as_mut().unwrap() };
         for h in handlers.iter() {
-            match (h.handler)(info) {
+            match (h.handler)(&mut exception_info) {
                 ContinueType::Search => {}
                 ContinueType::Execution => return EXCEPTION_CONTINUE_EXECUTION,
             }
         }
     }
-    unsafe { panic_handler(info).into() }
+    unsafe { panic_handler(&mut exception_info).into() }
 }
 
-unsafe extern "C" fn panic_handler(info: *mut sgx_exception_info_t) -> 
ContinueType {
-    let exception_info = info.as_mut().unwrap();
-    let mut rsp = exception_info.cpu_context.rsp;
+unsafe extern "C" fn panic_handler(info: &mut ExceptionInfo) -> ContinueType {
+    let vector = info.exception_vector() as u32 as u64;
+    let cpu_context = info.cpu_context();
+
+    let mut rsp = cpu_context.rsp;
     if rsp & 0xF == 0 {
         rsp -= SE_WORDSIZE as u64;
-        exception_info.cpu_context.rsp = rsp;
+        cpu_context.rsp = rsp;
         let addr = rsp as *mut u64;
-        *addr = exception_info.cpu_context.rip;
+        *addr = cpu_context.rip;
     } else {
     }
 
-    exception_info.cpu_context.rdi = exception_info.exception_vector as u32 as 
u64;
-    exception_info.cpu_context.rsi = exception_info.cpu_context.rip;
-    exception_info.cpu_context.rip = exception_panic as usize as u64;
+    cpu_context.rdi = vector;
+    cpu_context.rsi = cpu_context.rip;
+    cpu_context.rip = exception_panic as usize as u64;
 
     ContinueType::Execution
 }
@@ -188,7 +232,7 @@ impl Drop for ExceptionManager {
 
 fn register_exception_impl<F>(first: bool, handler: F) -> Option<HandlerId>
 where
-    F: Fn(&mut sgx_exception_info_t) -> ContinueType + Sync + Send + 'static,
+    F: Fn(&mut ExceptionInfo) -> ContinueType + Sync + Send + 'static,
 {
     let globals = GlobalData::ensure();
 
@@ -222,7 +266,7 @@ where
 ///
 pub fn register_exception<F>(is_first: bool, handler: F) -> Option<HandlerId>
 where
-    F: Fn(&mut sgx_exception_info_t) -> ContinueType + Sync + Send + 'static,
+    F: Fn(&mut ExceptionInfo) -> ContinueType + Sync + Send + 'static,
 {
     register_exception_impl(is_first, handler)
 }
@@ -243,7 +287,7 @@ where
 ///
 pub fn register<F>(handler: F) -> Option<HandlerId>
 where
-    F: Fn(&mut sgx_exception_info_t) -> ContinueType + Sync + Send + 'static,
+    F: Fn(&mut ExceptionInfo) -> ContinueType + Sync + Send + 'static,
 {
     register_exception_impl(true, handler)
 }
diff --git a/sgx_signal/src/manager.rs b/sgx_signal/src/manager.rs
index bbf67991..449c5d9e 100644
--- a/sgx_signal/src/manager.rs
+++ b/sgx_signal/src/manager.rs
@@ -25,7 +25,7 @@ use std::mem;
 use std::num::NonZeroU64;
 use std::sync::Arc;
 #[allow(deprecated)]
-use std::sync::{SgxMutex, PoisonError};
+use std::sync::{PoisonError, SgxMutex};
 use std::u64;
 
 thread_local! { static SIGNAL_MASK: Cell<SigSet> = Cell::new(SigSet::new()) }
@@ -162,8 +162,6 @@ impl ActionId {
         drop(counter);
         ActionId(NonZeroU64::new(id).unwrap())
     }
-
-    
 }
 
 pub type Action = dyn Fn(&siginfo_t) + Send + Sync;
diff --git a/sgx_trts/src/aex.rs b/sgx_trts/src/aex.rs
new file mode 100644
index 00000000..5b0a1ff5
--- /dev/null
+++ b/sgx_trts/src/aex.rs
@@ -0,0 +1,101 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License..
+
+use alloc::boxed::Box;
+use core::mem::{self, ManuallyDrop};
+use core::ptr;
+use sgx_types::*;
+
+pub type aex_handle = *const sgx_aex_mitigation_node_t;
+
+///
+/// rsgx_set_ssa_aexnotify allows developers to enable the AEX-Notify feature
+/// upon a piece of enclave code.
+///
+/// # Description
+///
+/// You can enable or disable AEX-Notify in the enclave code using this 
function.
+/// To enable AEX-Notify for critical code that you want to mitigate for 
single-step
+/// attacks, call this function. The following execution will be executed with
+/// AEX-Notify enabled until you call this function to disable it.
+///
+pub fn rsgx_set_ssa_aexnotify(is_enable: bool) -> SgxError {
+    let mut flags = 0_i32;
+    if is_enable {
+        flags = 1;
+    }
+    let ret = unsafe { sgx_set_ssa_aexnotify(flags) };
+
+    match ret {
+        sgx_status_t::SGX_SUCCESS => Ok(()),
+        _ => Err(ret),
+    }
+}
+
+///
+/// rsgx_register_aex_handler allows developers to register an AEX- Notify 
handler.
+///
+/// # Description
+///
+/// The Rust SDK allows you to register custom AEX-Notify functions. You can 
write your
+/// own code to provide an AEX-Notify handler that detects single-step 
attacks. For instance,
+/// you can provide a handler that counts the Async Exit. If the count is 
abnormal which
+/// means single-step attacks occur, you can take proper actions.
+///
+pub fn rsgx_register_aex_handler(
+    handler: sgx_aex_mitigation_fn_t,
+    args: usize,
+) -> SgxResult<aex_handle> {
+    let mut node: Box<sgx_aex_mitigation_node_t> = 
Box::new(sgx_aex_mitigation_node_t {
+        handler,
+        args: args as *const c_void,
+        next: ptr::null_mut(),
+    });
+    let node_ptr = &mut *node as *mut sgx_aex_mitigation_node_t;
+    let ret = unsafe { sgx_register_aex_handler(node_ptr, handler, args as 
*const _) };
+
+    match ret {
+        sgx_status_t::SGX_SUCCESS => {
+            mem::forget(node);
+            Ok(node_ptr)
+        }
+        _ => Err(ret),
+    }
+}
+
+///
+/// rsgx_unregister_aex_handler is used to unregister an AEX-Notify handler.
+///
+/// # Description
+///
+/// The Rust SDK allows you to register custom AEX-Notify functions. You can 
write your own code to
+/// provide an AEX-Notify handler that detects single-step attacks.
+///
+pub fn rsgx_unregister_aex_handler(handle: aex_handle) -> SgxError {
+    unsafe {
+        let node: ManuallyDrop<Box<sgx_aex_mitigation_node_t>> =
+            ManuallyDrop::new(Box::from_raw(handle as *mut 
sgx_aex_mitigation_node_t));
+        let ret = sgx_unregister_aex_handler(node.handler);
+        match ret {
+            sgx_status_t::SGX_SUCCESS => {
+                let _ = ManuallyDrop::into_inner(node);
+                Ok(())
+            }
+            _ => Err(ret),
+        }
+    }
+}
diff --git a/sgx_trts/src/enclave.rs b/sgx_trts/src/enclave.rs
index 4db1b0e3..a0c6c0c0 100644
--- a/sgx_trts/src/enclave.rs
+++ b/sgx_trts/src/enclave.rs
@@ -61,6 +61,7 @@ pub struct global_data_t {
     pub enclave_image_address: u64,
     pub elrange_start_address: u64,
     pub elrange_size: u64,
+    pub edmm_bk_overhead: usize,
 }
 
 #[repr(C)]
@@ -74,12 +75,17 @@ pub struct thread_data_t {
     pub flags: usize,
     pub xsave_size: usize,
     pub last_error: usize,
+    pub aex_mitigation_list: usize,
+    pub aex_notify_flag: usize,
+    pub first_ssa_xsave: usize,
     pub m_next: usize,
     pub tls_addr: usize,
     pub tls_array: usize,
     pub exception_flag: usize,
     pub cxx_thread_info: [usize; 6],
     pub stack_commit_addr: usize,
+    pub aex_notify_entropy_cache: u32,
+    pub aex_notify_entropy_remaining: i32,
 }
 
 #[derive(Copy, Clone)]
@@ -286,6 +292,7 @@ pub struct SgxThreadData {
     stack_guard: usize,
     xsave_size: usize,
     last_error: usize,
+    first_ssa_xsave: usize,
     tls_addr: usize,
     tls_array: usize,
     exception_flag: usize,
@@ -315,6 +322,7 @@ impl SgxThreadData {
             stack_guard: td.stack_guard,
             xsave_size: td.xsave_size,
             last_error: td.last_error,
+            first_ssa_xsave: td.first_ssa_xsave,
             tls_addr: td.tls_addr,
             tls_array: td.tls_array,
             exception_flag: td.exception_flag,
@@ -334,6 +342,7 @@ impl SgxThreadData {
             stack_guard: td.stack_guard,
             xsave_size: td.xsave_size,
             last_error: td.last_error,
+            first_ssa_xsave: td.first_ssa_xsave,
             tls_addr: td.tls_addr,
             tls_array: td.tls_array,
             exception_flag: td.exception_flag,
diff --git a/sgx_trts/src/lib.rs b/sgx_trts/src/lib.rs
index 491fa3d0..0d9df238 100644
--- a/sgx_trts/src/lib.rs
+++ b/sgx_trts/src/lib.rs
@@ -86,6 +86,7 @@ extern crate alloc;
 #[macro_use]
 mod macros;
 
+pub mod aex;
 pub mod ascii;
 pub mod c_str;
 pub mod cpu_feature;
diff --git a/sgx_tseal/src/internal.rs b/sgx_tseal/src/internal.rs
index cdf17a65..4413a011 100644
--- a/sgx_tseal/src/internal.rs
+++ b/sgx_tseal/src/internal.rs
@@ -264,7 +264,6 @@ impl SgxInternalSealedData {
     }
 
     pub fn seal_data(additional_text: &[u8], encrypt_text: &[u8]) -> 
SgxResult<Self> {
-        //let attribute_mask = sgx_attributes_t{flags: SGX_FLAGS_RESERVED | 
SGX_FLAGS_INITTED | SGX_FLAGS_DEBUG, xfrm: 0};
         /* intel sgx sdk 1.8 */
         let attribute_mask = sgx_attributes_t {
             flags: TSEAL_DEFAULT_FLAGSMASK,
diff --git a/sgx_types/src/error.rs b/sgx_types/src/error.rs
index 812b50cf..c644331d 100644
--- a/sgx_types/src/error.rs
+++ b/sgx_types/src/error.rs
@@ -483,6 +483,7 @@ impl_enum! {
         SGX_QL_SUPPLEMENTAL_DATA_VERSION_NOT_SUPPORTED      = 0x0000_E064,
         SGX_QL_ROOT_CA_UNTRUSTED                            = 0x0000_E065,
         SGX_QL_TCB_NOT_SUPPORTED                            = 0x0000_E066,
+        SGX_QL_CONFIG_INVALID_JSON                          = 0x0000_E067,
         SGX_QL_ERROR_MAX                                    = 0x0000_E0FF,
     }
 }
@@ -518,7 +519,7 @@ impl sgx_quote3_error_t {
             sgx_quote3_error_t::SGX_QL_UNSUPPORTED_LOADING_POLICY => {
                 "Unsupported enclave loading policy."
             }
-            sgx_quote3_error_t::SGX_QL_INTERFACE_UNAVAILABLE => "Unable to 
load the QE enclave.",
+            sgx_quote3_error_t::SGX_QL_INTERFACE_UNAVAILABLE => "Unable to 
load the PCE enclave.",
             sgx_quote3_error_t::SGX_QL_PLATFORM_LIB_UNAVAILABLE => {
                 "Unable to find the platform library with the dependent APIs."
             }
@@ -645,6 +646,9 @@ impl sgx_quote3_error_t {
             sgx_quote3_error_t::SGX_QL_TCB_NOT_SUPPORTED => {
                 "Current TCB level cannot be found in platform/enclave TCB 
info"
             }
+            sgx_quote3_error_t::SGX_QL_CONFIG_INVALID_JSON => {
+                "The QPL's config file is in JSON format but has a format 
error"
+            }
             sgx_quote3_error_t::SGX_QL_ERROR_MAX => {
                 "Indicate max error to allow better translation."
             }
@@ -798,6 +802,7 @@ impl sgx_quote3_error_t {
             }
             sgx_quote3_error_t::SGX_QL_ROOT_CA_UNTRUSTED => 
"SGX_QL_ROOT_CA_UNTRUSTED",
             sgx_quote3_error_t::SGX_QL_TCB_NOT_SUPPORTED => 
"SGX_QL_TCB_NOT_SUPPORTED",
+            sgx_quote3_error_t::SGX_QL_CONFIG_INVALID_JSON => 
"SGX_QL_CONFIG_INVALID_JSON",
             sgx_quote3_error_t::SGX_QL_ERROR_MAX => "SGX_QL_ERROR_MAX",
         }
     }
@@ -837,6 +842,8 @@ impl_enum! {
         SGX_QCNL_CACHE_MISSING                  = 0x0000_B031,
         SGX_QCNL_CACHE_EXPIRED                  = 0x0000_B032,
         SGX_QCNL_ROOT_CA_UNTRUSTED              = 0x0000_B033,
+        SGX_QCNL_CONFIG_INVALID_JSON            = 0x0000_B035,
+        SGX_QCNL_CONFIG_NOT_JSON                = 0x0000_B036,
     }
 }
 
@@ -887,6 +894,10 @@ impl sgx_qcnl_error_t {
             sgx_qcnl_error_t::SGX_QCNL_ROOT_CA_UNTRUSTED => {
                 "The certificate used to establish SSL session is untrusted"
             }
+            sgx_qcnl_error_t::SGX_QCNL_CONFIG_INVALID_JSON => {
+                "The config file is in JSON format but has a format error"
+            }
+            sgx_qcnl_error_t::SGX_QCNL_CONFIG_NOT_JSON => "The config file is 
not in JSON format",
         }
     }
 
@@ -930,6 +941,8 @@ impl sgx_qcnl_error_t {
             sgx_qcnl_error_t::SGX_QCNL_CACHE_MISSING => 
"SGX_QCNL_CACHE_MISSING",
             sgx_qcnl_error_t::SGX_QCNL_CACHE_EXPIRED => 
"SGX_QCNL_CACHE_EXPIRED",
             sgx_qcnl_error_t::SGX_QCNL_ROOT_CA_UNTRUSTED => 
"SGX_QCNL_ROOT_CA_UNTRUSTED",
+            sgx_qcnl_error_t::SGX_QCNL_CONFIG_INVALID_JSON => 
"SGX_QCNL_CONFIG_INVALID_JSON",
+            sgx_qcnl_error_t::SGX_QCNL_CONFIG_NOT_JSON => 
"SGX_QCNL_CONFIG_NOT_JSON",
         }
     }
 }
diff --git a/sgx_types/src/function.rs b/sgx_types/src/function.rs
index db6c77c2..3cf6a9b0 100644
--- a/sgx_types/src/function.rs
+++ b/sgx_types/src/function.rs
@@ -688,6 +688,15 @@ extern "C" {
         page_properties_from: int32_t,
         page_properties_to: int32_t,
     ) -> int32_t;
+
+    /* intel sgx sdk 2.20 */
+    pub fn sgx_set_ssa_aexnotify(flags: int32_t) -> sgx_status_t;
+    pub fn sgx_register_aex_handler(
+        aex_node: *mut sgx_aex_mitigation_node_t,
+        handler: sgx_aex_mitigation_fn_t,
+        args: *const c_void,
+    ) -> sgx_status_t;
+    pub fn sgx_unregister_aex_handler(handler: sgx_aex_mitigation_fn_t) -> 
sgx_status_t;
 }
 
 /* intel sgx sdk 2.18 */
@@ -1089,10 +1098,19 @@ extern "C" {
         fmspc: *const uint8_t,
         fmspc_size: uint16_t,
         pck_ra: *const c_char,
-        pp_quote_collateral: *mut *mut tdx_ql_qve_collateral_t,
+        pp_quote_collateral: *mut *mut tdx_ql_qv_collateral_t,
+    ) -> sgx_quote3_error_t;
+    /* intel DCAP 1.17 */
+    pub fn tdx_ql_get_quote_verification_collateral_with_params(
+        fmspc: *const uint8_t,
+        fmspc_size: uint16_t,
+        pck_ra: *const c_char,
+        custom_param: *const c_void,
+        custom_param_length: uint16_t,
+        pp_quote_collateral: *mut *mut tdx_ql_qv_collateral_t,
     ) -> sgx_quote3_error_t;
     pub fn tdx_ql_free_quote_verification_collateral(
-        p_quote_collateral: *const sgx_ql_qve_collateral_t,
+        p_quote_collateral: *const tdx_ql_qv_collateral_t,
     ) -> sgx_quote3_error_t;
     pub fn sgx_ql_get_qve_identity(
         pp_qve_identity: *mut *mut c_char,
@@ -1104,18 +1122,21 @@ extern "C" {
         p_qve_identity: *const c_char,
         p_qve_identity_issuer_chain: *const c_char,
     ) -> sgx_quote3_error_t;
-
-    /* intel DCAP 1.4 */
+    /* intel DCAP 1.14 */
     pub fn sgx_ql_get_root_ca_crl(
         pp_root_ca_crl: *mut *mut uint8_t,
         p_root_ca_crl_size: *mut uint16_t,
     ) -> sgx_quote3_error_t;
     pub fn sgx_ql_free_root_ca_crl(p_root_ca_crl: *const uint8_t) -> 
sgx_quote3_error_t;
-    /* intel DCAP 2.14 */
+    /* intel DCAP 1.14 */
     pub fn sgx_ql_set_logging_callback(
         logger: sgx_ql_logging_callback_t,
         loglevel: sgx_ql_log_level_t,
     ) -> sgx_quote3_error_t;
+    /* intel DCAP 1.17 */
+    pub fn sgx_qpl_clear_cache(cache_type: sgx_qpl_cache_type_t) -> 
sgx_quote3_error_t;
+    pub fn sgx_qpl_global_init() -> sgx_quote3_error_t;
+    pub fn sgx_qpl_global_cleanup() -> sgx_quote3_error_t;
 }
 
 //#[link(name = "sgx_default_qcnl_wrapper")]
@@ -1194,6 +1215,11 @@ extern "C" {
     //     user_token: *const uint8_t,
     //     user_token_size: uint16_t,
     // ) -> sgx_qcnl_error_t;
+
+    /* intel DCAP 1.17 */
+    pub fn sgx_qcnl_clear_cache(cache_type: uint32_t) -> sgx_qcnl_error_t;
+    pub fn sgx_qcnl_global_init() -> sgx_qcnl_error_t;
+    pub fn sgx_qcnl_global_cleanup() -> sgx_qcnl_error_t;
 }
 
 //#[link(name = "dcap_quoteverify")]
@@ -1246,7 +1272,7 @@ extern "C" {
     pub fn tdx_qv_verify_quote(
         p_quote: *const uint8_t,
         quote_size: uint32_t,
-        p_quote_collateral: *const tdx_ql_qve_collateral_t,
+        p_quote_collateral: *const tdx_ql_qv_collateral_t,
         expiration_check_date: time_t,
         p_collateral_expiration_status: *mut uint32_t,
         p_quote_verification_result: *mut sgx_ql_qv_result_t,
diff --git a/sgx_types/src/marker.rs b/sgx_types/src/marker.rs
index 118b09c7..b736b467 100644
--- a/sgx_types/src/marker.rs
+++ b/sgx_types/src/marker.rs
@@ -73,6 +73,7 @@ impl_marker_for_array! {BytewiseEquality,
 /// a contiguous area of memory inside the enclave. Developer needs to
 /// implement this trait as a marker for the data structure he/she wants
 /// to feed into SGX apis.
+#[allow(clippy::missing_safety_doc)]
 pub unsafe trait ContiguousMemory {}
 
 impl_unsafe_marker_for!(ContiguousMemory,
diff --git a/sgx_types/src/types.rs b/sgx_types/src/types.rs
index decd4a05..b432fb41 100644
--- a/sgx_types/src/types.rs
+++ b/sgx_types/src/types.rs
@@ -32,6 +32,7 @@ pub const SGX_FLAGS_MODE64BIT: uint64_t = 
0x0000_0000_0000_0004; //If set, then
 pub const SGX_FLAGS_PROVISION_KEY: uint64_t = 0x0000_0000_0000_0010; //If set, 
then the enclave has access to provision key
 pub const SGX_FLAGS_EINITTOKEN_KEY: uint64_t = 0x0000_0000_0000_0020; //If 
set, then the enclave has access to EINITTOKEN key
 pub const SGX_FLAGS_KSS: uint64_t = 0x0000_0000_0000_0080; //If set enclave 
uses KSS
+pub const SGX_FLAGS_AEX_NOTIFY: uint64_t = 0x0000_0000_0000_0400; //If set, 
then the enclave enables AEX Notify
 pub const SGX_FLAGS_RESERVED: uint64_t = !(SGX_FLAGS_INITTED
     | SGX_FLAGS_DEBUG
     | SGX_FLAGS_MODE64BIT
@@ -1057,17 +1058,56 @@ impl_struct! {
     }
 }
 
-impl_struct! {
-    pub struct sgx_exception_info_t {
-        pub cpu_context: sgx_cpu_context_t,
-        pub exception_vector: sgx_exception_vector_t,
-        pub exception_type: sgx_exception_type_t,
-        pub exinfo: sgx_misc_exinfo_t,
+cfg_if! {
+    if #[cfg(target_arch = "x86")] {
+        #[repr(C, align(64))]
+        pub struct sgx_exception_info_t {
+            pub cpu_context: sgx_cpu_context_t,
+            pub exception_vector: sgx_exception_vector_t,
+            pub exception_type: sgx_exception_type_t,
+            pub exinfo: sgx_misc_exinfo_t,
+            pub exception_valid: uint32_t,
+            pub do_aex_mitigation: uint32_t,
+            pub xsave_size: uint64_t,
+            pub reserved: [uint64_t; 6],
+            pub xsave_area: [uint8_t; 0],
+        }
+    } else {
+        #[repr(C, align(64))]
+        pub struct sgx_exception_info_t {
+            pub cpu_context: sgx_cpu_context_t,
+            pub exception_vector: sgx_exception_vector_t,
+            pub exception_type: sgx_exception_type_t,
+            pub exinfo: sgx_misc_exinfo_t,
+            pub exception_valid: uint32_t,
+            pub do_aex_mitigation: uint32_t,
+            pub xsave_size: uint64_t,
+            pub reserved: [uint64_t; 1],
+            pub xsave_area: [uint8_t; 0],
+        }
     }
 }
 
+impl_struct_ContiguousMemory! {
+    sgx_exception_info_t;
+}
+
 pub type sgx_exception_handler_t = extern "C" fn(info: *mut 
sgx_exception_info_t) -> int32_t;
 
+/* intel sgx sdk 2.20 */
+//
+// sgx_trts_aex.h
+//
+#[repr(C)]
+pub struct sgx_aex_mitigation_node_t {
+    pub handler: sgx_aex_mitigation_fn_t,
+    pub args: *const c_void,
+    pub next: *mut sgx_aex_mitigation_node_t,
+}
+
+pub type sgx_aex_mitigation_fn_t =
+    extern "C" fn(info: *mut sgx_exception_info_t, args: *const c_void) -> 
c_void;
+
 //
 // sgx_tseal.h
 //
@@ -1398,7 +1438,10 @@ pub struct sgx_ql_qve_collateral_t {
     pub qe_identity_size: uint32_t,
 }
 
+/* intel DCAP 1.17 */
+// Deprecate structure name tdx_ql_qve_collateral_t
 pub type tdx_ql_qve_collateral_t = sgx_ql_qve_collateral_t;
+pub type tdx_ql_qv_collateral_t = sgx_ql_qve_collateral_t;
 
 impl_enum! {
     #[repr(u8)]
@@ -1409,6 +1452,17 @@ impl_enum! {
     }
 }
 
+/* intel DCAP 1.17 */
+impl_enum! {
+    #[repr(u32)]
+    #[derive(Copy, Clone, PartialEq, Eq, Debug)]
+    pub enum sgx_qpl_cache_type_t {
+        SGX_QPL_CACHE_CERTIFICATE   = 1,
+        SGX_QPL_CACHE_QV_COLLATERAL = 2,
+        SGX_QPL_CACHE_MULTICERTS    = 4,
+    }
+}
+
 /* intel DCAP 1.11 */
 impl_enum! {
     #[repr(u32)]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to