@@ -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,11 @@ 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+ rip += 3 ;
780+ }
774781 vmwrite (VMCS_GUEST_RIP , rip );
775782}
776783
@@ -833,6 +840,7 @@ __attribute__((naked)) GUEST_CODE static void nested_vm_exit_handler_intel_asm(v
833840#define VMEXIT_CPUID 0x72
834841#define VMEXIT_INVD 0x76
835842#define VMEXIT_HLT 0x78
843+ #define VMEXIT_RDTSCP 0x87
836844
837845GUEST_CODE static syz_nested_exit_reason map_amd_exit_reason (uint64 basic_reason )
838846{
@@ -846,6 +854,8 @@ GUEST_CODE static syz_nested_exit_reason map_amd_exit_reason(uint64 basic_reason
846854 return SYZOS_NESTED_EXIT_REASON_CPUID ;
847855 if (reason == VMEXIT_RDTSC )
848856 return SYZOS_NESTED_EXIT_REASON_RDTSC ;
857+ if (reason == VMEXIT_RDTSCP )
858+ return SYZOS_NESTED_EXIT_REASON_RDTSCP ;
849859 return SYZOS_NESTED_EXIT_REASON_UNKNOWN ;
850860}
851861
@@ -856,8 +866,11 @@ GUEST_CODE static void advance_l2_rip_amd(uint64 basic_reason, uint64 cpu_id, ui
856866 uint64 vmcb_addr = X86_SYZOS_ADDR_VMCS_VMCB (cpu_id , vm_id );
857867 uint64 rip = vmcb_read64 ((volatile uint8 * )vmcb_addr , VMCB_GUEST_RIP );
858868 if ((reason == VMEXIT_INVD ) || (reason == VMEXIT_CPUID ) ||
859- (reason == VMEXIT_RDTSC ))
869+ (reason == VMEXIT_RDTSC )) {
860870 rip += 2 ;
871+ } else if (reason == VMEXIT_RDTSCP ) {
872+ rip += 3 ;
873+ }
861874 vmcb_write64 (vmcb_addr , VMCB_GUEST_RIP , rip );
862875}
863876
0 commit comments