Skip to content

Commit 17a5d14

Browse files
committed
add a way to signal a non fatal error on the hypervisor side
- when using visual studio code, sometimes it requests to read from unexpected addresses which can cause an error on the hypervisor side. This fix signals this to the gdb thread which marks it as a non-fatal error Signed-off-by: Doru Blânzeanu <[email protected]>
1 parent 6cc6184 commit 17a5d14

File tree

4 files changed

+68
-14
lines changed

4 files changed

+68
-14
lines changed

src/hyperlight_host/src/error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,11 @@ pub enum HyperlightError {
275275
#[error("SystemTimeError {0:?}")]
276276
SystemTimeError(#[from] SystemTimeError),
277277

278+
/// Error occurred when translating guest address
279+
#[error("An error occured when translating guest address: {0:?}")]
280+
#[cfg(gdb)]
281+
TranslateGuestAddress(u64),
282+
278283
/// Error occurred converting a slice to an array
279284
#[error("TryFromSliceError {0:?}")]
280285
TryFromSliceError(#[from] TryFromSliceError),

src/hyperlight_host/src/hypervisor/gdb/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ pub enum DebugResponse {
122122
AddSwBreakpoint(bool),
123123
Continue,
124124
DisableDebug,
125+
ErrorOccured,
125126
GetCodeSectionOffset(u64),
126127
ReadAddr(Vec<u8>),
127128
ReadRegisters(X86_64Regs),

src/hyperlight_host/src/hypervisor/gdb/x86_64_target.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ impl HyperlightSandboxTarget {
8787

8888
match self.send_command(DebugMsg::DisableDebug)? {
8989
DebugResponse::DisableDebug => Ok(()),
90+
DebugResponse::ErrorOccured => {
91+
log::error!("Error occured");
92+
Err(GdbTargetError::UnexpectedError)
93+
}
9094
msg => {
9195
log::error!("Unexpected message received: {:?}", msg);
9296
Err(GdbTargetError::UnexpectedMessage)
@@ -134,6 +138,10 @@ impl SingleThreadBase for HyperlightSandboxTarget {
134138

135139
Ok(v.len())
136140
}
141+
DebugResponse::ErrorOccured => {
142+
log::error!("Error occured");
143+
Err(TargetError::NonFatal)
144+
}
137145
msg => {
138146
log::error!("Unexpected message received: {:?}", msg);
139147
Err(TargetError::Fatal(GdbTargetError::UnexpectedMessage))
@@ -151,6 +159,10 @@ impl SingleThreadBase for HyperlightSandboxTarget {
151159

152160
match self.send_command(DebugMsg::WriteAddr(gva, v))? {
153161
DebugResponse::WriteAddr => Ok(()),
162+
DebugResponse::ErrorOccured => {
163+
log::error!("Error occured");
164+
Err(TargetError::NonFatal)
165+
}
154166
msg => {
155167
log::error!("Unexpected message received: {:?}", msg);
156168
Err(TargetError::Fatal(GdbTargetError::UnexpectedMessage))
@@ -188,6 +200,10 @@ impl SingleThreadBase for HyperlightSandboxTarget {
188200

189201
Ok(())
190202
}
203+
DebugResponse::ErrorOccured => {
204+
log::error!("Error occured");
205+
Err(TargetError::NonFatal)
206+
}
191207

192208
msg => {
193209
log::error!("Unexpected message received: {:?}", msg);
@@ -225,6 +241,10 @@ impl SingleThreadBase for HyperlightSandboxTarget {
225241

226242
match self.send_command(DebugMsg::WriteRegisters(regs))? {
227243
DebugResponse::WriteRegisters => Ok(()),
244+
DebugResponse::ErrorOccured => {
245+
log::error!("Error occured");
246+
Err(TargetError::NonFatal)
247+
}
228248
msg => {
229249
log::error!("Unexpected message received: {:?}", msg);
230250
Err(TargetError::Fatal(GdbTargetError::UnexpectedMessage))
@@ -246,6 +266,10 @@ impl SectionOffsets for HyperlightSandboxTarget {
246266
text_seg: text,
247267
data_seg: None,
248268
}),
269+
DebugResponse::ErrorOccured => {
270+
log::error!("Error occured");
271+
Err(GdbTargetError::UnexpectedError)
272+
}
249273
msg => {
250274
log::error!("Unexpected message received: {:?}", msg);
251275
Err(GdbTargetError::UnexpectedMessage)
@@ -273,6 +297,10 @@ impl HwBreakpoint for HyperlightSandboxTarget {
273297

274298
match self.send_command(DebugMsg::AddHwBreakpoint(addr))? {
275299
DebugResponse::AddHwBreakpoint(rsp) => Ok(rsp),
300+
DebugResponse::ErrorOccured => {
301+
log::error!("Error occured");
302+
Err(TargetError::NonFatal)
303+
}
276304
msg => {
277305
log::error!("Unexpected message received: {:?}", msg);
278306
Err(TargetError::Fatal(GdbTargetError::UnexpectedMessage))
@@ -289,6 +317,10 @@ impl HwBreakpoint for HyperlightSandboxTarget {
289317

290318
match self.send_command(DebugMsg::RemoveHwBreakpoint(addr))? {
291319
DebugResponse::RemoveHwBreakpoint(rsp) => Ok(rsp),
320+
DebugResponse::ErrorOccured => {
321+
log::error!("Error occured");
322+
Err(TargetError::NonFatal)
323+
}
292324
msg => {
293325
log::error!("Unexpected message received: {:?}", msg);
294326
Err(TargetError::Fatal(GdbTargetError::UnexpectedMessage))
@@ -307,6 +339,10 @@ impl SwBreakpoint for HyperlightSandboxTarget {
307339

308340
match self.send_command(DebugMsg::AddSwBreakpoint(addr))? {
309341
DebugResponse::AddSwBreakpoint(rsp) => Ok(rsp),
342+
DebugResponse::ErrorOccured => {
343+
log::error!("Error occured");
344+
Err(TargetError::NonFatal)
345+
}
310346
msg => {
311347
log::error!("Unexpected message received: {:?}", msg);
312348
Err(TargetError::Fatal(GdbTargetError::UnexpectedMessage))
@@ -323,6 +359,10 @@ impl SwBreakpoint for HyperlightSandboxTarget {
323359

324360
match self.send_command(DebugMsg::RemoveSwBreakpoint(addr))? {
325361
DebugResponse::RemoveSwBreakpoint(rsp) => Ok(rsp),
362+
DebugResponse::ErrorOccured => {
363+
log::error!("Error occured");
364+
Err(TargetError::NonFatal)
365+
}
326366
msg => {
327367
log::error!("Unexpected message received: {:?}", msg);
328368
Err(TargetError::Fatal(GdbTargetError::UnexpectedMessage))
@@ -348,9 +388,12 @@ impl SingleThreadSingleStep for HyperlightSandboxTarget {
348388
log::debug!("Step");
349389
match self.send_command(DebugMsg::Step)? {
350390
DebugResponse::Step => Ok(()),
391+
DebugResponse::ErrorOccured => {
392+
log::error!("Error occured");
393+
Err(GdbTargetError::UnexpectedError)
394+
}
351395
msg => {
352396
log::error!("Unexpected message received: {:?}", msg);
353-
354397
Err(GdbTargetError::UnexpectedMessage)
355398
}
356399
}

src/hyperlight_host/src/hypervisor/kvm.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ use crate::mem::memory_region::{MemoryRegion, MemoryRegionFlags};
3939
use crate::mem::ptr::{GuestPtr, RawPtr};
4040
#[cfg(gdb)]
4141
use crate::sandbox::uninitialized::DebugInfo;
42+
#[cfg(gdb)]
43+
use crate::HyperlightError;
4244
use crate::{log_then_return, new_error, Result};
4345

4446
/// Return `true` if the KVM API is available, version 12, and has UserMemory capability, or `false` otherwise
@@ -79,7 +81,7 @@ mod debug {
7981
use crate::hypervisor::gdb::{DebugMsg, DebugResponse, VcpuStopReason, X86_64Regs};
8082
use crate::hypervisor::handlers::DbgMemAccessHandlerCaller;
8183
use crate::mem::layout::SandboxMemoryLayout;
82-
use crate::{new_error, Result};
84+
use crate::{new_error, HyperlightError, Result};
8385

8486
/// Software Breakpoint size in memory
8587
pub const SW_BP_SIZE: usize = 1;
@@ -208,19 +210,13 @@ mod debug {
208210

209211
/// Translates the guest address to physical address
210212
fn translate_gva(&self, gva: u64) -> Result<u64> {
211-
let tr = self.vcpu_fd.translate_gva(gva).map_err(|e| {
212-
new_error!(
213-
"Could not translate guest virtual address {:X}: {:?}",
214-
gva,
215-
e
216-
)
217-
})?;
213+
let tr = self
214+
.vcpu_fd
215+
.translate_gva(gva)
216+
.map_err(|_| HyperlightError::TranslateGuestAddress(gva))?;
218217

219218
if tr.valid == 0 {
220-
Err(new_error!(
221-
"Could not translate guest virtual address {:X}",
222-
gva
223-
))
219+
Err(HyperlightError::TranslateGuestAddress(gva))
224220
} else {
225221
Ok(tr.physical_address)
226222
}
@@ -916,7 +912,16 @@ impl Hypervisor for KVMDriver {
916912
// Wait for a message from gdb
917913
let req = self.recv_dbg_msg()?;
918914

919-
let response = self.process_dbg_request(req, dbg_mem_access_fn.clone())?;
915+
let result = self.process_dbg_request(req, dbg_mem_access_fn.clone());
916+
917+
let response = match result {
918+
Ok(response) => response,
919+
// Treat non fatal errors separately so the guest doesn't fail
920+
Err(HyperlightError::TranslateGuestAddress(_)) => DebugResponse::ErrorOccured,
921+
Err(e) => {
922+
return Err(e);
923+
}
924+
};
920925

921926
// If the command was either step or continue, we need to run the vcpu
922927
let cont = matches!(

0 commit comments

Comments
 (0)