Skip to content

Commit f82b24c

Browse files
committed
Add result call for Trustlet
Stops the Trustlet execution AllocationRanges now flush the tlb
1 parent f4e6e95 commit f82b24c

File tree

4 files changed

+87
-29
lines changed

4 files changed

+87
-29
lines changed

kernel/src/process_manager/allocation.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::cpu::flush_tlb_global;
12
use crate::process_manager::process_memory::allocate_page;
23
use crate::mm::PAGE_SIZE;
34
use crate::address::{Address, VirtAddr};
@@ -63,6 +64,7 @@ impl AllocationRange {
6364
self.0 = pgd[offset];
6465
self.1 = pages;
6566
}
67+
flush_tlb_global();
6668
}
6769

6870
pub fn inflate(&mut self, page_table_ref: &mut ProcessPageTableRef, pages: u64, start_addr: u64) {
@@ -83,6 +85,7 @@ impl AllocationRange {
8385
pub fn mount(&self) {
8486
let (_mapping, pgd) = paddr_as_slice!(read_cr3());
8587
pgd[DEFAULT_ALLOCATION_RANGE_MOUNT] = self.0;
88+
flush_tlb_global();
8689
}
8790

8891
pub fn mount_at(&self, loc: usize) -> u64 {

kernel/src/process_manager/memory_channels.rs

+4-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use log::Metadata;
22

3-
use crate::{address::{PhysAddr, VirtAddr}, map_paddr, mm::{PerCPUPageMappingGuard, PAGE_SIZE}, paddr_as_slice, process_manager::process_memory::ALLOCATION_RANGE_VIRT_START, vaddr_as_slice};
3+
use crate::{address::{PhysAddr, VirtAddr}, cpu::flush_tlb_global, map_paddr, mm::{PerCPUPageMappingGuard, PAGE_SIZE}, paddr_as_slice, process_manager::process_memory::ALLOCATION_RANGE_VIRT_START, vaddr_as_slice};
44

55
use super::{allocation::AllocationRange, process::ProcessID, process_paging::ProcessPageTableRef};
66

@@ -37,28 +37,19 @@ impl MemoryChannel {
3737
}
3838

3939
pub fn copy_into(&mut self, source_addr: u64, page_table: u64, size: usize) {
40-
let copy_size = size + PAGE_SIZE - (size % PAGE_SIZE);
41-
let copy_page_count = copy_size / PAGE_SIZE;
4240
let target = VirtAddr::from(ALLOCATION_RANGE_VIRT_START);
43-
let mut page_table_ref = ProcessPageTableRef::default();
44-
page_table_ref.set_external_table(page_table);
45-
4641
self.input.mount();
4742
ProcessPageTableRef::copy_data_from_guest_to(source_addr, size as u64, page_table, ALLOCATION_RANGE_VIRT_START);
4843
}
4944

5045
pub fn copy_out(&mut self, target_addr: u64, page_table: u64, size: usize) {
5146
let copy_size = size + PAGE_SIZE - (size % PAGE_SIZE);
52-
let copy_page_count = copy_size / PAGE_SIZE;
53-
let target = VirtAddr::from(ALLOCATION_RANGE_VIRT_START);
54-
let mut page_table_ref = ProcessPageTableRef::default();
55-
page_table_ref.set_external_table(page_table);
56-
47+
let source = VirtAddr::from(ALLOCATION_RANGE_VIRT_START);
5748
self.output.mount();
58-
59-
page_table_ref.copy_address_range(VirtAddr::from(target), copy_size as u64, VirtAddr::from(target_addr));
49+
ProcessPageTableRef::copy_data_to_guest(target_addr, copy_size as u64, page_table);
6050
}
6151

52+
6253
fn allocate_range(&mut self, page_table_ref: &mut ProcessPageTableRef, size: usize, start: u64) -> AllocationRange{
6354
let mut r = AllocationRange::default();
6455
let page_count = (size + PAGE_SIZE - (size % PAGE_SIZE)) / PAGE_SIZE;

kernel/src/process_manager/process_paging.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,23 @@ impl ProcessPageTableRef {
356356
}
357357
}
358358

359+
pub fn copy_address_range_to_guest(&self, dst: VirtAddr, size: u64, source: VirtAddr) {
360+
let copy_page_count = size / PAGE_SIZE_4K;
361+
for i in 0..copy_page_count {
362+
let dst_phys = self.get_page(dst + 4096usize * (i as usize));
363+
if dst_phys == PhysAddr::null() {
364+
break;
365+
}
366+
let (_mapping,dst_slice) = paddr_as_slice!(dst_phys);
367+
368+
let source_vaddr = source + 4096usize * (i as usize);
369+
let source_slice = vaddr_as_slice!(source_vaddr);
370+
_ = replace(dst_slice, *source_slice);
371+
}
372+
373+
}
374+
375+
359376
pub fn get_page(&self, addr: VirtAddr) -> PhysAddr{
360377
//Mapping the page table into Memory and get the next layer based on the address
361378
let (_pgd_mapping, pgd_table) = paddr_as_table!(self.process_page_table);
@@ -506,14 +523,23 @@ impl ProcessPageTableRef {
506523

507524
pub fn copy_data_from_guest_to(addr: u64, size: u64, page_table: u64, dst: u64) {
508525
let copy_size = size + (PAGE_SIZE_4K - size % PAGE_SIZE_4K);
509-
let copy_page_count = copy_size / PAGE_SIZE_4K;
510526
let target = VirtAddr::from(dst);
511527

512528
let mut page_table_ref = ProcessPageTableRef::default();
513529
page_table_ref.set_external_table(page_table);
514530
page_table_ref.copy_address_range(VirtAddr::from(addr), copy_size, target);
515531
}
516532

533+
pub fn copy_data_to_guest(dst_addr: u64, size: u64, page_table: u64) {
534+
535+
let source = VirtAddr::from(ALLOCATION_RANGE_VIRT_START);
536+
537+
let mut page_table_ref = ProcessPageTableRef::default();
538+
539+
page_table_ref.set_external_table(page_table);
540+
541+
page_table_ref.copy_address_range_to_guest(VirtAddr::from(dst_addr), size, source);
542+
}
517543

518544
pub fn map_4k_page(&self, target: VirtAddr, addr: PhysAddr, flags: ProcessPageFlags) {
519545
let (_pgd_mapping, pgd_table) = paddr_as_table!(self.process_page_table);

kernel/src/process_runtime/runtime.rs

+53-15
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ use cpuarch::vmsa::VMSA;
22
use igvm_defs::PAGE_SIZE_4K;
33
use core::ffi::CStr;
44
use core::str;
5+
<<<<<<< HEAD
56
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}};
67
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+
>>>>>>> 145f83e (Add result call for Trustlet)
711

812
use crate::vaddr_as_slice;
913
use crate::types::PageSize;
@@ -24,6 +28,7 @@ pub trait ProcessRuntime {
2428
fn pal_svsm_print_info(&mut self) -> bool;
2529
fn pal_svsm_set_tcb(&mut self) -> bool;
2630
fn pal_svsm_cpuid(&mut self) -> bool;
31+
fn pal_svsm_get_result(&mut self) -> bool;
2732
}
2833

2934
#[derive(Debug)]
@@ -32,20 +37,31 @@ pub struct PALContext {
3237
vmsa: &'static mut VMSA,
3338
string_buf: [u8;256],
3439
string_pos: usize,
40+
result_addr: u64,
41+
result_size: u64,
42+
guest_page_table: u64,
43+
return_value: u64,
3544
}
3645

3746
pub fn invoke_trustlet(params: &mut RequestParams) -> Result<(), SvsmReqError> {
3847

3948
log::info!("Invoking Trustlet");
4049

4150
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;
4453
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);
4556

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];
4762

48-
//log::info!("{:?}", trustlet);
63+
64+
let trustlet = PROCESS_STORE.get(ProcessID(id.try_into().unwrap()));
4965

5066
// Getting the current processes VMSA
5167
let vmsa_paddr = trustlet.context.vmsa;
@@ -62,9 +78,13 @@ pub fn invoke_trustlet(params: &mut RequestParams) -> Result<(), SvsmReqError> {
6278

6379
let mut rc = PALContext{
6480
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,
6888
};
6989

7090
// Execution loop of the trustlet
@@ -78,6 +98,12 @@ pub fn invoke_trustlet(params: &mut RequestParams) -> Result<(), SvsmReqError> {
7898
break;
7999
}
80100
}
101+
<<<<<<< HEAD
102+
=======
103+
104+
params.rcx = rc.return_value;
105+
106+
>>>>>>> 145f83e (Add result call for Trustlet)
81107
Ok(())
82108
}
83109

@@ -126,6 +152,9 @@ impl ProcessRuntime for PALContext {
126152
0x4FFFFFF9 => {
127153
return self.pal_svsm_mprotect();
128154
}
155+
0x4FFFFFF8 => {
156+
return self.pal_svsm_get_result();
157+
}
129158
99 => {
130159
let c = vmsa.rbx;
131160
log::info!("{}", c);
@@ -159,7 +188,6 @@ impl ProcessRuntime for PALContext {
159188
/// * rdx: edx value of the cpuid result
160189
fn pal_svsm_cpuid(&mut self) -> bool {
161190
let eax = self.vmsa.rax as u32;
162-
log::info!("eax value: {:#x}",eax);
163191
let eax_tmp = self.vmsa.rax;
164192
let ecx_tmp = self.vmsa.rcx;
165193
// Some cpuid leafs have subleaf (ecx) and some don't
@@ -183,16 +211,26 @@ impl ProcessRuntime for PALContext {
183211
self.vmsa.rbx = res.ebx as u64;
184212
self.vmsa.rcx = res.ecx as u64;
185213
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);
193214
return true;
194215
}
195216

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+
196234
/// Allocate virtual memory in the trustlet's page table
197235
///
198236
/// Register arguments:

0 commit comments

Comments
 (0)