Implement time functions (in GMT, really should be in local time)
Modified: branches/xen/reactos/boot/freeldr/freeldr/Makefile
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenrtc.c
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/Makefile
--- branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-05-16
19:24:15 UTC (rev 15349)
+++ branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-05-16
19:28:18 UTC (rev 15350)
@@ -177,6 +177,7 @@
xenentry.o \
xenevtchn.o \
xenmem.o \
+ xenrtc.o \
xenvideo.o \
_alloca.o # For Mingw32 builds
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
2005-05-16 19:24:15 UTC (rev 15349)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c
2005-05-16 19:28:18 UTC (rev 15350)
@@ -256,13 +256,6 @@
}
VOID
-XenRTCGetCurrentDateTime(PULONG Year, PULONG Month, PULONG Day,
- PULONG Hour, PULONG Minute, PULONG Second)
- {
- XEN_UNIMPLEMENTED("XenRTCGetCurrentDateTime");
- }
-
-VOID
XenHwDetect(VOID)
{
XEN_UNIMPLEMENTED("XenHwDetect");
_____
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenrtc.c
--- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenrtc.c
2005-05-16 19:24:15 UTC (rev 15349)
+++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenrtc.c
2005-05-16 19:28:18 UTC (rev 15350)
@@ -0,0 +1,124 @@
+/* $Id$
+ *
+ * FreeLoader
+ *
+ * This program is free software; you can redistribute it and/or
modify
+ * it under the terms of the GNU General Public License as published
by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "freeldr.h"
+#include "arch.h"
+#include "machine.h"
+#include "machxen.h"
+
+#define SECSPERMIN 60
+#define MINSPERHOUR 60
+#define HOURSPERDAY 24
+#define DAYSPERWEEK 7
+#define DAYSPERNYEAR 365
+#define DAYSPERLYEAR 366
+#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
+#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
+#define MONSPERYEAR 12
+#define EPOCH_YEAR 1970
+
+#define IsLeap(Yr) ((0 == ((Yr) % 4) && 0 != ((Yr) % 100)) || 0 ==
((Yr) % 400))
+
+static const int MonLengths[2][MONSPERYEAR] = {
+{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+static const int YearLengths[2] = {
+DAYSPERNYEAR, DAYSPERLYEAR
+};
+
+static void
+TimeSub(ULONG Time, LONG Offset,
+ PULONG Year, PULONG Month, PULONG Day,
+ PULONG Hour, PULONG Minute, PULONG Second)
+{
+ long Days;
+ long Rem;
+ int Yr;
+ int Yleap;
+ const int * ip;
+
+ Days = Time / SECSPERDAY;
+ Rem = Time % SECSPERDAY + Offset;
+ while (Rem < 0)
+ {
+ Rem += SECSPERDAY;
+ Days--;
+ }
+ while (SECSPERDAY <= Rem)
+ {
+ Rem -= SECSPERDAY;
+ Days++;
+ }
+ *Hour = (ULONG) (Rem / SECSPERHOUR);
+ Rem = Rem % SECSPERHOUR;
+ *Minute = (ULONG) (Rem / SECSPERMIN);
+ *Second = (ULONG) (Rem % SECSPERMIN);
+ Yr = EPOCH_YEAR;
+ if (0 <= Days)
+ {
+ while (TRUE)
+ {
+ Yleap = IsLeap(Yr);
+ if (Days < (long) YearLengths[Yleap])
+ {
+ break;
+ }
+ ++Yr;
+ Days = Days - (long) YearLengths[Yleap];
+ }
+ }
+ else
+ {
+ do
+ {
+ --Yr;
+ Yleap = IsLeap(Yr);
+ Days = Days + (long) YearLengths[Yleap];
+ }
+ while (Days < 0);
+ }
+ *Year = Yr;
+ ip = MonLengths[Yleap];
+ for (*Month = 0; Days >= (long) ip[*Month]; ++(*Month))
+ {
+ Days = Days - (long) ip[*Month];
+ }
+ (*Month)++;
+ *Day = (ULONG) (Days + 1);
+}
+
+VOID
+XenRTCGetCurrentDateTime(PULONG Year, PULONG Month, PULONG Day,
+ PULONG Hour, PULONG Minute, PULONG Second)
+{
+ ULONG Time;
+ ULONG ShadowTimeVersion;
+
+ do
+ {
+ ShadowTimeVersion = XenSharedInfo->time_version2;
+ Time = XenSharedInfo->wc_sec;
+ }
+ while (ShadowTimeVersion != XenSharedInfo->time_version1);
+
+ TimeSub(Time, 0, Year, Month, Day, Hour, Minute, Second);
+}
+
+/* EOF */
Property changes on:
branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenrtc.c
___________________________________________________________________
Name: svn:keywords
+ Author Date Id Revision
Name: svn:eol-style
+ native