Skip to content

Commit d96051d

Browse files
committed
Fix missing selectors for LDTR and TR
The vCPU migration payloads for the segment registers was not properly saving/restoring the selector state for the LDTR and TR.
1 parent 627be13 commit d96051d

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

lib/propolis/src/vcpu.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -562,19 +562,21 @@ pub mod migrate {
562562
);
563563
let gdtr = SegDescV1::from_raw(
564564
vcpu.get_segreg(vm_reg_name::VM_REG_GUEST_GDTR)?,
565+
// GDT has no selector register
565566
0,
566567
);
567568
let idtr = SegDescV1::from_raw(
568569
vcpu.get_segreg(vm_reg_name::VM_REG_GUEST_IDTR)?,
570+
// IDT has no selector register
569571
0,
570572
);
571573
let ldtr = SegDescV1::from_raw(
572574
vcpu.get_segreg(vm_reg_name::VM_REG_GUEST_LDTR)?,
573-
0,
575+
vcpu.get_reg(vm_reg_name::VM_REG_GUEST_LDTR)? as u16,
574576
);
575577
let tr = SegDescV1::from_raw(
576578
vcpu.get_segreg(vm_reg_name::VM_REG_GUEST_TR)?,
577-
0,
579+
vcpu.get_reg(vm_reg_name::VM_REG_GUEST_TR)? as u16,
578580
);
579581
Ok(Self { cs, ds, es, fs, gs, ss, gdtr, idtr, ldtr, tr })
580582
}
@@ -610,11 +612,13 @@ pub mod migrate {
610612
let (idtr, _) = self.idtr.into_raw();
611613
vcpu.set_segreg(vm_reg_name::VM_REG_GUEST_IDTR, &idtr)?;
612614

613-
let (ldtr, _) = self.ldtr.into_raw();
615+
let (ldtr, ldtrs) = self.ldtr.into_raw();
614616
vcpu.set_segreg(vm_reg_name::VM_REG_GUEST_LDTR, &ldtr)?;
617+
vcpu.set_reg(vm_reg_name::VM_REG_GUEST_LDTR, ldtrs.into())?;
615618

616-
let (tr, _) = self.tr.into_raw();
619+
let (tr, trs) = self.tr.into_raw();
617620
vcpu.set_segreg(vm_reg_name::VM_REG_GUEST_TR, &tr)?;
621+
vcpu.set_reg(vm_reg_name::VM_REG_GUEST_TR, trs.into())?;
618622
Ok(())
619623
}
620624
}

0 commit comments

Comments
 (0)