1/* 2 * Copyright (c) 2003 Apple Computer, 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#define __NO_UNDERSCORES__ 30#include <i386/asm.h> 31#include <assym.s> 32 33Entry(mcount) 34 pushq %rbp // setup mcount's frame 35 movq %rsp,%rbp 36 pushq %rax // save %eax 37 pushf // save interrupt state 38 cli // disable interrupts 39 40 // 41 // Check that this cpu is ready. 42 // This delays the start of mcounting until a cpu is really prepared. 43 // 44 mov %gs,%ax 45 test %ax,%ax 46 jz 1f 47 48 movl %gs:CPU_RUNNING,%eax 49 testl %eax,%eax 50 jz 1f 51 52 // 53 // Test for recursion as indicated by a per-cpu flag. 54 // Skip if nested, otherwise set the flag and call the C mount(). 55 // 56 movl %gs:CPU_MCOUNT_OFF,%eax 57 testl %eax,%eax // test for recursion 58 jnz 1f 59 60 incl %gs:CPU_MCOUNT_OFF // set recursion flag 61 62 movq (%rbp),%rax // frame pointer of mcount's caller 63 pushq %rdi 64 pushq %rsi 65 pushq %rdx 66 pushq %rcx 67 pushq %r8 68 pushq %r9 69 movq 8(%rax),%rdi // mcount's caller's return address 70 movq 8(%rbp),%rsi // push selfpc parameter for mcount() 71 72 call _mcount // call the C mcount 73 74 popq %r9 75 popq %r8 76 popq %rcx 77 popq %rdx 78 popq %rsi 79 popq %rdi 80 81 decl %gs:CPU_MCOUNT_OFF // turn off recursion flag 821: 83 popf // restore interrupt state 84 popq %rax 85 movq %rbp,%rsp // tear down mcount's frame 86 popq %rbp 87 ret 88