sgxintrin.h revision 1.1.1.1
1#ifndef _SGXINTRIN_H_INCLUDED
2#define _SGXINTRIN_H_INCLUDED
3
4#ifndef __SGX__
5#pragma GCC push_options
6#pragma GCC target("sgx")
7#define __DISABLE_SGX__
8#endif /* __SGX__ */
9
10#define __encls_bc(leaf, b, c, retval)	    	 	\
11  __asm__ __volatile__ ("encls\n\t"		     	\
12	   : "=a" (retval)			     	\
13	   : "a" (leaf), "b" (b), "c" (c)		\
14	   : "cc")
15
16#define __encls_bcd(leaf, b, c, d, retval)	     	\
17  __asm__ __volatile__("encls\n\t"		     	\
18	   : "=a" (retval)			     	\
19	   : "a" (leaf), "b" (b), "c" (c), "d" (d)	\
20	   : "cc")
21
22#define __encls_c(leaf, c, retval)		     	\
23  __asm__ __volatile__("encls\n\t"		     	\
24	   : "=a" (retval)			     	\
25	   : "a" (leaf), "c" (c)			\
26	   : "cc")
27
28#define __encls_edbgrd(leaf, b, c, retval)	     	\
29  __asm__ __volatile__("encls\n\t"		     	\
30	   : "=a" (retval), "=b" (b)		     	\
31	   : "a" (leaf), "c" (c))
32
33#define __encls_generic(leaf, b, c, d, retval)   	\
34  __asm__ __volatile__("encls\n\t"		     	\
35	   : "=a" (retval), "=b" (b), "=c" (c), "=d" (d)\
36	   : "a" (leaf), "b" (b), "c" (c), "d" (d)	\
37	   : "cc")
38
39#define __enclu_bc(leaf, b, c, retval)			\
40  __asm__ __volatile__("enclu\n\t"			\
41	   : "=a" (retval)				\
42	   : "a" (leaf), "b" (b), "c" (c)		\
43	   : "cc")
44
45#define __enclu_bcd(leaf, b, c, d, retval)		\
46  __asm__ __volatile__("enclu\n\t"			\
47	   : "=a" (retval)				\
48	   : "a" (leaf), "b" (b), "c" (c), "d" (d)	\
49	   : "cc")
50
51#define __enclu_eenter(leaf, b, c, retval)		\
52  __asm__  __volatile__("enclu\n\t"			\
53	   : "=a" (retval), "=c" (c)			\
54	   : "a" (leaf), "b" (b), "c" (c)		\
55	   : "cc")
56
57#define __enclu_eexit(leaf, b, c, retval)		\
58  __asm__  __volatile__("enclu\n\t"			\
59	   : "=a" (retval), "=c" (c)			\
60	   : "a" (leaf), "b" (b)			\
61	   : "cc")
62
63#define __enclu_generic(leaf, b, c, d, retval)		\
64  __asm__ __volatile__("enclu\n\t"			\
65	   : "=a" (retval), "=b" (b), "=c" (c), "=d" (d)\
66	   : "a" (leaf), "b" (b), "c" (c), "d" (d)	\
67	   : "cc")
68
69
70extern __inline int
71__attribute__((__gnu_inline__, __always_inline__, __artificial__))
72_encls_u32 (const int __L, size_t __D[])
73{
74  enum __encls_type
75  {
76    __SGX_ECREATE = 0x00,
77    __SGX_EADD    = 0x01,
78    __SGX_EINIT   = 0x02,
79    __SGX_EREMOVE = 0x03,
80    __SGX_EDBGRD  = 0x04,
81    __SGX_EDBGWR  = 0x05,
82    __SGX_EEXTEND = 0x06,
83    __SGX_ELDB    = 0x07,
84    __SGX_ELDU    = 0x08,
85    __SGX_EBLOCK  = 0x09,
86    __SGX_EPA     = 0x0A,
87    __SGX_EWB     = 0x0B,
88    __SGX_ETRACK  = 0x0C,
89    __SGX_EAUG    = 0x0D,
90    __SGX_EMODPR  = 0x0E,
91    __SGX_EMODT   = 0x0F
92  };
93  enum __encls_type __T = (enum __encls_type)__L;
94  int __R = 0;
95  if (!__builtin_constant_p (__T))
96    __encls_generic (__L, __D[0], __D[1], __D[2], __R);
97  else switch (__T)
98    {
99    case __SGX_ECREATE:
100    case __SGX_EADD:
101    case __SGX_EDBGWR:
102    case __SGX_EEXTEND:
103    case __SGX_EPA:
104    case __SGX_EMODPR:
105    case __SGX_EMODT:
106    case __SGX_EAUG:
107      __encls_bc (__L, __D[0], __D[1], __R);
108      break;
109    case __SGX_EINIT:
110    case __SGX_ELDB:
111    case __SGX_ELDU:
112    case __SGX_EWB:
113      __encls_bcd (__L, __D[0], __D[1], __D[2], __R);
114      break;
115    case __SGX_EREMOVE:
116    case __SGX_EBLOCK:
117    case __SGX_ETRACK:
118      __encls_c (__L, __D[1], __R);
119      break;
120    case __SGX_EDBGRD:
121      __encls_edbgrd (__L, __D[0], __D[1], __R);
122      break;
123    default:
124      return -1;
125    }
126  return __R;
127}
128
129extern __inline int
130__attribute__((__gnu_inline__, __always_inline__, __artificial__))
131_enclu_u32 (const int __L, size_t __D[])
132{
133  enum __enclu_type
134  {
135    __SGX_EREPORT     = 0x00,
136    __SGX_EGETKEY     = 0x01,
137    __SGX_EENTER      = 0x02,
138    __SGX_ERESUME     = 0x03,
139    __SGX_EEXIT       = 0x04,
140    __SGX_EACCEPT     = 0x05,
141    __SGX_EMODPE      = 0x06,
142    __SGX_EACCEPTCOPY = 0x07
143  };
144  enum __enclu_type __T = (enum __enclu_type) __L;
145  int __R = 0;
146  if (!__builtin_constant_p (__T))
147    __enclu_generic (__L, __D[0], __D[1], __D[2], __R);
148  else switch (__T)
149    {
150    case __SGX_EREPORT:
151    case __SGX_EACCEPTCOPY:
152      __enclu_bcd (__L, __D[0], __D[1], __D[2], __R);
153      break;
154    case __SGX_EGETKEY:
155    case __SGX_ERESUME:
156    case __SGX_EACCEPT:
157    case __SGX_EMODPE:
158      __enclu_bc (__L, __D[0], __D[1], __R);
159      break;
160    case __SGX_EENTER:
161      __enclu_eenter (__L, __D[0], __D[1], __R);
162      break;
163    case __SGX_EEXIT:
164      __enclu_eexit (__L, __D[0], __D[1], __R);
165      break;
166    default:
167      return -1;
168    }
169  return __R;
170}
171
172#ifdef __DISABLE_SGX__
173#undef __DISABLE_SGX__
174#pragma GCC pop_options
175#endif /* __DISABLE_SGX__ */
176
177#endif /* _SGXINTRIN_H_INCLUDED */
178