X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/060df5ea7c632b1ac8cc8aac1fb59758165c2084..6d2010ae8f7a6078e10b361c6962983bab233e0f:/osfmk/i386/rtclock.h diff --git a/osfmk/i386/rtclock.h b/osfmk/i386/rtclock.h deleted file mode 100644 index d98b8808f..000000000 --- a/osfmk/i386/rtclock.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2004-2010 Apple Inc. All rights reserved. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. The rights granted to you under the License - * may not be used to create, or enable the creation or redistribution of, - * unlawful or unlicensed copies of an Apple operating system, or to - * circumvent, violate, or enable the circumvention or violation of, any - * terms of an Apple operating system software license agreement. - * - * Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this file. - * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and - * limitations under the License. - * - * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ - */ -/* - * @OSF_COPYRIGHT@ - */ -/* - * @APPLE_FREE_COPYRIGHT@ - */ -/* - * File: rtclock.h - * Purpose: Routines for handling the machine dependent - * real-time clock. - */ - -#ifndef _I386_RTCLOCK_H_ -#define _I386_RTCLOCK_H_ - -#ifndef ASSEMBLER -typedef struct rtc_nanotime { - volatile uint64_t tsc_base; /* timestamp */ - volatile uint64_t ns_base; /* nanoseconds */ - uint32_t scale; /* tsc -> nanosec multiplier */ - uint32_t shift; /* tsc -> nanosec shift/div */ - /* shift is overloaded with - * lower 32bits of tsc_freq - * on slower machines (SLOW_TSC_THRESHOLD) */ - volatile uint32_t generation; /* 0 == being updated */ - uint32_t spare1; -} rtc_nanotime_t; - -#if 0 -#include -#endif - -struct cpu_data; - -extern uint64_t tsc_rebase_abs_time; - -extern void _rtc_nanotime_store( - uint64_t tsc, - uint64_t nsec, - uint32_t scale, - uint32_t shift, - rtc_nanotime_t *dst); - -extern void _rtc_nanotime_adjust( - uint64_t tsc_base_delta, - rtc_nanotime_t *dst); - -extern uint64_t _rtc_nanotime_read( - rtc_nanotime_t *rntp, - int slow); - -extern rtc_nanotime_t rtc_nanotime_info; -#endif - -#define SLOW_TSC_THRESHOLD 1000067800 /* TSC is too slow for regular nanotime() algorithm */ - -#if defined(__i386__) -/* - * Assembly snippet included in exception handlers and rtc_nanotime_read() - * %edi points to nanotime info struct - * %edx:%eax returns nanotime - */ -#define RTC_NANOTIME_READ_FAST() \ -0: movl RNT_GENERATION(%edi),%esi /* being updated? */ ; \ - testl %esi,%esi ; \ - jz 0b /* wait until done */ ; \ - lfence ; \ - rdtsc ; \ - lfence ; \ - subl RNT_TSC_BASE(%edi),%eax ; \ - sbbl RNT_TSC_BASE+4(%edi),%edx /* tsc - tsc_base */ ; \ - movl RNT_SCALE(%edi),%ecx /* * scale factor */ ; \ - movl %edx,%ebx ; \ - mull %ecx ; \ - movl %ebx,%eax ; \ - movl %edx,%ebx ; \ - mull %ecx ; \ - addl %ebx,%eax ; \ - adcl $0,%edx ; \ - addl RNT_NS_BASE(%edi),%eax /* + ns_base */ ; \ - adcl RNT_NS_BASE+4(%edi),%edx ; \ - cmpl RNT_GENERATION(%edi),%esi /* check for update */ ; \ - jne 0b /* do it all again */ - -#elif defined(__x86_64__) - -/* - * Assembly snippet included in exception handlers and rtc_nanotime_read() - * %rdi points to nanotime info struct. - * %rax returns nanotime - */ -#define RTC_NANOTIME_READ_FAST() \ -0: movl RNT_GENERATION(%rdi),%esi ; \ - test %esi,%esi /* info updating? */ ; \ - jz 0b /* - wait if so */ ; \ - lfence ; \ - rdtsc ; \ - lfence ; \ - shlq $32,%rdx ; \ - orq %rdx,%rax /* %rax := tsc */ ; \ - subq RNT_TSC_BASE(%rdi),%rax /* tsc - tsc_base */ ; \ - xorq %rcx,%rcx ; \ - movl RNT_SCALE(%rdi),%ecx ; \ - mulq %rcx /* delta * scale */ ; \ - shrdq $32,%rdx,%rax /* %rdx:%rax >>= 32 */ ; \ - addq RNT_NS_BASE(%rdi),%rax /* add ns_base */ ; \ - cmpl RNT_GENERATION(%rdi),%esi /* repeat if changed */ ; \ - jne 0b - -#endif - -#endif /* _I386_RTCLOCK_H_ */