#define RTC_REGISTER_CENTURY 0x32
+/* GLOBALS ******************************************************************/
+
+static KSPIN_LOCK CmosLock = {0};
/* FUNCTIONS *****************************************************************/
VOID STDCALL
HalQueryRealTimeClock(PTIME_FIELDS Time)
{
+ KIRQL oldIrql;
+
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
+
/* check 'Update In Progress' bit */
- while (HalpQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP)
- ;
+ while (HalpQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP);
Time->Second = BCD_INT(HalpQueryCMOS (0));
Time->Minute = BCD_INT(HalpQueryCMOS (2));
Time->Year += BCD_INT(HalpQueryCMOS (RTC_REGISTER_CENTURY)) * 100;
#endif
+ KeReleaseSpinLock(&CmosLock, oldIrql);
+
#ifndef NDEBUG
DbgPrint ("HalQueryRealTimeClock() %d:%d:%d %d/%d/%d\n",
Time->Hour,
VOID STDCALL
HalSetRealTimeClock(PTIME_FIELDS Time)
{
+ KIRQL oldIrql;
+
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
+
/* check 'Update In Progress' bit */
- while (HalpQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP)
- ;
+ while (HalpQueryCMOS (RTC_REGISTER_A) & RTC_REG_A_UIP);
HalpSetCMOS (0, INT_BCD(Time->Second));
HalpSetCMOS (2, INT_BCD(Time->Minute));
/* Century */
HalpSetCMOS (RTC_REGISTER_CENTURY, INT_BCD(Time->Year / 100));
#endif
+ KeReleaseSpinLock(&CmosLock, oldIrql);
+
}
PCH Value,
USHORT ValueLength)
{
+ KIRQL oldIrql;
+
+
if (_stricmp(Name, "LastKnownGood") != 0)
{
return FALSE;
}
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
if (HalpQueryCMOS(RTC_REGISTER_B) & 0x01)
{
strncpy(Value, "FALSE", ValueLength);
{
strncpy(Value, "TRUE", ValueLength);
}
+ KeReleaseSpinLock(&CmosLock, oldIrql);
return TRUE;
}
PCH Value)
{
UCHAR Val;
+ KIRQL oldIrql;
+ BOOLEAN result = TRUE;
if (_stricmp(Name, "LastKnownGood") != 0)
return FALSE;
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
+
Val = HalpQueryCMOS(RTC_REGISTER_B);
if (_stricmp(Value, "TRUE") == 0)
else if (_stricmp(Value, "FALSE") == 0)
HalpSetCMOS(RTC_REGISTER_B, Val & ~0x01);
else
- return FALSE;
+ result = FALSE;
- return TRUE;
+ KeReleaseSpinLock(&CmosLock, oldIrql);
+
+ return result;
}
PUCHAR Ptr = Buffer;
ULONG Address = SlotNumber;
ULONG Len = Length;
+ KIRQL oldIrql;
DPRINT("HalpGetCmosData() called.\n");
DPRINT(" BusNumber %lu\n", BusNumber);
if (BusNumber == 0)
{
/* CMOS */
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
while ((Len > 0) && (Address < 0x100))
{
*Ptr = HalpQueryCMOS((UCHAR)Address);
Address++;
Len--;
}
+ KeReleaseSpinLock(&CmosLock, oldIrql);
}
else if (BusNumber == 1)
{
/* Extended CMOS */
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
while ((Len > 0) && (Address < 0x1000))
{
*Ptr = HalpQueryECMOS((USHORT)Address);
Address++;
Len--;
}
+ KeReleaseSpinLock(&CmosLock, oldIrql);
}
return(Length - Len);
PUCHAR Ptr = (PUCHAR)Buffer;
ULONG Address = SlotNumber;
ULONG Len = Length;
+ KIRQL oldIrql;
DPRINT("HalpSetCmosData() called.\n");
DPRINT(" BusNumber %lu\n", BusNumber);
if (BusNumber == 0)
{
/* CMOS */
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
while ((Len > 0) && (Address < 0x100))
{
HalpSetCMOS((UCHAR)Address, *Ptr);
Address++;
Len--;
}
+ KeReleaseSpinLock(&CmosLock, oldIrql);
}
else if (BusNumber == 1)
{
/* Extended CMOS */
+ KeAcquireSpinLock(&CmosLock, &oldIrql);
while ((Len > 0) && (Address < 0x1000))
{
HalpSetECMOS((USHORT)Address, *Ptr);
Address++;
Len--;
}
+ KeReleaseSpinLock(&CmosLock, oldIrql);
}
return(Length - Len);