/** Stalls the CPU for at least the given number of ticks. Stalls the CPU for at least the given number of ticks. It's invoked by MicroSecondDelay() and NanoSecondDelay(). @param Delay A period of time to delay in ticks. **/ STATIC VOID InternalAcpiDelay ( IN UINT32 Delay ) { UINT32 Ticks; UINT32 Times; Times = Delay >> (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 2); Delay &= (1 << (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 2)) - 1; do { // // The target timer count is calculated here // Ticks = InternalAcpiGetTimerTick () + Delay; Delay = 1 << (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 2); // // Wait until time out // Delay >= 2^23 (if ACPI provide 24-bit timer) or Delay >= 2^31 (if ACPI // provide 32-bit timer) could not be handled by this function // Timer wrap-arounds are handled correctly by this function // while (((Ticks - InternalAcpiGetTimerTick ()) & (1 << (gAcpiDesc->PM_TMR_BLK.RegisterBitWidth - 1))) == 0) { CpuPause (); } } while (Times-- > 0); }
/** Stalls the CPU for at least the given number of ticks. Stalls the CPU for at least the given number of ticks. It's invoked by MicroSecondDelay() and NanoSecondDelay(). @param Delay A period of time to delay in ticks. **/ STATIC VOID InternalAcpiDelay ( IN UINT32 Delay ) { UINT32 Ticks; UINT32 Times; Times = Delay >> 22; Delay &= BIT22 - 1; do { // // The target timer count is calculated here // Ticks = InternalAcpiGetTimerTick () + Delay; Delay = BIT22; // // Wait until time out // Delay >= 2^23 could not be handled by this function // Timer wrap-arounds are handled correctly by this function // while (((Ticks - InternalAcpiGetTimerTick ()) & BIT23) == 0) { CpuPause (); } } while (Times-- > 0); }
/** Retrieves the current value of a 64-bit free running performance counter. Retrieves the current value of a 64-bit free running performance counter. The counter can either count up by 1 or count down by 1. If the physical performance counter counts by a larger increment, then the counter values must be translated. The properties of the counter can be retrieved from GetPerformanceCounterProperties(). @return The current value of the free running performance counter. **/ UINT64 EFIAPI GetPerformanceCounter ( VOID ) { return (UINT64)InternalAcpiGetTimerTick (); }
/** Retrieves the current value of a 64-bit free running performance counter. Retrieves the current value of a 64-bit free running performance counter. The counter can either count up by 1 or count down by 1. If the physical performance counter counts by a larger increment, then the counter values must be translated. The properties of the counter can be retrieved from GetPerformanceCounterProperties(). @return The current value of the free running performance counter. **/ UINT64 EFIAPI GetPerformanceCounter ( VOID ) { if (InternalGetApciDescrptionTable() == NULL) { return 0; } return (UINT64)InternalAcpiGetTimerTick (); }