Starting with Windows 8 / Windows 2012 Server, during its boot process the operating system will reset the TSC (TimeStampCounter, which increments by 1 for each passed cycle) on CPU0. It does not reset the TSC of the other vCPUs and the resulting discrepancy between two vCPUs' TSC can result in the OS not booting past the Windows splash screen, and a full power off and on will fix it.

 

Code to change on all Windows8/Server2012 VMs via PowerCLI:
  ForEach ($vm in (Get-VM)){

    $vmv = Get-VM $vm | Get-View

    $name = $vmv.Name

    $guestid = $vmv.Summary.Config.GuestId

    $state = $vmv.Summary.Runtime.PowerState

    $vmx = New-Object VMware.Vim.VirtualMachineConfigSpec

    $vmx.extraConfig += New-Object VMware.Vim.OptionValue

    $vmx.extraConfig[0].key = "monitor_control.enable_softResetClearTSC"

    $vmx.extraConfig[0].value = "TRUE"

    if ($guestid -like "windows8*Guest") {

    ($vmv).ReconfigVM_Task($vmx)

    if ($state -eq "poweredOn") {

    $vmv.MigrateVM_Task($null, $_.Runtime.Host, 'highPriority', $null)

    }

    }

    }

 

 

This will basically tell the vmx file that the TSC for all vCPUs should be reset to zero on a soft reset of the machine, and not just CPU0.