1 /* $NetBSD: clock.c,v 1.3 2009/10/21 16:06:59 snj Exp $ */
4 * Copyright (c) 2007 Jared D. McNeill <jmcneill@invisible.ca>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.3 2009/10/21 16:06:59 snj Exp $");
32 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/device.h>
36 #include <sys/timetc.h>
38 #include <machine/mainbus.h>
40 static int clock_match(device_t
, cfdata_t
, void *);
41 static void clock_attach(device_t
, device_t
, void *);
43 static void clock_intr(int);
44 static u_int
clock_getcounter(struct timecounter
*);
46 typedef struct clock_softc
{
50 extern int setitimer(int, const struct itimerval
*, struct itimerval
*);
52 static struct timecounter clock_timecounter
= {
53 clock_getcounter
, /* get_timecount */
55 ~0u, /* counter_mask */
56 1000000, /* frequency */
57 "gettimeofday", /* name */
63 CFATTACH_DECL_NEW(clock
, sizeof(clock_softc_t
),
64 clock_match
, clock_attach
, NULL
, NULL
);
67 clock_match(device_t parent
, cfdata_t match
, void *opaque
)
69 struct thunkbus_attach_args
*taa
= opaque
;
71 if (taa
->taa_type
!= THUNKBUS_TYPE_CLOCK
)
78 clock_attach(device_t parent
, device_t self
, void *opaque
)
80 clock_softc_t
*sc
= device_private(self
);
81 struct itimerval itimer
;
88 (void)signal(SIGALRM
, clock_intr
);
90 itimer
.it_interval
.tv_sec
= 0;
91 itimer
.it_interval
.tv_usec
= 10000;
92 itimer
.it_value
= itimer
.it_interval
;
93 (void)setitimer(ITIMER_REAL
, &itimer
, NULL
);
95 tc_init(&clock_timecounter
);
99 clock_intr(int notused
)
101 extern int usermode_x
;
102 struct clockframe cf
;
106 if (usermode_x
> IPL_SOFTCLOCK
)
114 clock_getcounter(struct timecounter
*tc
)
116 extern int gettimeofday(struct timeval
*, void *);
119 gettimeofday(&tv
, NULL
);
120 return tv
.tv_sec
* 1000000 + tv
.tv_usec
;