/** @file | |
Implement EFI RealTimeClock runtime services via Xen shared info page | |
Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#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 = (UINT16)(y - 4800 + ((m + 2) / 12)); | |
Time->Month = ((m + 2) % 12) + 1; | |
Time->Day = (UINT8)(d + 1); | |
ss = EpochSeconds % 60; | |
a = (EpochSeconds - ss) / 60; | |
mm = a % 60; | |
b = (a - mm) / 60; | |
hh = b % 24; | |
Time->Hour = (UINT8)hh; | |
Time->Minute = (UINT8)mm; | |
Time->Second = (UINT8)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 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; | |
} |