MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / cpu_write_elf64_note

Method cpu_write_elf64_note

vmm/src/cpu.rs:2925–3031  ·  view source on GitHub ↗
(
        &mut self,
        dump_state: &DumpState,
    )

Source from the content-addressed store, hash-verified

2923#[cfg(all(target_arch = "x86_64", feature = "guest_debug"))]
2924impl CpuElf64Writable for CpuManager {
2925 fn cpu_write_elf64_note(
2926 &mut self,
2927 dump_state: &DumpState,
2928 ) -> std::result::Result<(), GuestDebuggableError> {
2929 let mut coredump_file = dump_state.file.as_ref().unwrap();
2930 for vcpu in &self.vcpus {
2931 let note_size = self.get_note_size(NoteDescType::Elf, 1);
2932 let mut pos: usize = 0;
2933 let mut buf = vec![0; note_size as usize];
2934 let descsz = size_of::<X86_64ElfPrStatus>();
2935 let vcpu_id = vcpu.lock().unwrap().id;
2936
2937 let note = Elf64_Nhdr {
2938 n_namesz: COREDUMP_NAME_SIZE,
2939 n_descsz: descsz as u32,
2940 n_type: NT_PRSTATUS,
2941 };
2942
2943 let bytes: &[u8] = note.as_slice();
2944 buf.splice(0.., bytes.to_vec());
2945 pos += round_up!(size_of::<Elf64_Nhdr>(), 4);
2946 buf.resize(pos + 4, 0);
2947 buf.splice(pos.., "CORE".to_string().into_bytes());
2948
2949 pos += round_up!(COREDUMP_NAME_SIZE as usize, 4);
2950 buf.resize(pos + 32 + 4, 0);
2951 let pid = vcpu_id as u64;
2952 let bytes: &[u8] = pid.as_slice();
2953 buf.splice(pos + 32.., bytes.to_vec()); /* pr_pid */
2954
2955 pos += descsz - size_of::<X86_64UserRegs>() - size_of::<u64>();
2956
2957 let orig_rax: u64 = 0;
2958 let gregs = self.vcpus[usize::try_from(vcpu_id).unwrap()]
2959 .lock()
2960 .unwrap()
2961 .vcpu
2962 .get_regs()
2963 .map_err(|_e| GuestDebuggableError::Coredump(anyhow!("get regs failed")))?;
2964
2965 let regs1 = [
2966 gregs.get_r15(),
2967 gregs.get_r14(),
2968 gregs.get_r13(),
2969 gregs.get_r12(),
2970 gregs.get_rbp(),
2971 gregs.get_rbx(),
2972 gregs.get_r11(),
2973 gregs.get_r10(),
2974 ];
2975 let regs2 = [
2976 gregs.get_r9(),
2977 gregs.get_r8(),
2978 gregs.get_rax(),
2979 gregs.get_rcx(),
2980 gregs.get_rdx(),
2981 gregs.get_rsi(),
2982 gregs.get_rdi(),

Callers 1

coredumpMethod · 0.45

Calls 6

get_note_sizeMethod · 0.80
as_sliceMethod · 0.80
resizeMethod · 0.45
get_regsMethod · 0.45
get_sregsMethod · 0.45
writeMethod · 0.45

Tested by

no test coverage detected