@@ -2,8 +2,12 @@ use cpuarch::vmsa::VMSA;
2
2
use igvm_defs:: PAGE_SIZE_4K ;
3
3
use core:: ffi:: CStr ;
4
4
use core:: str;
5
+ <<<<<<< HEAD
5
6
use crate :: { address:: VirtAddr , cpu:: { cpuid:: { cpuid_table_raw , CpuidResult } , percpu:: { this_cpu , this_cpu_unsafe } } , map_paddr , mm:: { PerCPUPageMappingGuard , PAGE_SIZE } , paddr_as_slice , process_manager:: { process:: { ProcessID , TrustedProcess , PROCESS_STORE } , process_memory:: allocate_page , process_paging:: { GraminePalProtFlags , ProcessPageFlags , ProcessPageTableRef } } , protocols:: { errors:: SvsmReqError , RequestParams } } ;
6
7
use crate :: process_manager:: process_paging:: TP_LIBOS_START_VADDR ;
8
+ =======
9
+ use crate :: { address:: VirtAddr , cpu:: { cpuid:: { cpuid_table_raw , CpuidResult } , percpu:: { this_cpu , this_cpu_unsafe } } , map_paddr , mm:: { PerCPUPageMappingGuard , PAGE_SIZE } , paddr_as_slice , process_manager:: { process:: { ProcessID , TrustedProcess , PROCESS_STORE } , process_memory:: allocate_page , process_paging:: { ProcessPageFlags , ProcessPageTableRef } } , protocols:: { errors:: SvsmReqError , RequestParams } , vaddr_as_u64_slice } ;
10
+ >>>>>>> 145 f83e ( Add result call for Trustlet )
7
11
8
12
use crate :: vaddr_as_slice ;
9
13
use crate :: types:: PageSize ;
@@ -24,6 +28,7 @@ pub trait ProcessRuntime {
24
28
fn pal_svsm_print_info ( & mut self ) -> bool ;
25
29
fn pal_svsm_set_tcb ( & mut self ) -> bool ;
26
30
fn pal_svsm_cpuid ( & mut self ) -> bool ;
31
+ fn pal_svsm_get_result ( & mut self ) -> bool ;
27
32
}
28
33
29
34
#[ derive( Debug ) ]
@@ -32,20 +37,31 @@ pub struct PALContext {
32
37
vmsa : & ' static mut VMSA ,
33
38
string_buf : [ u8 ; 256 ] ,
34
39
string_pos : usize ,
40
+ result_addr : u64 ,
41
+ result_size : u64 ,
42
+ guest_page_table : u64 ,
43
+ return_value : u64 ,
35
44
}
36
45
37
46
pub fn invoke_trustlet ( params : & mut RequestParams ) -> Result < ( ) , SvsmReqError > {
38
47
39
48
log:: info!( "Invoking Trustlet" ) ;
40
49
41
50
let id = params. rcx ;
42
- let function_arg = params. r8 ;
43
- let function_arg_size = params. r9 ;
51
+ let guest_data = params. r8 ;
52
+ let guest_data_size = params. r9 ;
44
53
let guest_page_table = params. rdx ;
54
+ let ( invoke_data, range) = ProcessPageTableRef :: copy_data_from_guest ( guest_data, guest_data_size, guest_page_table) ;
55
+ let invoke_data_struct = vaddr_as_u64_slice ! ( invoke_data) ;
45
56
46
- let trustlet = PROCESS_STORE . get ( ProcessID ( id. try_into ( ) . unwrap ( ) ) ) ;
57
+ let function_arg = invoke_data_struct[ 0 ] ;
58
+ let function_arg_size = invoke_data_struct[ 2 ] ;
59
+
60
+ let result_addr = invoke_data_struct[ 1 ] ;
61
+ let result_size = invoke_data_struct[ 3 ] ;
47
62
48
- //log::info!("{:?}", trustlet);
63
+
64
+ let trustlet = PROCESS_STORE . get ( ProcessID ( id. try_into ( ) . unwrap ( ) ) ) ;
49
65
50
66
// Getting the current processes VMSA
51
67
let vmsa_paddr = trustlet. context . vmsa ;
@@ -62,9 +78,13 @@ pub fn invoke_trustlet(params: &mut RequestParams) -> Result<(), SvsmReqError> {
62
78
63
79
let mut rc = PALContext {
64
80
process : trustlet,
65
- vmsa : vmsa,
66
- string_buf : string_buf,
67
- string_pos : string_pos,
81
+ vmsa,
82
+ string_buf,
83
+ string_pos,
84
+ result_addr,
85
+ result_size,
86
+ guest_page_table,
87
+ return_value : 1 ,
68
88
} ;
69
89
70
90
// Execution loop of the trustlet
@@ -78,6 +98,12 @@ pub fn invoke_trustlet(params: &mut RequestParams) -> Result<(), SvsmReqError> {
78
98
break ;
79
99
}
80
100
}
101
+ <<<<<<< HEAD
102
+ =======
103
+
104
+ params. rcx = rc. return_value ;
105
+
106
+ >>>>>>> 145 f83e ( Add result call for Trustlet )
81
107
Ok ( ( ) )
82
108
}
83
109
@@ -126,6 +152,9 @@ impl ProcessRuntime for PALContext {
126
152
0x4FFFFFF9 => {
127
153
return self . pal_svsm_mprotect ( ) ;
128
154
}
155
+ 0x4FFFFFF8 => {
156
+ return self . pal_svsm_get_result ( ) ;
157
+ }
129
158
99 => {
130
159
let c = vmsa. rbx ;
131
160
log:: info!( "{}" , c) ;
@@ -159,7 +188,6 @@ impl ProcessRuntime for PALContext {
159
188
/// * rdx: edx value of the cpuid result
160
189
fn pal_svsm_cpuid ( & mut self ) -> bool {
161
190
let eax = self . vmsa . rax as u32 ;
162
- log:: info!( "eax value: {:#x}" , eax) ;
163
191
let eax_tmp = self . vmsa . rax ;
164
192
let ecx_tmp = self . vmsa . rcx ;
165
193
// Some cpuid leafs have subleaf (ecx) and some don't
@@ -183,16 +211,26 @@ impl ProcessRuntime for PALContext {
183
211
self . vmsa . rbx = res. ebx as u64 ;
184
212
self . vmsa . rcx = res. ecx as u64 ;
185
213
self . vmsa . rdx = res. edx as u64 ;
186
- log:: info!( "Returned CPUID({:#x}/{:#x}) as the following: {:#x} {:#x} {:#x} {:#x}" ,
187
- eax_tmp,
188
- ecx_tmp,
189
- res. eax,
190
- res. ebx,
191
- res. ecx,
192
- res. edx) ;
193
214
return true ;
194
215
}
195
216
217
+ /// Inidicated that results are ready
218
+ ///
219
+ /// Return:
220
+ /// Sets the trustlet return value to 0
221
+ /// Copies the reuslts into the provided buffer
222
+ fn pal_svsm_get_result ( & mut self ) -> bool {
223
+ self . process . context . channel . copy_out (
224
+ self . result_addr ,
225
+ self . guest_page_table ,
226
+ self . result_size as usize ) ;
227
+ self . return_value = 0 ;
228
+ false
229
+ }
230
+
231
+
232
+
233
+
196
234
/// Allocate virtual memory in the trustlet's page table
197
235
///
198
236
/// Register arguments:
0 commit comments