|
|
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: * Copyright (c) 1992, 1993, 1994, 1995 NeXT Computer, Inc. ! 27: * ! 28: * Machine dependent clock and timer routines ! 29: * for ppc architecture. Ported from hppa/sparc. ! 30: * ! 31: */ ! 32: ! 33: #include <mach/mach_types.h> ! 34: ! 35: #include <bsd/sys/param.h> ! 36: #include <bsd/sys/time.h> ! 37: ! 38: #import <kern/clock.h> ! 39: #import <vm/vm_kern.h> ! 40: ! 41: /* Window server in action flag */ ! 42: extern unsigned int wserver_on; ! 43: extern unsigned int get_unix_time_of_day( void ); ! 44: extern void set_unix_time_of_day( unsigned int unixSecs ); ! 45: ! 46: boolean_t clock_initialized = FALSE; ! 47: ! 48: tvalspec_t time_of_boot; /* rel to 1/1/70 (UNIX T[0]) */ ! 49: ! 50: /* ! 51: * Nanosecond event counter ;-) ! 52: */ ! 53: ! 54: static struct _system_clock { ! 55: mapped_tvalspec_t *mapped_counter; ! 56: } system_clock; ! 57: ! 58: static tvalspec_t system_time_stamp(void); ! 59: ! 60: static struct _system_timer { ! 61: boolean_t is_set; ! 62: tvalspec_t expire_time; ! 63: timer_func_t expire_func; ! 64: } system_timer; ! 65: ! 66: static boolean_t hardclock_enabled; ! 67: ! 68: void ! 69: ppc_hardclock(struct ppc_saved_state *ssp) ! 70: { ! 71: tvalspec_t now; ! 72: ! 73: if (hardclock_enabled) { ! 74: clock_interrupt(tick, USERMODE(ssp->srr1), BASEPRI(ssp->srr1)); ! 75: hardclock(ssp->srr0, ssp->srr1); ! 76: } ! 77: ! 78: read_processor_clock_tval(&now); ! 79: ! 80: if (system_timer.is_set && ! 81: CMP_TVALSPEC(&system_timer.expire_time, &now) <= 0) { ! 82: system_timer.is_set = FALSE; ! 83: (*system_timer.expire_func)(now); ! 84: } ! 85: } ! 86: ! 87: void ! 88: hardclock_init(void) ! 89: { ! 90: hardclock_enabled = TRUE; ! 91: } ! 92: ! 93: /* ! 94: * Initialize the clock and timer interface. ! 95: */ ! 96: void ! 97: machine_clock_init(void) ! 98: { ! 99: /* ! 100: * Initialixe the RTC, and set the system's idea of time. ! 101: */ ! 102: ! 103: rtc_init(); ! 104: ! 105: // Set the boot time to zero. It will be updated when the ! 106: // via (Cuda or PMU) driver is probed. ! 107: time_of_boot.tv_sec = 0; ! 108: ! 109: clock_initialized = TRUE; ! 110: } ! 111: ! 112: /* ! 113: * Set the systems real boot time now that DriverKit has given us ! 114: * access to a Time Of Day clock. ! 115: */ ! 116: void ! 117: set_boot_time(void) ! 118: { ! 119: time_of_boot.tv_sec = ! 120: get_unix_time_of_day() - clock_get_counter(System).tv_sec; ! 121: } ! 122: ! 123: /* ! 124: * Clock functions ! 125: */ ! 126: tvalspec_t ! 127: clock_get_counter( ! 128: clock_type_t which_clock ! 129: ) ! 130: { ! 131: tvalspec_t result = system_time_stamp(); ! 132: ! 133: switch (which_clock) { ! 134: ! 135: case System: ! 136: break; ! 137: ! 138: case Calendar: { ! 139: int s = splusclock(); ! 140: ! 141: ADD_TVALSPEC(&result, &time_of_boot); ! 142: splx(s); ! 143: break; ! 144: } ! 145: ! 146: default: ! 147: result = TVALSPEC_ZERO; ! 148: break; ! 149: } ! 150: ! 151: return (result); ! 152: } ! 153: ! 154: void ! 155: clock_set_counter( ! 156: clock_type_t which_clock, ! 157: tvalspec_t value ! 158: ) ! 159: { ! 160: tvalspec_t counter = system_time_stamp(); ! 161: ! 162: switch (which_clock) { ! 163: ! 164: case Calendar: { ! 165: int s = splusclock(); ! 166: ! 167: time_of_boot = value; ! 168: SUB_TVALSPEC(&time_of_boot, &counter); ! 169: splx(s); ! 170: set_unix_time_of_day( value.tv_sec ); ! 171: break; ! 172: } ! 173: ! 174: default: ! 175: /* Can only set the calendar */ ! 176: break; ! 177: } ! 178: } ! 179: ! 180: void ! 181: clock_adjust_counter( ! 182: clock_type_t which_clock, ! 183: clock_res_t nsec ! 184: ) ! 185: { ! 186: switch (which_clock) { ! 187: ! 188: case Calendar: { ! 189: int s = splusclock(); ! 190: ! 191: ADD_TVALSPEC_NSEC(&time_of_boot, nsec); ! 192: splx(s); ! 193: break; ! 194: } ! 195: ! 196: default: ! 197: /* Can only adjust the calendar */ ! 198: break; ! 199: } ! 200: } ! 201: ! 202: mapped_tvalspec_t * ! 203: clock_map_counter( ! 204: clock_type_t which_clock ! 205: ) ! 206: { ! 207: mapped_tvalspec_t *mapped_clock; ! 208: ! 209: switch (which_clock) { ! 210: ! 211: case System: ! 212: if (!(mapped_clock = system_clock.mapped_counter)) { ! 213: int s; ! 214: ! 215: if (kmem_alloc_wired(kernel_map, ! 216: (vm_offset_t *)&mapped_clock, ! 217: PAGE_SIZE) != KERN_SUCCESS) { ! 218: mapped_clock = 0; ! 219: break; ! 220: } ! 221: s = splusclock(); ! 222: system_clock.mapped_counter = mapped_clock; ! 223: splx(s); ! 224: } ! 225: break; ! 226: ! 227: default: ! 228: mapped_clock = 0; ! 229: break; ! 230: } ! 231: ! 232: return (mapped_clock); ! 233: } ! 234: ! 235: void ! 236: timer_set_expire_func( ! 237: timer_type_t which_timer, ! 238: timer_func_t expire_func ! 239: ) ! 240: { ! 241: switch (which_timer) { ! 242: ! 243: case SystemWide: ! 244: if (!expire_func || !system_timer.expire_func) { ! 245: int s = splusclock(); ! 246: ! 247: system_timer.expire_func = expire_func; ! 248: system_timer.is_set = FALSE; ! 249: splx(s); ! 250: } ! 251: break; ! 252: ! 253: default: ! 254: break; ! 255: } ! 256: } ! 257: ! 258: void ! 259: timer_set_deadline( ! 260: timer_type_t which_timer, ! 261: tvalspec_t deadline ! 262: ) ! 263: { ! 264: switch (which_timer) { ! 265: ! 266: case SystemWide: ! 267: if (system_timer.expire_func) { ! 268: int s = splusclock(); ! 269: ! 270: system_timer.expire_time = deadline; ! 271: system_timer.is_set = TRUE; ! 272: splx(s); ! 273: } ! 274: break; ! 275: ! 276: default: ! 277: break; ! 278: } ! 279: } ! 280: ! 281: /* ! 282: * Get current clock value plus fraction of a tick. ! 283: */ ! 284: static tvalspec_t ! 285: system_time_stamp(void) ! 286: { ! 287: tvalspec_t result; ! 288: ! 289: read_processor_clock_tval(&result); ! 290: ! 291: return (result); ! 292: } ! 293: ! 294: /* Return 32 bit representation of event counter */ ! 295: unsigned int ! 296: event_get(void) ! 297: { ! 298: return (system_time_stamp().tv_nsec); ! 299: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.