@@ -37,14 +37,23 @@ pub unsafe fn do_usercall(
3737 ( a, b)
3838}
3939
40- type Register = u64 ;
40+ /// A value passed or returned in a CPU register.
41+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
42+ pub type Register = u64 ;
4143
42- trait RegisterArgument {
44+ /// Translate a type from/to Register to be used as an argument.
45+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
46+ pub trait RegisterArgument {
47+ /// Translate a Register to Self.
4348 fn from_register ( _: Register ) -> Self ;
49+ /// Translate self to a Register.
4450 fn into_register ( self ) -> Register ;
4551}
4652
47- trait ReturnValue {
53+ /// Translate a pair of Registers to the raw usercall return value.
54+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
55+ pub trait ReturnValue {
56+ /// Translate a pair of Registers to the raw usercall return value.
4857 fn from_registers ( call : & ' static str , regs : ( Register , Register ) ) -> Self ;
4958}
5059
@@ -68,6 +77,7 @@ macro_rules! define_usercalls {
6877
6978macro_rules! define_ra {
7079 ( < $i: ident > $t: ty) => {
80+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
7181 impl <$i> RegisterArgument for $t {
7282 fn from_register( a: Register ) -> Self {
7383 a as _
@@ -78,6 +88,7 @@ macro_rules! define_ra {
7888 }
7989 } ;
8090 ( $i: ty as $t: ty) => {
91+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
8192 impl RegisterArgument for $t {
8293 fn from_register( a: Register ) -> Self {
8394 a as $i as _
@@ -88,6 +99,7 @@ macro_rules! define_ra {
8899 }
89100 } ;
90101 ( $t: ty) => {
102+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
91103 impl RegisterArgument for $t {
92104 fn from_register( a: Register ) -> Self {
93105 a as _
@@ -112,6 +124,7 @@ define_ra!(usize as isize);
112124define_ra ! ( <T > * const T ) ;
113125define_ra ! ( <T > * mut T ) ;
114126
127+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
115128impl RegisterArgument for bool {
116129 fn from_register ( a : Register ) -> bool {
117130 if a != 0 { true } else { false }
@@ -121,6 +134,7 @@ impl RegisterArgument for bool {
121134 }
122135}
123136
137+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
124138impl < T : RegisterArgument > RegisterArgument for Option < NonNull < T > > {
125139 fn from_register ( a : Register ) -> Option < NonNull < T > > {
126140 NonNull :: new ( a as _ )
@@ -130,12 +144,14 @@ impl<T: RegisterArgument> RegisterArgument for Option<NonNull<T>> {
130144 }
131145}
132146
147+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
133148impl ReturnValue for ! {
134149 fn from_registers ( call : & ' static str , _regs : ( Register , Register ) ) -> Self {
135150 rtabort ! ( "Usercall {call}: did not expect to be re-entered" ) ;
136151 }
137152}
138153
154+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
139155impl ReturnValue for ( ) {
140156 fn from_registers ( call : & ' static str , usercall_retval : ( Register , Register ) ) -> Self {
141157 rtassert ! ( usercall_retval. 0 == 0 ) ;
@@ -144,13 +160,15 @@ impl ReturnValue for () {
144160 }
145161}
146162
163+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
147164impl < T : RegisterArgument > ReturnValue for T {
148165 fn from_registers ( call : & ' static str , usercall_retval : ( Register , Register ) ) -> Self {
149166 rtassert ! ( usercall_retval. 1 == 0 ) ;
150167 T :: from_register ( usercall_retval. 0 )
151168 }
152169}
153170
171+ #[ unstable( feature = "sgx_platform" , issue = "56975" ) ]
154172impl < T : RegisterArgument , U : RegisterArgument > ReturnValue for ( T , U ) {
155173 fn from_registers ( _call : & ' static str , regs : ( Register , Register ) ) -> Self {
156174 ( T :: from_register ( regs. 0 ) , U :: from_register ( regs. 1 ) )
0 commit comments