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 pushl %ebp // setup mcount's frame 35 movl %esp,%ebp 36 pushl %eax // 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 movl (%ebp),%eax // frame pointer of mcount's caller 63 movl 4(%eax),%eax // mcount's caller's return address 64 pushl 4(%ebp) // push selfpc parameter for mcount() 65 pushl %eax // push frompc parameter for mcount() 66 call _mcount // call the C mcount 67 addl $8,%esp // pop args 68 69 decl %gs:CPU_MCOUNT_OFF // turn off recursion flag 701: 71 popf // restore interrupt state 72 popl %eax 73 movl %ebp,%esp // tear down mcount's frame 74 popl %ebp 75 ret 76