|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Mach Operating System
27: * Copyright (c) 1989 Carnegie-Mellon University
28: * Copyright (c) 1988 Carnegie-Mellon University
29: * Copyright (c) 1987 Carnegie-Mellon University
30: * All rights reserved. The CMU software License Agreement specifies
31: * the terms and conditions for use and redistribution.
32: */
33: /*
34: * HISTORY
35: * Revision 1.1.1.1 1997/09/30 02:44:35 wsanchez
36: * Import of kernel from umeshv/kernel
37: *
38: * Revision 2.9 89/12/22 15:54:21 rpd
39: * Minor stylistic change to TIMER_DELTA, plus explanatory comment.
40: * [89/11/28 dlb]
41: *
42: * Revision 2.8 89/10/11 14:35:23 dlb
43: * Change internal representation of timers: flags field replaced
44: * by high_bits_check field.
45: * [89/09/12 dlb]
46: *
47: * Added TIMER_LOW_FULL mask to check for possible overflow of
48: * low_bits field. Removed TIMER_SERVICE flag.
49: * [88/10/27 dlb]
50: *
51: * Revision 2.7 89/03/09 20:17:32 rpd
52: * More cleanup.
53: *
54: * Revision 2.6 89/02/25 18:10:52 gm0w
55: * Kernel code cleanup.
56: * Put entire file under #indef KERNEL.
57: * [89/02/15 mrt]
58: *
59: * Revision 2.5 89/02/07 01:05:51 mwyoung
60: * Relocated from sys/timer.h
61: *
62: * Revision 2.4 89/01/30 22:08:37 rpd
63: * Updated macro definitions to the new style.
64: * Made declarations use "extern".
65: * [89/01/25 15:24:36 rpd]
66: *
67: * Revision 2.3 88/08/24 02:49:17 mwyoung
68: * Adjusted include file references.
69: * [88/08/17 02:25:43 mwyoung]
70: *
71: * 7-Apr-88 David Black (dlb) at Carnegie-Mellon University
72: * Added interface definitions and null routines for STAT_TIME.
73: *
74: * 19-Feb-88 David Black (dlb) at Carnegie-Mellon University
75: * Renamed fields, added timer_save structure.
76: *
77: * 31-May-87 Avadis Tevanian (avie) at Carnegie-Mellon University
78: * machine/machtimer.h -> machine/timer.h
79: *
80: * 23-Feb-87 David L. Black (dlb) at Carnegie-Mellon University
81: * Created.
82: */
83:
84: #ifndef _KERN_TIMER_H_
85: #define _KERN_TIMER_H_
86:
87: #ifdef KERNEL_BUILD
88: #import <cpus.h>
89: #import <stat_time.h>
90: #else /* KERNEL_BUILD */
91: #import <mach/features.h>
92: #endif /* KERNEL_BUILD */
93:
94: #import <kernserv/macro_help.h>
95:
96: #if STAT_TIME
97: /*
98: * Statistical timer definitions - use microseconds in timer, seconds
99: * in high unit field. No adjustment needed to convert to time_value_t
100: * as a result. Service timers once an hour.
101: */
102:
103: #define TIMER_RATE 1000000
104: #define TIMER_HIGH_UNIT TIMER_RATE
105: #undef TIMER_ADJUST
106:
107: #else /* STAT_TIME */
108: /*
109: * Machine dependent definitions based on hardware support.
110: */
111:
112: #import <machine/timer.h>
113:
114: #endif /* STAT_TIME */
115:
116: /*
117: * Definitions for accurate timers. high_bits_check is a copy of
118: * high_bits that allows reader to verify that values read are ok.
119: */
120:
121: struct timer {
122: unsigned low_bits;
123: unsigned high_bits;
124: unsigned high_bits_check;
125: unsigned tstamp;
126: };
127:
128: typedef struct timer timer_data_t;
129: typedef struct timer *timer_t;
130:
131: /*
132: * Mask to check if low_bits is in danger of overflowing
133: */
134:
135: #define TIMER_LOW_FULL 0x80000000
136:
137: /*
138: * Kernel timers and current timer array. [Exported]
139: */
140:
141: extern timer_t current_timer[NCPUS];
142: extern timer_data_t kernel_timer[NCPUS];
143:
144: /*
145: * save structure for timer readings. This is used to save timer
146: * readings for elapsed time computations.
147: */
148:
149: struct timer_save {
150: unsigned low;
151: unsigned high;
152: };
153:
154: typedef struct timer_save timer_save_data_t, *timer_save_t;
155:
156: /*
157: * Exported kernel interface to timers
158: */
159:
160: #if STAT_TIME
161: #define start_timer(timer)
162: #define timer_switch(timer)
163: #else /* STAT_TIME */
164: extern void start_timer();
165: extern void timer_switch();
166: #endif /* STAT_TIME */
167:
168: extern void timer_read();
169: extern void thread_read_times();
170: extern unsigned timer_delta();
171:
172: #if STAT_TIME
173: /*
174: * Macro to bump timer values.
175: */
176: #define timer_bump(timer, usec) \
177: MACRO_BEGIN \
178: (timer)->low_bits += usec; \
179: if ((timer)->low_bits & TIMER_LOW_FULL) { \
180: timer_normalize(timer); \
181: } \
182: MACRO_END
183:
184: #else /* STAT_TIME */
185: /*
186: * Exported hardware interface to timers
187: */
188: extern void time_trap_uentry();
189: extern void time_trap_uexit();
190: extern timer_t time_int_entry();
191: extern void time_int_exit();
192: #endif /* STAT_TIME */
193:
194: /*
195: * TIMER_DELTA finds the difference between a timer and a saved value,
196: * and updates the saved value. Look at high_bits check field after
197: * reading low because that's the first written by a normalize
198: * operation; this isn't necessary for current usage because
199: * this macro is only used when the timer can't be normalized:
200: * thread is not running, or running thread calls it on itself at
201: * splsched().
202: */
203:
204: #define TIMER_DELTA(timer, save, result) \
205: MACRO_BEGIN \
206: register unsigned temp; \
207: \
208: temp = (timer).low_bits; \
209: if ((save).high != (timer).high_bits_check) { \
210: result += timer_delta(&(timer), &(save)); \
211: } \
212: else { \
213: result += temp - (save).low; \
214: (save).low = temp; \
215: } \
216: MACRO_END
217:
218: #endif /* _KERN_TIMER_H_ */
219:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.