@@ -3636,12 +3636,40 @@ static int svm_insn_intercepted(struct kvm_vcpu *vcpu,
goto out;
switch (c->b) {
+ case 0x00:
+ switch (c->modrm_reg) {
+ case 0x00: /* SLDT */
+ vmcb->control.exit_code = SVM_EXIT_LDTR_READ;
+ break;
+ case 0x01: /* STR */
+ vmcb->control.exit_code = SVM_EXIT_TR_READ;
+ break;
+ case 0x02: /* LLDT */
+ vmcb->control.exit_code = SVM_EXIT_LDTR_WRITE;
+ break;
+ case 0x03: /* LTR */
+ vmcb->control.exit_code = SVM_EXIT_TR_WRITE;
+ break;
+ }
+ break;
case 0x01:
/* 0x0f 0x01 and modrm_mod == 3 encodes special instructions */
if (c->modrm_mod == 3)
break;
switch (c->modrm_reg) {
+ case 0x00: /* SGDT */
+ vmcb->control.exit_code = SVM_EXIT_GDTR_READ;
+ break;
+ case 0x01: /* SIDT */
+ vmcb->control.exit_code = SVM_EXIT_IDTR_READ;
+ break;
+ case 0x02: /* LGDT */
+ vmcb->control.exit_code = SVM_EXIT_GDTR_WRITE;
+ break;
+ case 0x03: /* LIDT */
+ vmcb->control.exit_code = SVM_EXIT_IDTR_WRITE;
+ break;
case 0x04: /* SMSW */
vmcb->control.exit_code = SVM_EXIT_READ_CR0;
break;