diff options
author | Olga Makhotina <olga.makhotina@intel.com> | 2018-03-15 15:46:38 +0000 |
---|---|---|
committer | Igor Tsimbalist <itsimbal@gcc.gnu.org> | 2018-03-15 16:46:38 +0100 |
commit | e7297be9c04d1d44b72a6db2609e99b08fd63ac7 (patch) | |
tree | b1710e1a52c625923a8222161cb029e9e44e470e /gcc/config | |
parent | e333a522bb5f686c9536fd95af8da33fce333d43 (diff) | |
download | gcc-e7297be9c04d1d44b72a6db2609e99b08fd63ac7.zip gcc-e7297be9c04d1d44b72a6db2609e99b08fd63ac7.tar.gz gcc-e7297be9c04d1d44b72a6db2609e99b08fd63ac7.tar.bz2 |
Enable Intel ENCLV support.
2018-03-15 Olga Makhotina <olga.makhotina@intel.com>
gcc/
* config/i386/sgxintrin.h (_enclv_u32): New intrinsic.
(__enclv_bc, __enclv_cd, __enclv_generic): New definitions.
(ERDINFO, ETRACKC, ELDBC, ELDUC): New leaves.
gcc/testsuite/
* gcc.target/i386/sgx.c (_enclv_u32): Test new intrinsic.
From-SVN: r258560
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/i386/sgxintrin.h | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/gcc/config/i386/sgxintrin.h b/gcc/config/i386/sgxintrin.h index dee9be8..dd3f9cf 100644 --- a/gcc/config/i386/sgxintrin.h +++ b/gcc/config/i386/sgxintrin.h @@ -89,10 +89,27 @@ : "a" (leaf), "b" (b), "c" (c), "d" (d) \ : "cc") +#define __enclv_bc(leaf, b, c, retval) \ + __asm__ __volatile__("enclv\n\t" \ + : "=a" (retval) \ + : "a" (leaf), "b" (b), "c" (c) \ + : "cc") + +#define __enclv_cd(leaf, c, d, retval) \ + __asm__ __volatile__("enclv\n\t" \ + : "=a" (retval) \ + : "a" (leaf), "c" (c), "d" (d) \ + : "cc") -extern __inline int +#define __enclv_generic(leaf, b, c, d, retval) \ + __asm__ __volatile__("enclv\n\t" \ + : "=a" (retval), "=b" (b), "=c" (b), "=d" (d)\ + : "a" (leaf), "b" (b), "c" (c), "d" (d) \ + : "cc") + +extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -_encls_u32 (const int __L, size_t __D[]) +_encls_u32 (const unsigned int __L, size_t __D[]) { enum __encls_type { @@ -111,10 +128,14 @@ _encls_u32 (const int __L, size_t __D[]) __SGX_ETRACK = 0x0C, __SGX_EAUG = 0x0D, __SGX_EMODPR = 0x0E, - __SGX_EMODT = 0x0F + __SGX_EMODT = 0x0F, + __SGX_ERDINFO = 0x10, + __SGX_ETRACKC = 0x11, + __SGX_ELDBC = 0x12, + __SGX_ELDUC = 0x13 }; enum __encls_type __T = (enum __encls_type)__L; - int __R = 0; + unsigned int __R = 0; if (!__builtin_constant_p (__T)) __encls_generic (__L, __D[0], __D[1], __D[2], __R); else switch (__T) @@ -127,31 +148,35 @@ _encls_u32 (const int __L, size_t __D[]) case __SGX_EMODPR: case __SGX_EMODT: case __SGX_EAUG: + case __SGX_ERDINFO: __encls_bc (__L, __D[0], __D[1], __R); break; case __SGX_EINIT: case __SGX_ELDB: case __SGX_ELDU: case __SGX_EWB: + case __SGX_ELDBC: + case __SGX_ELDUC: __encls_bcd (__L, __D[0], __D[1], __D[2], __R); break; case __SGX_EREMOVE: case __SGX_EBLOCK: case __SGX_ETRACK: + case __SGX_ETRACKC: __encls_c (__L, __D[1], __R); break; case __SGX_EDBGRD: __encls_edbgrd (__L, __D[0], __D[1], __R); break; default: - return -1; + __encls_generic (__L, __D[0], __D[1], __D[2], __R); } return __R; } -extern __inline int +extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -_enclu_u32 (const int __L, size_t __D[]) +_enclu_u32 (const unsigned int __L, size_t __D[]) { enum __enclu_type { @@ -165,7 +190,7 @@ _enclu_u32 (const int __L, size_t __D[]) __SGX_EACCEPTCOPY = 0x07 }; enum __enclu_type __T = (enum __enclu_type) __L; - int __R = 0; + unsigned int __R = 0; if (!__builtin_constant_p (__T)) __enclu_generic (__L, __D[0], __D[1], __D[2], __R); else switch (__T) @@ -187,7 +212,35 @@ _enclu_u32 (const int __L, size_t __D[]) __enclu_eexit (__L, __D[0], __D[1], __R); break; default: - return -1; + __enclu_generic (__L, __D[0], __D[1], __D[2], __R); + } + return __R; +} + +extern __inline unsigned int +__attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_enclv_u32 (const unsigned int __L, size_t __D[]) +{ + enum __enclv_type + { + __SGX_EDECVIRTCHILD = 0x00, + __SGX_EINCVIRTCHILD = 0x01, + __SGX_ESETCONTEXT = 0x02 + }; + unsigned int __R = 0; + if (!__builtin_constant_p (__L)) + __enclv_generic (__L, __D[0], __D[1], __D[2], __R); + else switch (__L) + { + case __SGX_EDECVIRTCHILD: + case __SGX_EINCVIRTCHILD: + __enclv_bc (__L, __D[0], __D[1], __R); + break; + case __SGX_ESETCONTEXT: + __enclv_cd (__L, __D[1], __D[2], __R); + break; + default: + __enclv_generic (__L, __D[0], __D[1], __D[2], __R); } return __R; } |