@@ -280,6 +280,8 @@ enum x86_intercept {
x86_intercept_clts,
x86_intercept_lmsw,
x86_intercept_smsw,
+ x86_intercept_dr_read,
+ x86_intercept_dr_write,
x86_intercept_lidt,
x86_intercept_sidt,
x86_intercept_lgdt,
@@ -2510,9 +2510,9 @@ static struct opcode twobyte_table[256] = {
N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N,
/* 0x20 - 0x2F */
DI(ModRM | DstMem | Priv | Op3264, cr_read),
- D(ModRM | DstMem | Priv | Op3264),
+ DI(ModRM | DstMem | Priv | Op3264, dr_read),
DI(ModRM | SrcMem | Priv | Op3264, cr_write),
- D(ModRM | SrcMem | Priv | Op3264),
+ DI(ModRM | SrcMem | Priv | Op3264, dr_write),
N, N, N, N,
N, N, N, N, N, N, N, N,
/* 0x30 - 0x3F */
@@ -3885,6 +3885,8 @@ static struct __x86_intercept {
[x86_intercept_clts] = POST_EX(SVM_EXIT_WRITE_CR0),
[x86_intercept_lmsw] = POST_EX(SVM_EXIT_WRITE_CR0),
[x86_intercept_smsw] = POST_EX(SVM_EXIT_READ_CR0),
+ [x86_intercept_dr_read] = POST_EX(SVM_EXIT_READ_DR0),
+ [x86_intercept_dr_write] = POST_EX(SVM_EXIT_WRITE_DR0),
};
#undef POST_EX
@@ -3941,6 +3943,10 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,
break;
}
+ case SVM_EXIT_READ_DR0:
+ case SVM_EXIT_WRITE_DR0:
+ icpt_info.exit_code += reg;
+ break;
default:
break;
}