+\r
+ ConvertEfiTimeToRtcTime (&Time, RegisterB);\r
+\r
+ //\r
+ // Set the Y/M/D info to variable as it has no corresponding hw registers.\r
+ //\r
+ Status = EfiSetVariable (\r
+ L"RTCALARM",\r
+ &gEfiCallerIdGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ sizeof (Time),\r
+ &Time\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ if (!EfiAtRuntime ()) {\r
+ EfiReleaseLock (&Global->RtcLock);\r
+ }\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+ \r
+ //\r
+ // Inhibit updates of the RTC\r
+ //\r
+ RegisterB.Bits.Set = 1;\r
+ RtcWrite (RTC_ADDRESS_REGISTER_B, RegisterB.Data);\r
+ \r
+ //\r
+ // Set RTC alarm time registers\r
+ //\r
+ RtcWrite (RTC_ADDRESS_SECONDS_ALARM, Time.Second);\r
+ RtcWrite (RTC_ADDRESS_MINUTES_ALARM, Time.Minute);\r
+ RtcWrite (RTC_ADDRESS_HOURS_ALARM, Time.Hour);\r
+\r
+ //\r
+ // Allow updates of the RTC registers\r
+ //\r
+ RegisterB.Bits.Set = 0;\r
+ RtcWrite (RTC_ADDRESS_REGISTER_B, RegisterB.Data);\r
+ \r
+ //\r
+ // Release RTC Lock.\r
+ //\r
+ if (!EfiAtRuntime ()) {\r
+ EfiReleaseLock (&Global->RtcLock);\r
+ }\r
+ return EFI_SUCCESS;\r