extern grub_uint32_t EXPORT_VAR (grub_arch_memsize);
extern grub_uint32_t EXPORT_VAR (grub_arch_highmemsize);
-extern grub_uint32_t EXPORT_VAR (grub_arch_busclock);
-extern grub_uint32_t EXPORT_VAR (grub_arch_cpuclock);
#endif
#include <grub/symbol.h>
-#define GRUB_TICKS_PER_SECOND 1000
+#define GRUB_TICKS_PER_SECOND (grub_arch_cpuclock / 2)
/* Return the real time in ticks. */
-grub_uint32_t EXPORT_FUNC (grub_get_rtc) (void);
+grub_uint64_t EXPORT_FUNC (grub_get_rtc) (void);
+
+extern grub_uint32_t EXPORT_VAR (grub_arch_busclock);
+extern grub_uint32_t EXPORT_VAR (grub_arch_cpuclock);
static inline void
grub_cpu_idle(void)
#include <grub/symbol.h>
#include <grub/cpu/time.h>
-#ifdef GRUB_MACHINE_EMU
+#if defined (GRUB_MACHINE_EMU) || defined (GRUB_UTIL)
#define GRUB_TICKS_PER_SECOND 100000
#else
#include <grub/machine/time.h>
#include <grub/machine/memory.h>
#include <grub/cpu/kernel.h>
-grub_uint32_t
+/* FIXME: use interrupt to count high. */
+grub_uint64_t
grub_get_rtc (void)
{
- static grub_uint64_t calln = 0;
+ static grub_uint32_t high = 0;
+ static grub_uint32_t last = 0;
+ grub_uint32_t low;
- return (calln++) >> 8;
+ asm volatile ("mfc0 %0, $9": "=r" (low));
+ if (low < last)
+ high++;
+ last = low;
+
+ return (((grub_uint64_t) high) << 32) | low;
}
grub_err_t
/* For frequencies. */
#include <grub/pci.h>
+#include <grub/machine/time.h>
#define ELF32_LOADMASK (0x00000000UL)
#define ELF64_LOADMASK (0x0000000000000000ULL)