|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_COPYRIGHT@
24: */
25: /*
26: * Mach Operating System
27: * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
28: * All Rights Reserved.
29: *
30: * Permission to use, copy, modify and distribute this software and its
31: * documentation is hereby granted, provided that both the copyright
32: * notice and this permission notice appear in all copies of the
33: * software, derivative works or modified versions, and any portions
34: * thereof, and that both notices appear in supporting documentation.
35: *
36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39: *
40: * Carnegie Mellon requests users of this software to return to
41: *
42: * Software Distribution Coordinator or [email protected]
43: * School of Computer Science
44: * Carnegie Mellon University
45: * Pittsburgh PA 15213-3890
46: *
47: * any improvements or extensions that they make and grant Carnegie Mellon
48: * the rights to redistribute these changes.
49: */
50: /*
51: */
52:
53: #ifndef _KERN_TIMER_H_
54: #define _KERN_TIMER_H_
55:
56: #include <cpus.h>
57: #include <stat_time.h>
58:
59: #include <kern/macro_help.h>
60: #include <kern/kern_types.h>
61:
62: #if STAT_TIME
63: /*
64: * Statistical timer definitions - use microseconds in timer, seconds
65: * in high unit field. No adjustment needed to convert to time_value_t
66: * as a result. Service timers once an hour.
67: */
68:
69: #define TIMER_RATE 1000000
70: #define TIMER_HIGH_UNIT TIMER_RATE
71: #undef TIMER_ADJUST
72:
73: #else /* STAT_TIME */
74: /*
75: * Machine dependent definitions based on hardware support.
76: */
77:
78: #include <machine/timer.h>
79:
80: #endif /* STAT_TIME */
81:
82: /*
83: * Definitions for accurate timers. high_bits_check is a copy of
84: * high_bits that allows reader to verify that values read are ok.
85: */
86:
87: struct timer {
88: unsigned low_bits;
89: unsigned high_bits;
90: unsigned high_bits_check;
91: unsigned tstamp;
92: };
93:
94: typedef struct timer timer_data_t;
95: typedef struct timer *timer_t;
96:
97: /*
98: * Mask to check if low_bits is in danger of overflowing
99: */
100:
101: #define TIMER_LOW_FULL 0x80000000
102:
103: /*
104: * Kernel timers and current timer array. [Exported]
105: */
106:
107: extern timer_t current_timer[NCPUS];
108: extern timer_data_t kernel_timer[NCPUS];
109:
110: /*
111: * save structure for timer readings. This is used to save timer
112: * readings for elapsed time computations.
113: */
114:
115: struct timer_save {
116: unsigned low;
117: unsigned high;
118: };
119:
120: typedef struct timer_save timer_save_data_t, *timer_save_t;
121:
122: /*
123: * Exported kernel interface to timers
124: */
125:
126: #if STAT_TIME
127: #define start_timer(timer)
128: #define timer_switch(timer)
129: #else /* STAT_TIME */
130: /* Start timer for this cpu */
131: extern void start_timer(
132: timer_t timer);
133:
134: /* Switch to a new timer */
135: extern void timer_switch(
136: timer_t new_timer);
137: #endif /* STAT_TIME */
138:
139: /* Initialize timer module */
140: extern void init_timers(void);
141:
142: /*
143: * Initializes a single timer.
144: */
145: extern void timer_init(
146: timer_t this_timer);
147:
148: /* Normalize timer value */
149: extern void timer_normalize(
150: timer_t timer);
151:
152: /* Read value of timer into tv */
153: extern void timer_read(
154: timer_t timer,
155: time_value_t *tv);
156:
157: /* Read thread times */
158: extern void thread_read_times(
159: thread_t thread,
160: time_value_t *user_time_p,
161: time_value_t *system_time_p);
162:
163: /* Compute timer difference */
164: extern unsigned timer_delta(
165: timer_t timer,
166: timer_save_t save);
167:
168: #if STAT_TIME
169: /*
170: * Macro to bump timer values.
171: */
172: #define timer_bump(timer, usec) \
173: MACRO_BEGIN \
174: (timer)->low_bits += usec; \
175: if ((timer)->low_bits & TIMER_LOW_FULL) { \
176: timer_normalize(timer); \
177: } \
178: MACRO_END
179:
180: #else /* STAT_TIME */
181: /*
182: * Exported hardware interface to timers
183: */
184: /* Time trap entry */
185: extern void time_trap_uentry(
186: unsigned ts);
187:
188: /* Time trap exit */
189: extern void time_trap_uexit(
190: unsigned ts);
191:
192: /* Time interrupt entry */
193: extern timer_t time_int_entry(
194: unsigned ts,
195: timer_t new_timer);
196:
197: /* Time interrrupt exit */
198: extern void time_int_exit(
199: unsigned ts,
200: timer_t old_timer);
201:
202: #endif /* STAT_TIME */
203:
204: /*
205: * TIMER_DELTA finds the difference between a timer and a saved value,
206: * and updates the saved value. Look at high_bits check field after
207: * reading low because that's the first written by a normalize
208: * operation; this isn't necessary for current usage because
209: * this macro is only used when the timer can't be normalized:
210: * thread is not running, or running thread calls it on itself at
211: * splsched().
212: */
213:
214: #define TIMER_DELTA(timer, save, result) \
215: MACRO_BEGIN \
216: register unsigned temp; \
217: \
218: temp = (timer).low_bits; \
219: if ((save).high != (timer).high_bits_check) { \
220: result += timer_delta(&(timer), &(save)); \
221: } \
222: else { \
223: result += temp - (save).low; \
224: (save).low = temp; \
225: } \
226: MACRO_END
227:
228: #endif /* _KERN_TIMER_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.