[Sheepdog] [RFC PATCH 02/11] trace: low level functions in assembly

Liu Yuan namei.unix at gmail.com
Tue Jan 17 12:59:53 CET 2012


From: Liu Yuan <tailai.ly at taobao.com>


Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 include/util.h       |    2 +
 sheep/trace/mcount.S |   66 ++++++++++++++++++++++++++++++++++++++++++++++++++
 sheep/trace/trace.h  |   10 +++++++
 3 files changed, 78 insertions(+), 0 deletions(-)
 create mode 100644 sheep/trace/mcount.S
 create mode 100644 sheep/trace/trace.h

diff --git a/include/util.h b/include/util.h
index 725c8f8..ff86a00 100644
--- a/include/util.h
+++ b/include/util.h
@@ -28,6 +28,8 @@
 #define __cpu_to_le32(x) bswap_32(x)
 #endif
 
+#define notrace __attribute__((no_instrument_function))
+
 static inline int before(uint32_t seq1, uint32_t seq2)
 {
         return (int32_t)(seq1 - seq2) < 0;
diff --git a/sheep/trace/mcount.S b/sheep/trace/mcount.S
new file mode 100644
index 0000000..c16e5ae
--- /dev/null
+++ b/sheep/trace/mcount.S
@@ -0,0 +1,66 @@
+#define __ASSEMBLY__
+#include "trace.h"
+
+#define _ALIGN_TEXT .align 16, 0x90
+
+#define ENTRY(x) \
+        .text; _ALIGN_TEXT; .globl x; .type x, at function; x:
+
+ENTRY(mcount)
+	subq $0x38, %rsp
+	movq %rax, (%rsp)
+	movq %rcx, 8(%rsp)
+	movq %rdx, 16(%rsp)
+	movq %rsi, 24(%rsp)
+	movq %rdi, 32(%rsp)
+	movq %r8, 40(%rsp)
+	movq %r9, 48(%rsp)
+
+	movq 0x38(%rsp), %rdi
+	subq $INSN_SIZE, %rdi
+
+.globl mcount_call
+mcount_call:
+	call trace_stub
+
+	movq 48(%rsp), %r9
+	movq 40(%rsp), %r8
+	movq 32(%rsp), %rdi
+	movq 24(%rsp), %rsi
+	movq 16(%rsp), %rdx
+	movq 8(%rsp), %rcx
+	movq (%rsp), %rax
+	addq $0x38, %rsp
+
+	retq
+
+ENTRY(trace_caller)
+	subq $0x38, %rsp
+	movq %rax, (%rsp)
+	movq %rcx, 8(%rsp)
+	movq %rdx, 16(%rsp)
+	movq %rsi, 24(%rsp)
+	movq %rdi, 32(%rsp)
+	movq %r8, 40(%rsp)
+	movq %r9, 48(%rsp)
+
+	movq 0x38(%rsp), %rdi
+	movq 8(%rbp), %rsi
+	subq $INSN_SIZE, %rdi
+
+.globl trace_call
+trace_call:
+	call trace_stub
+
+	movq 48(%rsp), %r9
+	movq 40(%rsp), %r8
+	movq 32(%rsp), %rdi
+	movq 24(%rsp), %rsi
+	movq 16(%rsp), %rdx
+	movq 8(%rsp), %rcx
+	movq (%rsp), %rax
+	addq $0x38, %rsp
+
+.globl trace_stub
+trace_stub:
+	retq
diff --git a/sheep/trace/trace.h b/sheep/trace/trace.h
new file mode 100644
index 0000000..3e675e1
--- /dev/null
+++ b/sheep/trace/trace.h
@@ -0,0 +1,10 @@
+#ifndef TRACE_H
+#define TRACE_H
+
+/* mcount.S */
+extern void mcount(void);
+extern void mcount_call(void);
+extern void trace_caller(void);
+extern void trace_call(unsigned long, unsigned long *);
+
+#endif
-- 
1.7.8.2




More information about the sheepdog mailing list