[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 25/29] Ovmf/Xen: implement dummy RealTimeClockLib for Xen



On 01/26/15 20:03, Ard Biesheuvel wrote:
> This implements a dummy RealTimeClockLib for Xen, as there is no
> guest interface to access the time kept by Xen that can be shared
> between UEFI and the OS.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>
> ---
>  OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.c   | 196 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf |  38 
> ++++++++++++++++
>  2 files changed, 234 insertions(+)
> 
> diff --git a/OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.c 
> b/OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.c
> new file mode 100644
> index 000000000000..70204ac22a92
> --- /dev/null
> +++ b/OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.c
> @@ -0,0 +1,196 @@
> +/** @file
> +  Implement EFI RealTimeClock runtime services via Xen shared info page
> +
> +  Copyright (c) 2015, 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 <Uefi.h>
> +#include <PiDxe.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +
> +/**
> +  Converts Epoch seconds (elapsed since 1970 JANUARY 01, 00:00:00 UTC) to 
> EFI_TIME
> + **/
> +STATIC
> +VOID
> +EpochToEfiTime (
> +  IN  UINTN     EpochSeconds,
> +  OUT EFI_TIME  *Time
> +  )
> +{
> +  UINTN         a;
> +  UINTN         b;
> +  UINTN         c;
> +  UINTN         d;
> +  UINTN         g;
> +  UINTN         j;
> +  UINTN         m;
> +  UINTN         y;
> +  UINTN         da;
> +  UINTN         db;
> +  UINTN         dc;
> +  UINTN         dg;
> +  UINTN         hh;
> +  UINTN         mm;
> +  UINTN         ss;
> +  UINTN         J;
> +
> +  J  = (EpochSeconds / 86400) + 2440588;
> +  j  = J + 32044;
> +  g  = j / 146097;
> +  dg = j % 146097;
> +  c  = (((dg / 36524) + 1) * 3) / 4;
> +  dc = dg - (c * 36524);
> +  b  = dc / 1461;
> +  db = dc % 1461;
> +  a  = (((db / 365) + 1) * 3) / 4;
> +  da = db - (a * 365);
> +  y  = (g * 400) + (c * 100) + (b * 4) + a;
> +  m  = (((da * 5) + 308) / 153) - 2;
> +  d  = da - (((m + 4) * 153) / 5) + 122;
> +
> +  Time->Year  = y - 4800 + ((m + 2) / 12);
> +  Time->Month = ((m + 2) % 12) + 1;
> +  Time->Day   = d + 1;
> +
> +  ss = EpochSeconds % 60;
> +  a  = (EpochSeconds - ss) / 60;
> +  mm = a % 60;
> +  b = (a - mm) / 60;
> +  hh = b % 24;
> +
> +  Time->Hour        = hh;
> +  Time->Minute      = mm;
> +  Time->Second      = ss;
> +  Time->Nanosecond  = 0;
> +
> +}
> +
> +/**
> +  Returns the current time and date information, and the time-keeping 
> capabilities
> +  of the hardware platform.
> +
> +  @param  Time                  A pointer to storage to receive a snapshot 
> of the current time.
> +  @param  Capabilities          An optional pointer to a buffer to receive 
> the real time clock
> +                                device's capabilities.
> +
> +  @retval EFI_SUCCESS           The operation completed successfully.
> +  @retval EFI_INVALID_PARAMETER Time is NULL.
> +  @retval EFI_DEVICE_ERROR      The time could not be retrieved due to 
> hardware error.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibGetTime (
> +  OUT EFI_TIME                *Time,
> +  OUT  EFI_TIME_CAPABILITIES  *Capabilities
> +  )
> +{
> +  ASSERT (Time != NULL);
> +
> +  //
> +  // For now, there is nothing that we can do besides returning a bogus time,
> +  // as Xen's timekeeping uses a shared info page which cannot be shared
> +  // between UEFI and the OS
> +  //
> +  EpochToEfiTime(1421770011, Time);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Sets the current local time and date information.
> +
> +  @param  Time                  A pointer to the current time.
> +
> +  @retval EFI_SUCCESS           The operation completed successfully.
> +  @retval EFI_INVALID_PARAMETER A time field is out of range.
> +  @retval EFI_DEVICE_ERROR      The time could not be set due due to 
> hardware error.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibSetTime (
> +  IN EFI_TIME                *Time
> +  )
> +{
> +  return EFI_DEVICE_ERROR;
> +}
> +
> +
> +/**
> +  Returns the current wakeup alarm clock setting.
> +
> +  @param  Enabled               Indicates if the alarm is currently enabled 
> or disabled.
> +  @param  Pending               Indicates if the alarm signal is pending and 
> requires acknowledgement.
> +  @param  Time                  The current alarm setting.
> +
> +  @retval EFI_SUCCESS           The alarm settings were returned.
> +  @retval EFI_INVALID_PARAMETER Any parameter is NULL.
> +  @retval EFI_DEVICE_ERROR      The wakeup time could not be retrieved due 
> to a hardware error.
> +  @retval EFI_UNSUPPORTED       A wakeup timer is not supported on this 
> platform.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibGetWakeupTime (
> +  OUT BOOLEAN     *Enabled,
> +  OUT BOOLEAN     *Pending,
> +  OUT EFI_TIME    *Time
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Sets the system wakeup alarm clock time.
> +
> +  @param  Enabled               Enable or disable the wakeup alarm.
> +  @param  Time                  If Enable is TRUE, the time to set the 
> wakeup alarm for.
> +
> +  @retval EFI_SUCCESS           If Enable is TRUE, then the wakeup alarm was 
> enabled. If
> +                                Enable is FALSE, then the wakeup alarm was 
> disabled.
> +  @retval EFI_INVALID_PARAMETER A time field is out of range.
> +  @retval EFI_DEVICE_ERROR      The wakeup time could not be set due to a 
> hardware error.
> +  @retval EFI_UNSUPPORTED       A wakeup timer is not supported on this 
> platform.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibSetWakeupTime (
> +  IN BOOLEAN      Enabled,
> +  OUT EFI_TIME    *Time
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  This is the declaration of an EFI image entry point. This can be the entry 
> point to an application
> +  written to this specification, an EFI boot service driver, or an EFI 
> runtime driver.
> +
> +  @param  ImageHandle           Handle that identifies the loaded image.
> +  @param  SystemTable           System Table for this image.
> +
> +  @retval EFI_SUCCESS           The operation completed successfully.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +LibRtcInitialize (
> +  IN EFI_HANDLE                            ImageHandle,
> +  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> diff --git a/OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf 
> b/OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf
> new file mode 100644
> index 000000000000..aafbfda6b491
> --- /dev/null
> +++ b/OvmfPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf
> @@ -0,0 +1,38 @@
> +#/** @file
> +#
> +# Copyright (c) 2015, L 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                    = 0x00010005
> +  BASE_NAME                      = XenRealTimeClockLib
> +  FILE_GUID                      = EC2557E8-7005-430B-9F6F-9BA109698248
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = RealTimeClockLib|DXE_CORE DXE_DRIVER 
> UEFI_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION
> +
> +[Sources.common]
> +  XenRealTimeClockLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  OvmfPkg/OvmfPkg.dec
> +  EmbeddedPkg/EmbeddedPkg.dec
> +
> +[LibraryClasses]
> +  UefiLib
> +  DebugLib
> +  DxeServicesTableLib
> +  UefiRuntimeLib
> +
> +[Guids]
> +  gEfiEventVirtualAddressChangeGuid
> 

I think this library belongs under
"ArmPlatformPkg/ArmVirtualizationPkg/Library/".

The RealTimeClockLib library class (interface) is declared in
"EmbeddedPkg/Include/Library/RealTimeClockLib.h", and it is completely
unused in OVMF. OTOH ArmPlatformPkg uses the library class in a number
of places, and it even provides one library instance
(PL031RealTimeClockLib).

Thanks,
Laszlo

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.