From e7297be9c04d1d44b72a6db2609e99b08fd63ac7 Mon Sep 17 00:00:00 2001 From: Olga Makhotina Date: Thu, 15 Mar 2018 15:46:38 +0000 Subject: [PATCH] Enable Intel ENCLV support. 2018-03-15 Olga Makhotina 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 --- gcc/ChangeLog | 6 +++ gcc/config/i386/sgxintrin.h | 71 +++++++++++++++++++++++++---- gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/gcc.target/i386/sgx.c | 17 +++++-- 4 files changed, 84 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 41b4d70f0d9..0bf5b43655b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-03-15 Olga Makhotina + + * config/i386/sgxintrin.h (_enclv_u32): New intrinsic. + (__enclv_bc, __enclv_cd, __enclv_generic): New definitions. + (ERDINFO, ETRACKC, ELDBC, ELDUC): New leaves. + 2018-03-15 David Malcolm PR c/84852 diff --git a/gcc/config/i386/sgxintrin.h b/gcc/config/i386/sgxintrin.h index dee9be81515..dd3f9cfcb68 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 77d090a9880..02ca79ffded 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-03-15 Olga Makhotina + + * gcc.target/i386/sgx.c (_enclv_u32): Test new intrinsic. + 2018-03-15 Richard Biener PR c/84873 diff --git a/gcc/testsuite/gcc.target/i386/sgx.c b/gcc/testsuite/gcc.target/i386/sgx.c index 42ad1fc8e66..9f3ab670d47 100644 --- a/gcc/testsuite/gcc.target/i386/sgx.c +++ b/gcc/testsuite/gcc.target/i386/sgx.c @@ -2,13 +2,15 @@ /* { dg-options "-O2 -msgx" } */ /* { dg-final { scan-assembler-times "enclu" 2 } } */ /* { dg-final { scan-assembler-times "encls" 2 } } */ +/* { dg-final { scan-assembler-times "enclv" 2 } } */ #include -extern int leaf; +extern unsigned int leaf; #define SGX_EENTER 0x02 #define SGX_EBLOCK 0x09 +#define SGX_EINCVIRTCHILD 0x01 int foo () { @@ -16,9 +18,14 @@ int foo () test[0] = 4; test[1] = 5; test[2] = 6; - int res1 = _encls_u32 (leaf, test); - int res2 = _enclu_u32 (leaf, test); - int res3 = _encls_u32 (SGX_EBLOCK, test); - int res4 = _enclu_u32 (SGX_EENTER, test); + + unsigned int res1 = _encls_u32 (leaf, test); + unsigned int res2 = _enclu_u32 (leaf, test); + unsigned int res5 = _enclv_u32 (leaf, test); + + unsigned int res3 = _encls_u32 (SGX_EBLOCK, test); + unsigned int res4 = _enclu_u32 (SGX_EENTER, test); + unsigned int res6 = _enclv_u32 (SGX_EINCVIRTCHILD, test); + return 0; } -- 2.30.2