| 2923 | #[cfg(all(target_arch = "x86_64", feature = "guest_debug"))] |
| 2924 | impl 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(), |