From 878ddf1fc3540a715f63594ed22b6929e881afb4 Mon Sep 17 00:00:00 2001 From: bbahnsen Date: Fri, 21 Apr 2006 22:54:32 +0000 Subject: Initial import. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524 --- .../BaseTimerLibLocalApic/Ipf/CallPalProc.s | 38 +++++ .../BaseTimerLibLocalApic/Ipf/IpfTimerLib.c | 155 +++++++++++++++++++++ MdePkg/Library/BaseTimerLibLocalApic/Ipf/ReadItc.s | 25 ++++ 3 files changed, 218 insertions(+) create mode 100644 MdePkg/Library/BaseTimerLibLocalApic/Ipf/CallPalProc.s create mode 100644 MdePkg/Library/BaseTimerLibLocalApic/Ipf/IpfTimerLib.c create mode 100644 MdePkg/Library/BaseTimerLibLocalApic/Ipf/ReadItc.s (limited to 'MdePkg/Library/BaseTimerLibLocalApic/Ipf') diff --git a/MdePkg/Library/BaseTimerLibLocalApic/Ipf/CallPalProc.s b/MdePkg/Library/BaseTimerLibLocalApic/Ipf/CallPalProc.s new file mode 100644 index 0000000000..18b0f5815a --- /dev/null +++ b/MdePkg/Library/BaseTimerLibLocalApic/Ipf/CallPalProc.s @@ -0,0 +1,38 @@ +/// @file +/// Contains an implementation of CallPalProcStatic on Itanium-based +/// architecture. +/// +/// Copyright (c) 2006, Intel Corporation +/// All rights reserved. This program and the accompanying materials +/// are licensed and made available under the terms and conditions of the BSD License +/// which accompanies this distribution. The full text of the license may be found at +/// http://opensource.org/licenses/bsd-license.php +/// +/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +/// +/// Module Name: CallPalProc.s +/// +/// + +.auto +.text + +.proc CallPalProcStatic +.type CallPalProcStatic, @function +CallPalProcStatic:: + mov r9 = ar.k5 + mov r8 = ip + add r8 = (PalProcReturn - CallPalProcStatic), r8 + mov r28 = r32 + mov b7 = r9 + mov r29 = r33 + mov r30 = r34 + mov r31 = r35 + mov r32 = b0 + mov b0 = r8 + br.sptk b7 +PalProcReturn: + mov b0 = r32 + br.ret.sptk.many b0 +.endp CallPalProcStatic diff --git a/MdePkg/Library/BaseTimerLibLocalApic/Ipf/IpfTimerLib.c b/MdePkg/Library/BaseTimerLibLocalApic/Ipf/IpfTimerLib.c new file mode 100644 index 0000000000..652cc7e6e4 --- /dev/null +++ b/MdePkg/Library/BaseTimerLibLocalApic/Ipf/IpfTimerLib.c @@ -0,0 +1,155 @@ +/** @file + Timer Library functions built upon local APIC on IA32/x64. + + @bug Should use PCD to retrieve all the constants including index of + the IA32_APIC_BASE MSR, the offsets of InitialCount, CorrentCount + and DivideConfiguration. + + Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Module Name: IpfTimerLib.c + +**/ + +UINT64 +ReadItc ( + VOID + ); + +typedef struct { + UINT64 Status; + UINT64 r9; + UINT64 r10; + UINT64 r11; +} PAL_PROC_RETURN; + +PAL_PROC_RETURN +CallPalProcStatic ( + IN UINT64 Arg1, + IN UINT64 Arg2, + IN UINT64 Arg3, + IN UINT64 Arg4 + ); + +/** + Stalls the CPU for at least the given number of microseconds. + + Stalls the CPU for the number of microseconds specified by MicroSeconds. + + @param MicroSeconds The minimum number of microseconds to delay. + + @return The ticks delayed actually. + +**/ +UINTN +EFIAPI +MicroSecondDelay ( + IN UINTN MicroSeconds + ) +{ + UINT64 Ticks; + UINT64 Delay; + + Ticks = GetPerformanceCounter (); + Delay = GetPerformanceCounterProperties (NULL, NULL) * MicroSeconds / 1000000; + while (Ticks + Delay < GetPerformanceCounter ()); + return (UINTN)Delay; +} + +/** + Stalls the CPU for at least the given number of nanoseconds. + + Stalls the CPU for the number of nanoseconds specified by NanoSeconds. + + @param NanoSeconds The minimum number of nanoseconds to delay. + + @return The ticks delayed actually. + +**/ +UINTN +EFIAPI +NanoSecondDelay ( + IN UINTN NanoSeconds + ) +{ + UINT64 Ticks; + UINT64 Delay; + + Ticks = GetPerformanceCounter (); + Delay = GetPerformanceCounterProperties (NULL, NULL) * NanoSeconds / 1000000000; + while (Ticks + Delay < GetPerformanceCounter ()); + return (UINTN)Delay; +} + +/** + 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 ReadItc (); +} + +/** + Retrieves the 64-bit frequency in Hz and the range of performance counter + values. + + If StartValue is not NULL, then the value that the performance counter starts + with immediately after is it rolls over is returned in StartValue. If + EndValue is not NULL, then the value that the performance counter end with + immediately before it rolls over is returned in EndValue. The 64-bit + frequency of the performance counter in Hz is always returned. If StartValue + is less than EndValue, then the performance counter counts up. If StartValue + is greater than EndValue, then the performance counter counts down. For + example, a 64-bit free running counter that counts up would have a StartValue + of 0 and an EndValue of 0xFFFFFFFFFFFFFFFF. A 24-bit free running counter + that counts down would have a StartValue of 0xFFFFFF and an EndValue of 0. + + @param StartValue The value the performance counter starts with when it + rolls over. + @param EndValue The value that the performance counter ends with before + it rolls over. + + @return The frequency in Hz. + +**/ +UINT64 +EFIAPI +GetPerformanceCounterProperties ( + IN UINT64 *StartValue, + IN UINT64 *EndValue + ) +{ + PAL_PROC_RETURN PalRet; + UINT64 BaseFrequence; + + PalRet = CallPalProcStatic (13, 0, 0, 0); + ASSERT (PalRet.Status == 0); + BaseFrequence = PalRet.r9; + + PalRet = CallPalProcStatic (14, 0, 0, 0); + ASSERT (PalRet.Status == 0); + + *StartValue = 0; + *EndValue = (UINT64)(-1); + return BaseFrequence * (PalRet.r11 >> 32) / (UINT32)PalRet.r11; +} diff --git a/MdePkg/Library/BaseTimerLibLocalApic/Ipf/ReadItc.s b/MdePkg/Library/BaseTimerLibLocalApic/Ipf/ReadItc.s new file mode 100644 index 0000000000..383bb242ba --- /dev/null +++ b/MdePkg/Library/BaseTimerLibLocalApic/Ipf/ReadItc.s @@ -0,0 +1,25 @@ +/// @file +/// Contains an implementation of ReadItc on Itanium-based architecture. +/// +/// Copyright (c) 2006, Intel Corporation +/// All rights reserved. This program and the accompanying materials +/// are licensed and made available under the terms and conditions of the BSD License +/// which accompanies this distribution. The full text of the license may be found at +/// http://opensource.org/licenses/bsd-license.php +/// +/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +/// +/// Module Name: ReadItc.s +/// +/// + +.auto +.text + +.proc ReadItc +.type ReadItc, @function +ReadItc:: + mov r8 = ar.itc + br.ret.sptk.many b0 +.endp ReadItc \ No newline at end of file -- cgit v1.2.3