1/* 2 * Copyright (c) 2003-2007 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29#include <sys/appleapiopts.h> 30#include <machine/cpu_capabilities.h> 31 32#if defined(__i386__) 33 34 .text 35 .align 4, 0x90 36 .globl _mach_approximate_time 37_mach_approximate_time: 38 pushl %ebp // push a frame 39 movl %esp, %ebp 40 cmpb $0, _COMM_PAGE_APPROX_TIME_SUPPORTED // check commpage 41 // "is supported" flag. 42 je _approx_time_not_supported // if zero, fall through to 43 // absolute_time 44 // note the comment above for 32-bit ARM applies equally to 32-bit i386. 45 .align 4, 0x90 46_approx_time_consistency_check: 47 movl _COMM_PAGE_APPROX_TIME+4, %edx // load high 48 movl _COMM_PAGE_APPROX_TIME, %eax // load low 49 lfence // avoid predictive reads that 50 // could be invalid if 51 // interrupted 52 cmpl _COMM_PAGE_APPROX_TIME+4, %edx // load high and check if equal 53 // to the first read 54 jne _approx_time_consistency_check // if not, try again. 55 popl %ebp 56 ret 57 58_approx_time_not_supported: 59 popl %ebp 60 jmp _mach_absolute_time 61 62#endif 63