| 3031 | } |
| 3032 | |
| 3033 | fn cpu_write_vmm_note( |
| 3034 | &mut self, |
| 3035 | dump_state: &DumpState, |
| 3036 | ) -> std::result::Result<(), GuestDebuggableError> { |
| 3037 | let mut coredump_file = dump_state.file.as_ref().unwrap(); |
| 3038 | for vcpu in &self.vcpus { |
| 3039 | let note_size = self.get_note_size(NoteDescType::Vmm, 1); |
| 3040 | let mut pos: usize = 0; |
| 3041 | let mut buf = vec![0; note_size as usize]; |
| 3042 | let descsz = size_of::<DumpCpusState>(); |
| 3043 | let vcpu_id = vcpu.lock().unwrap().id; |
| 3044 | |
| 3045 | let note = Elf64_Nhdr { |
| 3046 | n_namesz: COREDUMP_NAME_SIZE, |
| 3047 | n_descsz: descsz as u32, |
| 3048 | n_type: 0, |
| 3049 | }; |
| 3050 | |
| 3051 | let bytes: &[u8] = note.as_slice(); |
| 3052 | buf.splice(0.., bytes.to_vec()); |
| 3053 | pos += round_up!(size_of::<Elf64_Nhdr>(), 4); |
| 3054 | |
| 3055 | buf.resize(pos + 4, 0); |
| 3056 | buf.splice(pos.., "QEMU".to_string().into_bytes()); |
| 3057 | |
| 3058 | pos += round_up!(COREDUMP_NAME_SIZE as usize, 4); |
| 3059 | |
| 3060 | let gregs = self.vcpus[usize::try_from(vcpu_id).unwrap()] |
| 3061 | .lock() |
| 3062 | .unwrap() |
| 3063 | .vcpu |
| 3064 | .get_regs() |
| 3065 | .map_err(|_e| GuestDebuggableError::Coredump(anyhow!("get regs failed")))?; |
| 3066 | |
| 3067 | let regs1 = [ |
| 3068 | gregs.get_rax(), |
| 3069 | gregs.get_rbx(), |
| 3070 | gregs.get_rcx(), |
| 3071 | gregs.get_rdx(), |
| 3072 | gregs.get_rsi(), |
| 3073 | gregs.get_rdi(), |
| 3074 | gregs.get_rsp(), |
| 3075 | gregs.get_rbp(), |
| 3076 | ]; |
| 3077 | |
| 3078 | let regs2 = [ |
| 3079 | gregs.get_r8(), |
| 3080 | gregs.get_r9(), |
| 3081 | gregs.get_r10(), |
| 3082 | gregs.get_r11(), |
| 3083 | gregs.get_r12(), |
| 3084 | gregs.get_r13(), |
| 3085 | gregs.get_r14(), |
| 3086 | gregs.get_r15(), |
| 3087 | ]; |
| 3088 | |
| 3089 | let sregs = self.vcpus[usize::try_from(vcpu_id).unwrap()] |
| 3090 | .lock() |