@@ -664,7 +664,7 @@ GUEST_CODE static noinline void init_vmcs_control_fields(uint64 cpu_id, uint64 v
664664
665665 // Setup Secondary Processor-Based controls: enable EPT.
666666 vmx_msr = (uint32 )rdmsr (X86_MSR_IA32_VMX_PROCBASED_CTLS2 );
667- vmx_msr |= SECONDARY_EXEC_ENABLE_EPT ;
667+ vmx_msr |= SECONDARY_EXEC_ENABLE_EPT | SECONDARY_EXEC_ENABLE_RDTSCP ;
668668 vmwrite (VMCS_SECONDARY_VM_EXEC_CONTROL , vmx_msr );
669669
670670 // Read and write Primary Processor-Based controls from TRUE MSR.
@@ -728,6 +728,7 @@ typedef enum {
728728 SYZOS_NESTED_EXIT_REASON_INVD = 2 ,
729729 SYZOS_NESTED_EXIT_REASON_CPUID = 3 ,
730730 SYZOS_NESTED_EXIT_REASON_RDTSC = 4 ,
731+ SYZOS_NESTED_EXIT_REASON_RDTSCP = 5 ,
731732 SYZOS_NESTED_EXIT_REASON_UNKNOWN = 0xFF ,
732733} syz_nested_exit_reason ;
733734
@@ -747,6 +748,7 @@ GUEST_CODE static void guest_uexit_l2(uint64 exit_reason, syz_nested_exit_reason
747748#define EXIT_REASON_HLT 0xc
748749#define EXIT_REASON_INVD 0xd
749750#define EXIT_REASON_RDTSC 0x10
751+ #define EXIT_REASON_RDTSCP 0x33
750752
751753GUEST_CODE static syz_nested_exit_reason map_intel_exit_reason (uint64 basic_reason )
752754{
@@ -760,6 +762,8 @@ GUEST_CODE static syz_nested_exit_reason map_intel_exit_reason(uint64 basic_reas
760762 return SYZOS_NESTED_EXIT_REASON_CPUID ;
761763 if (reason == EXIT_REASON_RDTSC )
762764 return SYZOS_NESTED_EXIT_REASON_RDTSC ;
765+ if (reason == EXIT_REASON_RDTSCP )
766+ return SYZOS_NESTED_EXIT_REASON_RDTSCP ;
763767 return SYZOS_NESTED_EXIT_REASON_UNKNOWN ;
764768}
765769
@@ -769,8 +773,12 @@ GUEST_CODE static void advance_l2_rip_intel(uint64 basic_reason)
769773 volatile uint64 reason = basic_reason ;
770774 uint64 rip = vmread (VMCS_GUEST_RIP );
771775 if ((reason == EXIT_REASON_INVD ) || (reason == EXIT_REASON_CPUID ) ||
772- (reason == EXIT_REASON_RDTSC ))
776+ (reason == EXIT_REASON_RDTSC )) {
773777 rip += 2 ;
778+ } else if (reason == EXIT_REASON_RDTSCP ) {
779+ // We insist on a single-line compound statement for else-if.
780+ rip += 3 ;
781+ }
774782 vmwrite (VMCS_GUEST_RIP , rip );
775783}
776784
@@ -833,6 +841,7 @@ __attribute__((naked)) GUEST_CODE static void nested_vm_exit_handler_intel_asm(v
833841#define VMEXIT_CPUID 0x72
834842#define VMEXIT_INVD 0x76
835843#define VMEXIT_HLT 0x78
844+ #define VMEXIT_RDTSCP 0x87
836845
837846GUEST_CODE static syz_nested_exit_reason map_amd_exit_reason (uint64 basic_reason )
838847{
@@ -846,6 +855,8 @@ GUEST_CODE static syz_nested_exit_reason map_amd_exit_reason(uint64 basic_reason
846855 return SYZOS_NESTED_EXIT_REASON_CPUID ;
847856 if (reason == VMEXIT_RDTSC )
848857 return SYZOS_NESTED_EXIT_REASON_RDTSC ;
858+ if (reason == VMEXIT_RDTSCP )
859+ return SYZOS_NESTED_EXIT_REASON_RDTSCP ;
849860 return SYZOS_NESTED_EXIT_REASON_UNKNOWN ;
850861}
851862
@@ -856,8 +867,12 @@ GUEST_CODE static void advance_l2_rip_amd(uint64 basic_reason, uint64 cpu_id, ui
856867 uint64 vmcb_addr = X86_SYZOS_ADDR_VMCS_VMCB (cpu_id , vm_id );
857868 uint64 rip = vmcb_read64 ((volatile uint8 * )vmcb_addr , VMCB_GUEST_RIP );
858869 if ((reason == VMEXIT_INVD ) || (reason == VMEXIT_CPUID ) ||
859- (reason == VMEXIT_RDTSC ))
870+ (reason == VMEXIT_RDTSC )) {
860871 rip += 2 ;
872+ } else if (reason == VMEXIT_RDTSCP ) {
873+ // We insist on a single-line compound statement for else-if.
874+ rip += 3 ;
875+ }
861876 vmcb_write64 (vmcb_addr , VMCB_GUEST_RIP , rip );
862877}
863878
0 commit comments