|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26:
27: #ifndef _KERN_TIMER_H_
28: #define _KERN_TIMER_H_
29:
30: #include <cpus.h>
31: #include <stat_time.h>
32:
33: #include <kern/macro_help.h>
34:
35: #if STAT_TIME
36: /*
37: * Statistical timer definitions - use microseconds in timer, seconds
38: * in high unit field. No adjustment needed to convert to time_value_t
39: * as a result. Service timers once an hour.
40: */
41:
42: #define TIMER_RATE 1000000
43: #define TIMER_HIGH_UNIT TIMER_RATE
44: #undef TIMER_ADJUST
45:
46: #else /* STAT_TIME */
47: /*
48: * Machine dependent definitions based on hardware support.
49: */
50:
51: #include <machine/timer.h>
52:
53: #endif /* STAT_TIME */
54:
55: /*
56: * Definitions for accurate timers. high_bits_check is a copy of
57: * high_bits that allows reader to verify that values read are ok.
58: */
59:
60: struct timer {
61: unsigned low_bits;
62: unsigned high_bits;
63: unsigned high_bits_check;
64: unsigned tstamp;
65: };
66:
67: typedef struct timer timer_data_t;
68: typedef struct timer *timer_t;
69:
70: /*
71: * Mask to check if low_bits is in danger of overflowing
72: */
73:
74: #define TIMER_LOW_FULL 0x80000000U
75:
76: /*
77: * Kernel timers and current timer array. [Exported]
78: */
79:
80: extern timer_t current_timer[NCPUS];
81: extern timer_data_t kernel_timer[NCPUS];
82:
83: /*
84: * save structure for timer readings. This is used to save timer
85: * readings for elapsed time computations.
86: */
87:
88: struct timer_save {
89: unsigned low;
90: unsigned high;
91: };
92:
93: typedef struct timer_save timer_save_data_t, *timer_save_t;
94:
95: /*
96: * Exported kernel interface to timers
97: */
98:
99: #if STAT_TIME
100: #define start_timer(timer)
101: #define timer_switch(timer)
102: #else /* STAT_TIME */
103: extern void start_timer();
104: extern void timer_switch();
105: #endif /* STAT_TIME */
106:
107: extern void timer_read();
108: extern void thread_read_times();
109: extern unsigned timer_delta();
110:
111: #if STAT_TIME
112: /*
113: * Macro to bump timer values.
114: */
115: #define timer_bump(timer, usec) \
116: MACRO_BEGIN \
117: (timer)->low_bits += usec; \
118: if ((timer)->low_bits & TIMER_LOW_FULL) { \
119: timer_normalize(timer); \
120: } \
121: MACRO_END
122:
123: #else /* STAT_TIME */
124: /*
125: * Exported hardware interface to timers
126: */
127: extern void time_trap_uentry();
128: extern void time_trap_uexit();
129: extern timer_t time_int_entry();
130: extern void time_int_exit();
131: #endif /* STAT_TIME */
132:
133: /*
134: * TIMER_DELTA finds the difference between a timer and a saved value,
135: * and updates the saved value. Look at high_bits check field after
136: * reading low because that's the first written by a normalize
137: * operation; this isn't necessary for current usage because
138: * this macro is only used when the timer can't be normalized:
139: * thread is not running, or running thread calls it on itself at
140: * splsched().
141: */
142:
143: #define TIMER_DELTA(timer, save, result) \
144: MACRO_BEGIN \
145: register unsigned temp; \
146: \
147: temp = (timer).low_bits; \
148: if ((save).high != (timer).high_bits_check) { \
149: result += timer_delta(&(timer), &(save)); \
150: } \
151: else { \
152: result += temp - (save).low; \
153: (save).low = temp; \
154: } \
155: MACRO_END
156:
157: #endif /* _KERN_TIMER_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.