summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/amd64/include/profile.h67
1 files changed, 39 insertions, 28 deletions
diff --git a/sys/arch/amd64/include/profile.h b/sys/arch/amd64/include/profile.h
index 5d928249a31..f1f8a9330b8 100644
--- a/sys/arch/amd64/include/profile.h
+++ b/sys/arch/amd64/include/profile.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: profile.h,v 1.1 2004/01/28 01:39:39 mickey Exp $ */
-/* $NetBSD: profile.h,v 1.1 2003/04/26 18:39:46 fvdl Exp $ */
+/* $OpenBSD: profile.h,v 1.2 2004/05/13 03:27:33 drahn Exp $ */
+/* $NetBSD: profile.h,v 1.3 2003/11/28 23:22:45 fvdl Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -13,11 +13,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
@@ -36,30 +32,45 @@
* @(#)profile.h 8.1 (Berkeley) 6/11/93
*/
-#define _MCOUNT_DECL static __inline void _mcount
+#define _MCOUNT_DECL void _mcount
-#define MCOUNT_ENTRY "mcount"
+#ifdef PIC
+#define __MCPLT "@PLT"
+#else
+#define __MCPLT
+#endif
-/*
- * XXXfvdl this is screwed by -fomit-frame-pointer being included in
- * -O.
- */
-#define MCOUNT \
-extern void mcount __P((void)) __asm__(MCOUNT_ENTRY); \
-void \
-mcount() \
-{ \
- _mcount((u_long)__builtin_return_address(1), \
- (u_long)__builtin_return_address(0)); \
-}
+#define MCOUNT \
+__asm(" .globl __mcount \n" \
+" .type __mcount,@function\n" \
+"__mcount: \n" \
+" pushq %rbp \n" \
+" movq %rsp,%rbp \n" \
+" subq $56,%rsp \n" \
+" movq %rdi,0(%rsp) \n" \
+" movq %rsi,8(%rsp) \n" \
+" movq %rdx,16(%rsp) \n" \
+" movq %rcx,24(%rsp) \n" \
+" movq %r8,32(%rsp) \n" \
+" movq %r9,40(%rsp) \n" \
+" movq %rax,48(%rsp) \n" \
+" movq 0(%rbp),%r11 \n" \
+" movq 8(%r11),%rdi \n" \
+" movq 8(%rbp),%rsi \n" \
+" call _mcount \n" \
+" movq 0(%rsp),%rdi \n" \
+" movq 8(%rsp),%rsi \n" \
+" movq 16(%rsp),%rdx \n" \
+" movq 24(%rsp),%rcx \n" \
+" movq 32(%rsp),%r8 \n" \
+" movq 40(%rsp),%r9 \n" \
+" movq 48(%rsp),%rax \n" \
+" leave \n" \
+" ret \n" \
+" .size __mcount,.-__mcount");
#ifdef _KERNEL
-/*
- * Note that we assume splhigh() and splx() cannot call mcount()
- * recursively.
- */
-#define MCOUNT_ENTER s = splhigh()
-#define MCOUNT_EXIT splx(s)
+#define MCOUNT_ENTER (void)&s; __asm__("cli");
+#define MCOUNT_EXIT __asm__("sti");
#endif /* _KERNEL */
-