Skip to content

Commit a0c53fb

Browse files
committed
[feat] refactor the settings of ia32_sysenter_xx msrs
1 parent b3e79d4 commit a0c53fb

File tree

3 files changed

+26
-13
lines changed

3 files changed

+26
-13
lines changed

src/context.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ pub struct LinuxContext {
4343
pub lstar: u64,
4444
pub cstar: u64,
4545
pub fmask: u64,
46+
47+
pub ia32_sysenter_cs: u64,
48+
pub ia32_sysenter_esp: u64,
49+
pub ia32_sysenter_eip: u64,
50+
4651
pub kernel_gsbase: u64,
4752
pub pat: u64,
4853
pub mtrr_def_type: u64,
@@ -87,6 +92,9 @@ impl Default for LinuxContext {
8792
lstar: 0,
8893
cstar: 0,
8994
fmask: 0,
95+
ia32_sysenter_cs: 0,
96+
ia32_sysenter_esp: 0,
97+
ia32_sysenter_eip: 0,
9098
kernel_gsbase: 0,
9199
pat: 0,
92100
mtrr_def_type: 0,
@@ -143,6 +151,9 @@ impl LinuxContext {
143151
lstar: Msr::IA32_LSTAR.read(),
144152
cstar: Msr::IA32_CSTAR.read(),
145153
fmask: Msr::IA32_FMASK.read(),
154+
ia32_sysenter_cs: Msr::IA32_SYSENTER_CS.read(),
155+
ia32_sysenter_esp: Msr::IA32_SYSENTER_ESP.read(),
156+
ia32_sysenter_eip: Msr::IA32_SYSENTER_EIP.read(),
146157
kernel_gsbase: Msr::IA32_KERNEL_GSBASE.read(),
147158
pat: Msr::IA32_PAT.read(),
148159
mtrr_def_type: Msr::IA32_MTRR_DEF_TYPE.read(),
@@ -153,6 +164,10 @@ impl LinuxContext {
153164
/// Restore system registers.
154165
pub fn restore(&self) {
155166
unsafe {
167+
Msr::IA32_SYSENTER_CS.write(self.ia32_sysenter_cs);
168+
Msr::IA32_SYSENTER_ESP.write(self.ia32_sysenter_esp);
169+
Msr::IA32_SYSENTER_EIP.write(self.ia32_sysenter_eip);
170+
156171
Msr::IA32_EFER.write(self.efer);
157172
Msr::IA32_STAR.write(self.star);
158173
Msr::IA32_LSTAR.write(self.lstar);

src/regs.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ impl GeneralRegisters {
167167
macro_rules! save_regs_to_stack {
168168
() => {
169169
"
170+
.code64
170171
push r15
171172
push r14
172173
push r13

src/vmx/vcpu.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -562,9 +562,9 @@ impl<H: AxVCpuHal> VmxVcpu<H> {
562562
VmcsGuestNW::RIP.write(linux.rip as _)?;
563563
VmcsGuestNW::RFLAGS.write(0x2)?;
564564

565-
VmcsGuest32::IA32_SYSENTER_CS.write(Msr::IA32_SYSENTER_CS.read() as _)?;
566-
VmcsGuestNW::IA32_SYSENTER_ESP.write(Msr::IA32_SYSENTER_ESP.read() as _)?;
567-
VmcsGuestNW::IA32_SYSENTER_EIP.write(Msr::IA32_SYSENTER_EIP.read() as _)?;
565+
VmcsGuest32::IA32_SYSENTER_CS.write(linux.ia32_sysenter_cs as _)?;
566+
VmcsGuestNW::IA32_SYSENTER_ESP.write(linux.ia32_sysenter_esp as _)?;
567+
VmcsGuestNW::IA32_SYSENTER_EIP.write(linux.ia32_sysenter_eip as _)?;
568568

569569
VmcsGuestNW::DR7.write(0x400)?;
570570
VmcsGuest64::IA32_DEBUGCTL.write(0)?;
@@ -787,13 +787,11 @@ impl<H: AxVCpuHal> VmxVcpu<H> {
787787
linux.idt.base = VirtAddr::new(VmcsGuestNW::IDTR_BASE.read().unwrap() as _);
788788
linux.idt.limit = VmcsGuest32::IDTR_LIMIT.read().unwrap() as _;
789789

790-
linux.load_guest_regs(self.regs());
790+
linux.ia32_sysenter_cs = VmcsGuest32::IA32_SYSENTER_CS.read().unwrap() as _; // 0x174
791+
linux.ia32_sysenter_esp = VmcsGuestNW::IA32_SYSENTER_ESP.read().unwrap() as _; // 0x178
792+
linux.ia32_sysenter_eip = VmcsGuestNW::IA32_SYSENTER_EIP.read().unwrap() as _; // 0x17a
791793

792-
// unsafe {
793-
// Msr::IA32_SYSENTER_CS.write(VmcsGuest32::IA32_SYSENTER_CS.read().unwrap() as _);
794-
// Msr::IA32_SYSENTER_ESP.write(VmcsGuestNW::IA32_SYSENTER_ESP.read().unwrap() as _);
795-
// Msr::IA32_SYSENTER_EIP.write(VmcsGuestNW::IA32_SYSENTER_EIP.read().unwrap() as _);
796-
// }
794+
linux.load_guest_regs(self.regs());
797795
}
798796

799797
fn get_paging_level(&self) -> usize {
@@ -1296,10 +1294,9 @@ impl<H: AxVCpuHal> AxArchVCpu for VmxVcpu<H> {
12961294
Self::new(Some(config))
12971295
}
12981296

1299-
fn load_host(&self) -> AxResult<Self::HostConfig> {
1300-
let mut linux = LinuxContext::default();
1301-
self.load_vmcs_guest(&mut linux);
1302-
Ok(linux)
1297+
fn load_host(&self, config: &mut Self::HostConfig) -> AxResult {
1298+
self.load_vmcs_guest(config);
1299+
Ok(())
13031300
}
13041301

13051302
fn set_entry(&mut self, entry: GuestPhysAddr) -> AxResult {

0 commit comments

Comments
 (0)