diff --git a/ArmVirtPkg/ArmVirtXen.dsc b/ArmVirtPkg/ArmVirtXen.dsc index 175b56d10c..8878912e6b 100644 --- a/ArmVirtPkg/ArmVirtXen.dsc +++ b/ArmVirtPkg/ArmVirtXen.dsc @@ -36,6 +36,7 @@ RealTimeClockLib|ArmVirtPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf XenHypercallLib|OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf + ArmGenericTimerCounterLib|ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.inf ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf diff --git a/ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.c b/ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.c new file mode 100644 index 0000000000..75c2816845 --- /dev/null +++ b/ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.c @@ -0,0 +1,146 @@ +/** @file + + Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR> + Copyright (c) 2014 - 2018, Linaro Ltd. All rights reserved.<BR> + + 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. + +**/ + +#include <Library/ArmGenericTimerCounterLib.h> +#include <Library/ArmLib.h> + +VOID +EFIAPI +ArmGenericTimerEnableTimer ( + VOID + ) +{ + UINTN TimerCtrlReg; + + TimerCtrlReg = ArmReadCntvCtl (); + TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; + ArmWriteCntvCtl (TimerCtrlReg); +} + +VOID +EFIAPI +ArmGenericTimerReenableTimer ( + VOID + ) +{ + UINTN TimerCtrlReg; + + TimerCtrlReg = ArmReadCntvCtl (); + TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; + + // + // When running under Xen, we need to unmask the interrupt on the timer side + // as Xen will mask it when servicing the interrupt at the hypervisor level + // and delivering the virtual timer interrupt to the guest. Otherwise, the + // interrupt will fire again, trapping into the hypervisor again, etc. etc. + // + TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK; + ArmWriteCntvCtl (TimerCtrlReg); +} + +VOID +EFIAPI +ArmGenericTimerDisableTimer ( + VOID + ) +{ + UINTN TimerCtrlReg; + + TimerCtrlReg = ArmReadCntvCtl (); + TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; + ArmWriteCntvCtl (TimerCtrlReg); +} + +VOID +EFIAPI +ArmGenericTimerSetTimerFreq ( + IN UINTN FreqInHz + ) +{ + ArmWriteCntFrq (FreqInHz); +} + +UINTN +EFIAPI +ArmGenericTimerGetTimerFreq ( + VOID + ) +{ + return ArmReadCntFrq (); +} + +UINTN +EFIAPI +ArmGenericTimerGetTimerVal ( + VOID + ) +{ + return ArmReadCntvTval (); +} + + +VOID +EFIAPI +ArmGenericTimerSetTimerVal ( + IN UINTN Value + ) +{ + ArmWriteCntvTval (Value); +} + +UINT64 +EFIAPI +ArmGenericTimerGetSystemCount ( + VOID + ) +{ + return ArmReadCntvCt (); +} + +UINTN +EFIAPI +ArmGenericTimerGetTimerCtrlReg ( + VOID + ) +{ + return ArmReadCntvCtl (); +} + +VOID +EFIAPI +ArmGenericTimerSetTimerCtrlReg ( + UINTN Value + ) +{ + ArmWriteCntvCtl (Value); +} + +UINT64 +EFIAPI +ArmGenericTimerGetCompareVal ( + VOID + ) +{ + return ArmReadCntvCval (); +} + +VOID +EFIAPI +ArmGenericTimerSetCompareVal ( + IN UINT64 Value + ) +{ + ArmWriteCntvCval (Value); +} diff --git a/ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.inf b/ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.inf new file mode 100644 index 0000000000..bd6ac80398 --- /dev/null +++ b/ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.inf @@ -0,0 +1,33 @@ +#/** @file +# Implement ArmGenericTimerCounterLib for Xen using the virtual timer +# +# Copyright (c) 2014 - 2018, Linaro Ltd. All rights reserved.<BR> +# +# 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. +# +# +#**/ + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = XenArmGenericTimerVirtCounterLib + FILE_GUID = e3913319-96ac-4ac0-808b-8edb8776a51c + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmGenericTimerCounterLib + +[Sources] + XenArmGenericTimerVirtCounterLib.c + +[Packages] + MdePkg/MdePkg.dec + ArmPkg/ArmPkg.dec + +[LibraryClasses] + ArmLib + BaseLib