@@ -49,7 +49,7 @@ use mshv_bindings::{
49
49
use mshv_ioctls:: { Mshv , VcpuFd , VmFd } ;
50
50
use tracing:: { instrument, Span } ;
51
51
#[ cfg( crashdump) ]
52
- use { super :: crashdump, crate :: sandbox:: uninitialized:: SandboxMetadata , std:: path:: Path } ;
52
+ use { super :: crashdump, crate :: sandbox:: uninitialized:: SandboxRuntimeConfig , std:: path:: Path } ;
53
53
54
54
use super :: fpu:: { FP_CONTROL_WORD_DEFAULT , FP_TAG_WORD_DEFAULT , MXCSR_DEFAULT } ;
55
55
#[ cfg( gdb) ]
@@ -301,7 +301,7 @@ pub(super) struct HypervLinuxDriver {
301
301
#[ cfg( gdb) ]
302
302
gdb_conn : Option < DebugCommChannel < DebugResponse , DebugMsg > > ,
303
303
#[ cfg( crashdump) ]
304
- metadata : SandboxMetadata ,
304
+ rt_cfg : SandboxRuntimeConfig ,
305
305
}
306
306
307
307
impl HypervLinuxDriver {
@@ -320,7 +320,7 @@ impl HypervLinuxDriver {
320
320
rsp_ptr : GuestPtr ,
321
321
pml4_ptr : GuestPtr ,
322
322
#[ cfg( gdb) ] gdb_conn : Option < DebugCommChannel < DebugResponse , DebugMsg > > ,
323
- #[ cfg( crashdump) ] metadata : SandboxMetadata ,
323
+ #[ cfg( crashdump) ] rt_cfg : SandboxRuntimeConfig ,
324
324
) -> Result < Self > {
325
325
let mshv = Mshv :: new ( ) ?;
326
326
let pr = Default :: default ( ) ;
@@ -401,7 +401,7 @@ impl HypervLinuxDriver {
401
401
#[ cfg( gdb) ]
402
402
gdb_conn,
403
403
#[ cfg( crashdump) ]
404
- metadata ,
404
+ rt_cfg ,
405
405
} )
406
406
}
407
407
@@ -686,57 +686,61 @@ impl Hypervisor for HypervLinuxDriver {
686
686
}
687
687
688
688
#[ cfg( crashdump) ]
689
- fn crashdump_context ( & self ) -> Result < super :: crashdump:: CrashDumpContext > {
690
- let mut regs = [ 0 ; 27 ] ;
691
-
692
- let vcpu_regs = self . vcpu_fd . get_regs ( ) ?;
693
- let sregs = self . vcpu_fd . get_sregs ( ) ?;
694
- let xsave = self . vcpu_fd . get_xsave ( ) ?;
695
-
696
- // Set up the registers for the crash dump
697
- regs[ 0 ] = vcpu_regs. r15 ; // r15
698
- regs[ 1 ] = vcpu_regs. r14 ; // r14
699
- regs[ 2 ] = vcpu_regs. r13 ; // r13
700
- regs[ 3 ] = vcpu_regs. r12 ; // r12
701
- regs[ 4 ] = vcpu_regs. rbp ; // rbp
702
- regs[ 5 ] = vcpu_regs. rbx ; // rbx
703
- regs[ 6 ] = vcpu_regs. r11 ; // r11
704
- regs[ 7 ] = vcpu_regs. r10 ; // r10
705
- regs[ 8 ] = vcpu_regs. r9 ; // r9
706
- regs[ 9 ] = vcpu_regs. r8 ; // r8
707
- regs[ 10 ] = vcpu_regs. rax ; // rax
708
- regs[ 11 ] = vcpu_regs. rcx ; // rcx
709
- regs[ 12 ] = vcpu_regs. rdx ; // rdx
710
- regs[ 13 ] = vcpu_regs. rsi ; // rsi
711
- regs[ 14 ] = vcpu_regs. rdi ; // rdi
712
- regs[ 15 ] = 0 ; // orig rax
713
- regs[ 16 ] = vcpu_regs. rip ; // rip
714
- regs[ 17 ] = sregs. cs . selector as u64 ; // cs
715
- regs[ 18 ] = vcpu_regs. rflags ; // eflags
716
- regs[ 19 ] = vcpu_regs. rsp ; // rsp
717
- regs[ 20 ] = sregs. ss . selector as u64 ; // ss
718
- regs[ 21 ] = sregs. fs . base ; // fs_base
719
- regs[ 22 ] = sregs. gs . base ; // gs_base
720
- regs[ 23 ] = sregs. ds . selector as u64 ; // ds
721
- regs[ 24 ] = sregs. es . selector as u64 ; // es
722
- regs[ 25 ] = sregs. fs . selector as u64 ; // fs
723
- regs[ 26 ] = sregs. gs . selector as u64 ; // gs
724
-
725
- // Get the filename from the binary path
726
- let filename = self . metadata . binary_path . clone ( ) . and_then ( |path| {
727
- Path :: new ( & path)
728
- . file_name ( )
729
- . and_then ( |name| name. to_os_string ( ) . into_string ( ) . ok ( ) )
730
- } ) ;
731
-
732
- Ok ( crashdump:: CrashDumpContext :: new (
733
- & self . mem_regions ,
734
- regs,
735
- xsave. buffer . to_vec ( ) ,
736
- self . entrypoint ,
737
- self . metadata . binary_path . clone ( ) ,
738
- filename,
739
- ) )
689
+ fn crashdump_context ( & self ) -> Result < Option < super :: crashdump:: CrashDumpContext > > {
690
+ if self . rt_cfg . guest_core_dump {
691
+ let mut regs = [ 0 ; 27 ] ;
692
+
693
+ let vcpu_regs = self . vcpu_fd . get_regs ( ) ?;
694
+ let sregs = self . vcpu_fd . get_sregs ( ) ?;
695
+ let xsave = self . vcpu_fd . get_xsave ( ) ?;
696
+
697
+ // Set up the registers for the crash dump
698
+ regs[ 0 ] = vcpu_regs. r15 ; // r15
699
+ regs[ 1 ] = vcpu_regs. r14 ; // r14
700
+ regs[ 2 ] = vcpu_regs. r13 ; // r13
701
+ regs[ 3 ] = vcpu_regs. r12 ; // r12
702
+ regs[ 4 ] = vcpu_regs. rbp ; // rbp
703
+ regs[ 5 ] = vcpu_regs. rbx ; // rbx
704
+ regs[ 6 ] = vcpu_regs. r11 ; // r11
705
+ regs[ 7 ] = vcpu_regs. r10 ; // r10
706
+ regs[ 8 ] = vcpu_regs. r9 ; // r9
707
+ regs[ 9 ] = vcpu_regs. r8 ; // r8
708
+ regs[ 10 ] = vcpu_regs. rax ; // rax
709
+ regs[ 11 ] = vcpu_regs. rcx ; // rcx
710
+ regs[ 12 ] = vcpu_regs. rdx ; // rdx
711
+ regs[ 13 ] = vcpu_regs. rsi ; // rsi
712
+ regs[ 14 ] = vcpu_regs. rdi ; // rdi
713
+ regs[ 15 ] = 0 ; // orig rax
714
+ regs[ 16 ] = vcpu_regs. rip ; // rip
715
+ regs[ 17 ] = sregs. cs . selector as u64 ; // cs
716
+ regs[ 18 ] = vcpu_regs. rflags ; // eflags
717
+ regs[ 19 ] = vcpu_regs. rsp ; // rsp
718
+ regs[ 20 ] = sregs. ss . selector as u64 ; // ss
719
+ regs[ 21 ] = sregs. fs . base ; // fs_base
720
+ regs[ 22 ] = sregs. gs . base ; // gs_base
721
+ regs[ 23 ] = sregs. ds . selector as u64 ; // ds
722
+ regs[ 24 ] = sregs. es . selector as u64 ; // es
723
+ regs[ 25 ] = sregs. fs . selector as u64 ; // fs
724
+ regs[ 26 ] = sregs. gs . selector as u64 ; // gs
725
+
726
+ // Get the filename from the binary path
727
+ let filename = self . rt_cfg . binary_path . clone ( ) . and_then ( |path| {
728
+ Path :: new ( & path)
729
+ . file_name ( )
730
+ . and_then ( |name| name. to_os_string ( ) . into_string ( ) . ok ( ) )
731
+ } ) ;
732
+
733
+ Ok ( Some ( crashdump:: CrashDumpContext :: new (
734
+ & self . mem_regions ,
735
+ regs,
736
+ xsave. buffer . to_vec ( ) ,
737
+ self . entrypoint ,
738
+ self . rt_cfg . binary_path . clone ( ) ,
739
+ filename,
740
+ ) ) )
741
+ } else {
742
+ Ok ( None )
743
+ }
740
744
}
741
745
742
746
#[ cfg( gdb) ]
@@ -857,7 +861,14 @@ mod tests {
857
861
#[ cfg( gdb) ]
858
862
None ,
859
863
#[ cfg( crashdump) ]
860
- SandboxMetadata { binary_path : None } ,
864
+ SandboxRuntimeConfig {
865
+ #[ cfg( crashdump) ]
866
+ binary_path : None ,
867
+ #[ cfg( gdb) ]
868
+ debug_info : None ,
869
+ #[ cfg( crashdump) ]
870
+ guest_core_dump : true ,
871
+ } ,
861
872
)
862
873
. unwrap ( ) ;
863
874
}
0 commit comments