Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 26 additions & 9 deletions src/attestation/src/ghci.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ pub static NOTIFIER: AtomicU8 = AtomicU8::new(0);
#[no_mangle]
pub extern "C" fn servtd_get_quote(tdquote_req_buf: *mut c_void, len: u64) -> i32 {
if tdquote_req_buf.is_null() || len > GET_QUOTE_MAX_SIZE {
log::error!(
"Invalid parameters: tdquote_req_buf.is_null() is {} or len is {}\n",
tdquote_req_buf.is_null(),
len
);
return AttestLibError::InvalidParameter as i32;
}

Expand All @@ -32,17 +37,20 @@ pub extern "C" fn servtd_get_quote(tdquote_req_buf: *mut c_void, len: u64) -> i3
let mut shared = if let Some(shared) = SharedMemory::new(len as usize / 0x1000) {
shared
} else {
log::error!("Failed to allocate shared memory of size {}\n", len);
return AttestLibError::OutOfMemory as i32;
};
shared.as_mut_bytes()[..len as usize].copy_from_slice(input);

let notify_registered = set_vmm_notification();

if tdvmcall_get_quote(shared.as_mut_bytes()).is_err() {
let _ = tdvmcall_get_quote(shared.as_mut_bytes()).map_err(|e| {
log::error!("tdvmcall_get_quote failed with error: {:?}\n", e);
return AttestLibError::QuoteFailure as i32;
}
});

if let Err(err) = wait_for_quote_completion(notify_registered, shared.as_bytes()) {
log::error!("wait_for_quote_completion failed: {:?}\n", err);
return err as i32;
}
input.copy_from_slice(&shared.as_bytes()[..len as usize]);
Expand All @@ -57,17 +65,22 @@ fn vmm_notification(_: &mut InterruptStack) {

fn set_vmm_notification() -> bool {
// Setup interrupt handler
if register_interrupt_callback(
_ = register_interrupt_callback(
NOTIFY_VECTOR as usize,
InterruptCallback::new(vmm_notification),
)
.is_err()
{
panic!("Fail to setup interrupt callback for VMM notify\n");
}
.map_err(|e| {
log::error!("Fail to setup interrupt callback for VMM notify\n");
return false;
});

// Setup event notifier
tdx_tdcall::tdx::tdvmcall_setup_event_notify(NOTIFY_VECTOR as u64).is_ok()
_ = tdx_tdcall::tdx::tdvmcall_setup_event_notify(NOTIFY_VECTOR as u64).map_err(|e| {
log::error!("Fail to setup event notify for VMM: {:?}\n", e);
return false;
});

true
}

fn wait_for_quote_completion(notify_registered: bool, buffer: &[u8]) -> Result<(), AttestLibError> {
Expand All @@ -81,13 +94,17 @@ fn wait_for_quote_completion(notify_registered: bool, buffer: &[u8]) -> Result<(
while status_code == GET_QUOTE_STATUS_IN_FLIGHT {
status_code = match buffer.get(GET_QUOTE_STATUS_FIELD) {
Some(bytes) => u64::from_le_bytes(bytes.try_into().unwrap()),
None => return Err(AttestLibError::InvalidParameter),
None => {
log::error!("Failed to get quote status from buffer\n");
return Err(AttestLibError::InvalidParameter);
}
};
}

if status_code == GET_QUOTE_STATUS_SUCCESS {
Ok(())
} else {
log::error!("Quote status indicates failure: {:#x}\n", status_code);
Err(AttestLibError::QuoteFailure)
}
}
Expand Down
Loading