(
&self,
cpu_id: usize,
regs: &CoreRegs,
)
| 2777 | |
| 2778 | #[cfg(target_arch = "x86_64")] |
| 2779 | fn write_regs( |
| 2780 | &self, |
| 2781 | cpu_id: usize, |
| 2782 | regs: &CoreRegs, |
| 2783 | ) -> std::result::Result<(), DebuggableError> { |
| 2784 | let orig_gregs = self |
| 2785 | .get_regs(cpu_id as u8) |
| 2786 | .map_err(DebuggableError::ReadRegs)?; |
| 2787 | let mut gregs = self.create_standard_regs(cpu_id as u8); |
| 2788 | gregs.set_rax(regs.regs[0]); |
| 2789 | gregs.set_rbx(regs.regs[1]); |
| 2790 | gregs.set_rcx(regs.regs[2]); |
| 2791 | gregs.set_rdx(regs.regs[3]); |
| 2792 | gregs.set_rsi(regs.regs[4]); |
| 2793 | gregs.set_rdi(regs.regs[5]); |
| 2794 | gregs.set_rbp(regs.regs[6]); |
| 2795 | gregs.set_rsp(regs.regs[7]); |
| 2796 | gregs.set_r8(regs.regs[8]); |
| 2797 | gregs.set_r9(regs.regs[9]); |
| 2798 | gregs.set_r10(regs.regs[10]); |
| 2799 | gregs.set_r11(regs.regs[11]); |
| 2800 | gregs.set_r12(regs.regs[12]); |
| 2801 | gregs.set_r13(regs.regs[13]); |
| 2802 | gregs.set_r14(regs.regs[14]); |
| 2803 | gregs.set_r15(regs.regs[15]); |
| 2804 | gregs.set_rip(regs.rip); |
| 2805 | // Update the lower 32-bit of rflags. |
| 2806 | gregs.set_rflags((orig_gregs.get_rflags() & !(u32::MAX as u64)) | (regs.eflags as u64)); |
| 2807 | |
| 2808 | self.set_regs(cpu_id as u8, &gregs) |
| 2809 | .map_err(DebuggableError::WriteRegs)?; |
| 2810 | |
| 2811 | // Segment registers: CS, SS, DS, ES, FS, GS |
| 2812 | // Since GDB care only selectors, we call get_sregs() first. |
| 2813 | let mut sregs = self |
| 2814 | .get_sregs(cpu_id as u8) |
| 2815 | .map_err(DebuggableError::ReadRegs)?; |
| 2816 | sregs.cs.selector = regs.segments.cs as u16; |
| 2817 | sregs.ss.selector = regs.segments.ss as u16; |
| 2818 | sregs.ds.selector = regs.segments.ds as u16; |
| 2819 | sregs.es.selector = regs.segments.es as u16; |
| 2820 | sregs.fs.selector = regs.segments.fs as u16; |
| 2821 | sregs.gs.selector = regs.segments.gs as u16; |
| 2822 | |
| 2823 | self.set_sregs(cpu_id as u8, &sregs) |
| 2824 | .map_err(DebuggableError::WriteRegs)?; |
| 2825 | |
| 2826 | // TODO: Add other registers |
| 2827 | |
| 2828 | Ok(()) |
| 2829 | } |
| 2830 | |
| 2831 | #[cfg(target_arch = "aarch64")] |
| 2832 | fn write_regs( |
nothing calls this directly
no test coverage detected