]> Pileus Git - ~andy/linux/blob - arch/metag/kernel/ftrace_stub.S
metag: ftrace support
[~andy/linux] / arch / metag / kernel / ftrace_stub.S
1 /*
2  * Copyright (C) 2008 Imagination Technologies Ltd.
3  * Licensed under the GPL
4  *
5  */
6
7 #include <asm/ftrace.h>
8
9         .text
10 #ifdef CONFIG_DYNAMIC_FTRACE
11         .global _mcount_wrapper
12         .type   _mcount_wrapper,function
13 _mcount_wrapper:
14         MOV     PC,D0.4
15
16         .global _ftrace_caller
17         .type   _ftrace_caller,function
18 _ftrace_caller:
19         MOVT    D0Re0,#HI(_function_trace_stop)
20         ADD     D0Re0,D0Re0,#LO(_function_trace_stop)
21         GETD    D0Re0,[D0Re0]
22         CMP     D0Re0,#0
23         BEQ     $Lcall_stub
24         MOV     PC,D0.4
25 $Lcall_stub:
26         MSETL   [A0StP], D0Ar6, D0Ar4, D0Ar2, D0.4
27         MOV     D1Ar1, D0.4
28         MOV     D0Ar2, D1RtP
29         SUB     D1Ar1,D1Ar1,#MCOUNT_INSN_SIZE
30
31         .global _ftrace_call
32 _ftrace_call:
33         MOVT    D1RtP,#HI(_ftrace_stub)
34         CALL    D1RtP,#LO(_ftrace_stub)
35         GETL    D0.4,  D1RtP, [A0StP++#(-8)]
36         GETL    D0Ar2, D1Ar1, [A0StP++#(-8)]
37         GETL    D0Ar4, D1Ar3, [A0StP++#(-8)]
38         GETL    D0Ar6, D1Ar5, [A0StP++#(-8)]
39         MOV     PC, D0.4
40 #else
41
42         .global _mcount_wrapper
43         .type   _mcount_wrapper,function
44 _mcount_wrapper:
45         MOVT    D0Re0,#HI(_function_trace_stop)
46         ADD     D0Re0,D0Re0,#LO(_function_trace_stop)
47         GETD    D0Re0,[D0Re0]
48         CMP     D0Re0,#0
49         BEQ     $Lcall_mcount
50         MOV     PC,D0.4
51 $Lcall_mcount:
52         MSETL   [A0StP], D0Ar6, D0Ar4, D0Ar2, D0.4
53         MOV     D1Ar1, D0.4
54         MOV     D0Ar2, D1RtP
55         MOVT    D0Re0,#HI(_ftrace_trace_function)
56         ADD     D0Re0,D0Re0,#LO(_ftrace_trace_function)
57         GET     D1Ar3,[D0Re0]
58         MOVT    D1Re0,#HI(_ftrace_stub)
59         ADD     D1Re0,D1Re0,#LO(_ftrace_stub)
60         CMP     D1Ar3,D1Re0
61         BEQ     $Ltrace_exit
62         MOV     D1RtP,D1Ar3
63         SUB     D1Ar1,D1Ar1,#MCOUNT_INSN_SIZE
64         SWAP    PC,D1RtP
65 $Ltrace_exit:
66         GETL    D0.4,  D1RtP, [A0StP++#(-8)]
67         GETL    D0Ar2, D1Ar1, [A0StP++#(-8)]
68         GETL    D0Ar4, D1Ar3, [A0StP++#(-8)]
69         GETL    D0Ar6, D1Ar5, [A0StP++#(-8)]
70         MOV     PC, D0.4
71
72 #endif  /* CONFIG_DYNAMIC_FTRACE */
73
74         .global _ftrace_stub
75 _ftrace_stub:
76         MOV     PC,D1RtP