Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/libsaio/time.c

1/*
2 * This file is part of the libpayload project.
3 *
4 * Copyright (C) 2008 Advanced Micro Devices, Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30/**
31 * @file libc/time.c
32 * General time functions
33 */
34#include "libsaio.h"
35#include "cpu.h"
36#include "platform.h"
37
38
39static uint32_t cpu_khz;
40
41static struct {
42uint64_t ticks;
43time_t secs;
44suseconds_t usecs;
45} private_clock;
46
47#define TICKS_PER_SEC (cpu_khz * 1000)
48#define TICKS_PER_USEC (cpu_khz / 1000)
49
50static void update_clock(void)
51{
52uint64_t delta = rdtsc64() - private_clock.ticks;
53int secs;
54
55private_clock.ticks += delta;
56
57secs = (int) (delta / TICKS_PER_SEC);
58private_clock.secs += secs;
59delta -= (secs * TICKS_PER_SEC);
60private_clock.usecs += (int) (delta / TICKS_PER_USEC);
61
62if (private_clock.usecs > 1000000) {
63private_clock.usecs -= 1000000;
64private_clock.secs++;
65}
66}
67
68static unsigned int day_of_year(int mon, int day, int year)
69{
70static uint8_t mdays[12] = { 31, 28, 31, 30, 31, 30,
7131, 31, 30, 31, 30, 31 };
72
73int i, ret = 0;
74
75for(i = 0; i < mon; i++) {
76ret += mdays[i];
77
78if (i == 1 && (year % 4))
79ret++;
80}
81
82return (ret + day);
83}
84
85static void gettimeofday_init(void)
86{
87int days, delta;
88struct tm tm;
89
90rtc_read_clock(&tm);
91private_clock.ticks = rdtsc64();
92
93/* Calculate the number of days in the year so far */
94days = day_of_year(tm.tm_mon, tm.tm_mday, tm.tm_year + 1900);
95
96delta = tm.tm_year - 70;
97
98days += (delta * 365);
99
100/* Figure leap years */
101
102if (delta > 2)
103 days += (delta - 2) / 4;
104
105private_clock.secs = (days * 86400) + (tm.tm_hour * 3600) +
106(tm.tm_min * 60) + tm.tm_sec;
107}
108
109/**
110 * Return the current time broken into a timeval structure.
111 *
112 * @param tv A pointer to a timeval structure.
113 * @param tz Added for compatability - not used.
114 * @return 0 for success (this function cannot return non-zero currently).
115 *
116 * WARNING : In this implementation gettimeofday() will not work until the cpu is not initialized.
117 */
118int gettimeofday(struct timeval *tv, void *tz)
119{
120 cpu_khz = (uint32_t)(get_env(envCPUFreq) / 1000);
121 if (!(cpu_khz>0)) {
122 return 1;
123 }
124/*
125 * Call the gtod init when we need it - this keeps the code from
126 * being included in the binary if we don't need it.
127 */
128if (!private_clock.ticks)
129gettimeofday_init();
130
131update_clock();
132
133tv->tv_sec = private_clock.secs;
134tv->tv_usec = private_clock.usecs;
135
136return 0;
137}
138

Archive Download this file

Revision: 2006