//\r
// Write timezone and daylight to RTC variable\r
//\r
- if (Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) {\r
+ if ((Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE) && (Time->Daylight == 0)) {\r
Status = EfiSetVariable (\r
mTimeZoneVariableName,\r
&gEfiCallerIdGuid,\r
//\r
Table = 0;\r
CopyMem (&Table, (VOID *) (EntryBase + Index * TablePointerSize), TablePointerSize);\r
+\r
+ if (Table == NULL) {\r
+ continue;\r
+ }\r
+\r
if (Table->Signature == Signature) {\r
return Table;\r
}\r
}\r
\r
/**\r
- Notification function of ACPI Table change.\r
-\r
- This is a notification function registered on ACPI Table change event.\r
- It saves the Century address stored in ACPI FADT table.\r
-\r
- @param Event Event whose notification function is being invoked.\r
- @param Context Pointer to the notification function's context.\r
+ Get the century RTC address from the ACPI FADT table.\r
\r
+ @return The century RTC address or 0 if not found.\r
**/\r
-VOID\r
-EFIAPI\r
-PcRtcAcpiTableChangeCallback (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+UINT8\r
+GetCenturyRtcAddress (\r
+ VOID\r
)\r
{\r
EFI_STATUS Status;\r
EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;\r
- EFI_ACPI_DESCRIPTION_HEADER *Rsdt;\r
- EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt;\r
- EFI_TIME Time;\r
- UINT8 Century;\r
\r
Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp);\r
if (EFI_ERROR (Status)) {\r
Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp);\r
}\r
\r
- if (EFI_ERROR (Status)) {\r
- return;\r
+ if (EFI_ERROR (Status) || (Rsdp == NULL)) {\r
+ return 0;\r
}\r
\r
- ASSERT (Rsdp != NULL);\r
+ Fadt = NULL;\r
\r
//\r
// Find FADT in XSDT\r
//\r
- Fadt = NULL;\r
- if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {\r
- Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;\r
- Fadt = ScanTableInSDT (Xsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, sizeof (UINT64));\r
+ if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) {\r
+ Fadt = ScanTableInSDT (\r
+ (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress,\r
+ EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,\r
+ sizeof (UINTN)\r
+ );\r
}\r
\r
- if (Fadt == NULL) {\r
- //\r
- // Find FADT in RSDT\r
- //\r
- Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;\r
- Fadt = ScanTableInSDT (Rsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, sizeof (UINT32));\r
+ //\r
+ // Find FADT in RSDT\r
+ //\r
+ if (Fadt == NULL && Rsdp->RsdtAddress != 0) {\r
+ Fadt = ScanTableInSDT (\r
+ (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress,\r
+ EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,\r
+ sizeof (UINT32)\r
+ );\r
}\r
\r
if ((Fadt != NULL) &&\r
- (Fadt->Century > RTC_ADDRESS_REGISTER_D) && (Fadt->Century < 0x80) &&\r
- (mModuleGlobal.CenturyRtcAddress != Fadt->Century)\r
+ (Fadt->Century > RTC_ADDRESS_REGISTER_D) && (Fadt->Century < 0x80)\r
) {\r
- mModuleGlobal.CenturyRtcAddress = Fadt->Century;\r
+ return Fadt->Century;\r
+ } else {\r
+ return 0;\r
+ }\r
+}\r
+\r
+/**\r
+ Notification function of ACPI Table change.\r
+\r
+ This is a notification function registered on ACPI Table change event.\r
+ It saves the Century address stored in ACPI FADT table.\r
+\r
+ @param Event Event whose notification function is being invoked.\r
+ @param Context Pointer to the notification function's context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+PcRtcAcpiTableChangeCallback (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_TIME Time;\r
+ UINT8 CenturyRtcAddress;\r
+ UINT8 Century;\r
+\r
+ CenturyRtcAddress = GetCenturyRtcAddress ();\r
+ if ((CenturyRtcAddress != 0) && (mModuleGlobal.CenturyRtcAddress != CenturyRtcAddress)) {\r
+ mModuleGlobal.CenturyRtcAddress = CenturyRtcAddress;\r
Status = PcRtcGetTime (&Time, NULL, &mModuleGlobal);\r
if (!EFI_ERROR (Status)) {\r
Century = (UINT8) (Time.Year / 100);\r