@@ -4174,6 +4174,24 @@ x86_emulate(
switch( modrm )
{
+#ifdef __XEN__
+ case 0xd1: /* xsetbv */
+ {
+ unsigned long cr4;
+
+ if ( vex.pfx )
+ break;
+ if ( !ops->read_cr || ops->read_cr(4, &cr4, ctxt) != X86EMUL_OKAY )
+ cr4 = 0;
+ generate_exception_if(!(cr4 & X86_CR4_OSXSAVE), EXC_UD, -1);
+ generate_exception_if(!mode_ring0() ||
+ handle_xsetbv(_regs._ecx,
+ _regs._eax | (_regs.rdx << 32)),
+ EXC_GP, 0);
+ goto no_writeback;
+ }
+#endif
+
case 0xdf: /* invlpga */
generate_exception_if(!in_protmode(ctxt, ops), EXC_UD, -1);
generate_exception_if(!mode_ring0(), EXC_GP, 0);