Save 64-bit of the IA-32e capable sysenter MSRs
PATCH 1/1 Save 64-bit of the IA-32e capable sysenter MSRs
Hi,
When transitioning from KVM to the qemu userspace, we try to get and push a whole bunch of MSR values, including the SYSENTER ones. While this is basically a good idea, qemu doesn't know anything about SYSENTER on x86_64, which is an additional feature only available on Intel CPUs and thus defines SYSENTER_EIP and SYSENTER_ESP as 32-bit values.
Because we're saving/restoring the SYSENTER values on transitions to userspace and the values in env->cpu only hold 32 bits, they get truncated to 32-bit. The easiest way around this is to widen the fields to 64 bits. This should not disturb the current functionality, but allows us to run 32-bit code on x86_64 using VMX.
As this is KVM specific for now, I'll only CC the qemu mailinglist, but wouldn't encourage qemu to take the patch for now, as it's not necessary when emulating an AMD CPU.
qemu/target-i386/cpu.h +2 -2
@@ -542,8 +542,8 @@ typedef struct CPUX86State {/* sysenter registers */ uint32_t sysenter_cs; -uint32_t sysenter_esp; -uint32_t sysenter_eip; +uint64_t sysenter_esp; +uint64_t sysenter_eip;uint64_t efer;uint64_t star;
Quoted 8 lines · Alexander Graf
Hi,
When transitioning from KVM to the qemu userspace, we try to get and push a whole bunch of MSR values, including the SYSENTER ones. While this is basically a good idea, qemu doesn't know anything about SYSENTER on
x86_64, which is an additional feature only available on Intel CPUs and thus definesSYSENTER_EIPandSYSENTER_ESPas 32-bit values.Because we're saving/restoring the SYSENTER values on transitions to userspace and the values in
env->cpuonly hold 32 bits, they get truncated to 32-bit. The easiest way around this is to widen the fields to 64 bits. This should not disturb the current functionality, but allows us to run 32-bit code onx86_64using VMX.As this is KVM specific for now, I'll only CC the qemu mailinglist, but wouldn't encourage qemu to take the patch for now, as it's not necessary when emulating an AMD CPU.
Applied, thanks. I imagine save/restore support needs updating as well? That should go into qemuy btw since maintaining the save/restore format across forks isn't possible.
Signature · 1 line
error compiling committee.c: too many arguments to function
Quoted 11 lines · Avi Kivity
Quoted 8 lines · Alexander Graf
Hi,
When transitioning from KVM to the qemu userspace, we try to get and push a whole bunch of MSR values, including the SYSENTER ones. While this is basically a good idea, qemu doesn't know anything about SYSENTER on
x86_64, which is an additional feature only available on Intel CPUs and thus definesSYSENTER_EIPandSYSENTER_ESPas 32-bit values.Because we're saving/restoring the SYSENTER values on transitions to userspace and the values in
env->cpuonly hold 32 bits, they get truncated to 32-bit. The easiest way around this is to widen the fields to 64 bits. This should not disturb the current functionality, but allows us to run 32-bit code onx86_64using VMX.As this is KVM specific for now, I'll only CC the qemu mailinglist, but wouldn't encourage qemu to take the patch for now, as it's not necessary when emulating an AMD CPU.
Applied, thanks. I imagine save/restore support needs updating as well?
Yes, it does. Thanks for the reminder.
Quoted 2 lines
That should go into qemuy btw since maintaining the save/restore
format across forks isn't possible.
I'll just write up a patch that implements IA-32e sysenter in qemu after vacation. That should fix the KVM issues too. For now it's good we have a workaround that works in "most cases" at least.
Alex
Quoted 2 lines · Alexander Graf
For now it's good we have a workaround that works in "most cases" at least.
That's what the DANGEROUS label is for.
Signature · 1 line
error compiling committee.c: too many arguments to function