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

Method write_regs

vmm/src/cpu.rs:2779–2829  ·  view source on GitHub ↗
(
        &self,
        cpu_id: usize,
        regs: &CoreRegs,
    )

Source from the content-addressed store, hash-verified

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(

Callers

nothing calls this directly

Calls 5

get_regsMethod · 0.45
create_standard_regsMethod · 0.45
set_regsMethod · 0.45
get_sregsMethod · 0.45
set_sregsMethod · 0.45

Tested by

no test coverage detected