[PATCH v1 1/2] x86/viridian: Workaround Hyper-V GP fault writing to MSR
Ross Lagerwall <[email protected]>
| Newsgroups | gmane.comp.emulators.xen.devel |
|---|---|
| Message-ID | <[email protected]> |
The Viridian spec requires the vector to be >= 0x10 when writing to the SINTx MSR, otherwise it should #GP fault. The spec-defined initial value is 0x0000000000010000, i.e. the vector is 0. On startup, for some reason Windows 11 Hyper-V tries to set the MSR to the spec-defined initial value and since the vector is 0, it GP faults. To workaround this, treat the write as a no-op if the value is unchanged. Signed-off-by: Ross Lagerwall <[email protected]> --- xen/arch/x86/hvm/viridian/synic.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xen/arch/x86/hvm/viridian/synic.c b/xen/arch/x86/hvm/viridian/synic.c index e6cba7548f1b..37ddff201a6b 100644 --- a/xen/arch/x86/hvm/viridian/synic.c +++ b/xen/arch/x86/hvm/viridian/synic.c @@ -157,6 +157,9 @@ int viridian_synic_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val) if ( !(viridian_feature_mask(d) & HVMPV_synic) ) return X86EMUL_EXCEPTION; + if ( val == vs->as_uint64 ) + break; + /* Vectors must be in the range 0x10-0xff inclusive */ new.as_uint64 = val; if ( new.vector < 0x10 ) -- 2.53.0