Fix softtsc for AMD-V
PATCH 1/1 Fix softtsc for AMD-V
The softtsc code for AMD does not update the ip; enabling it on AMD-V results in the domain spinning on the RDTSC instruction. The patch is against xen-unstable 18331.
Signed-off-by John Byrne <[email protected]>
xen/arch/x86/hvm/svm/emulate.c +3 -1
@@ -71,6 +71,7 @@ MAKE_INSTR(VMCALL, 3, 0x0f, 0x01, 0xd9);MAKE_INSTR (VMCALL ,3 ,0x0f ,0x01 ,0xd9 );MAKE_INSTR (HLT ,1 ,0xf4 );MAKE_INSTR (INT3 ,1 ,0xcc ); +MAKE_INSTR (RDTSC ,2 ,0x0f ,0x31 );static const u8 *opc_bytes[INSTR_MAX_COUNT ] = {
@@ -81,7 +82,8 @@ static const u8 *opc_bytes[INSTR_MAX_COU [INSTR_WRMSR] = OPCODE_WRMSR, [INSTR_VMCALL] = OPCODE_VMCALL, [INSTR_HLT] = OPCODE_HLT, - [INSTR_INT3] = OPCODE_INT3 + [INSTR_INT3] = OPCODE_INT3, + [INSTR_RDTSC] = OPCODE_RDTSC };static int fetch (struct vcpu *v,u8 *buf,unsigned long addr,int len)
xen/arch/x86/hvm/svm/svm.c +12 -1
@@ -1128,6 +1128,17 @@ static void svm_vmexit_do_hlt(struct vmchvm_hlt (regs->eflags); } +static void svm_vmexit_do_rdtsc (struct cpu_user_regs *regs) +{ +unsigned int inst_len; + +if ( (inst_len =__get_instruction_length (current,INSTR_RDTSC )) ==0 ) +return ; +__update_guest_eip (regs, inst_len); + +hvm_rdtsc_intercept (regs); +} +static void wbinvd_ipi (void *info) {wbinvd ();
@@ -1344,7 +1355,7 @@ asmlinkage void svm_vmexit_handler(strucbreak ;case VMEXIT_RDTSC : -hvm_rdtsc_intercept (regs); +svm_vmexit_do_rdtsc (regs);break ;case VMEXIT_RDTSCP :
xen/include/asm-x86/hvm/svm/emulate.h +1 -0
@@ -30,6 +30,7 @@ enum instruction_index {INSTR_VMCALL ,INSTR_HLT ,INSTR_INT3 , +INSTR_RDTSC , INSTR_MAX_COUNT /* Must be last - Number of instructions supported */ };
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel