blob: e70bff745bdd1af9f8b0d8833846d96d9b5736bf [file] [log] [blame]
/*
* Copyright (C) 2008 Imagination Technologies Ltd.
* Licensed under the GPL
*
*/
#include <asm/ftrace.h>
.text
#ifdef CONFIG_DYNAMIC_FTRACE
.global _mcount_wrapper
.type _mcount_wrapper,function
_mcount_wrapper:
MOV PC,D0.4
.global _ftrace_caller
.type _ftrace_caller,function
_ftrace_caller:
MOVT D0Re0,#HI(_function_trace_stop)
ADD D0Re0,D0Re0,#LO(_function_trace_stop)
GETD D0Re0,[D0Re0]
CMP D0Re0,#0
BEQ $Lcall_stub
MOV PC,D0.4
$Lcall_stub:
MSETL [A0StP], D0Ar6, D0Ar4, D0Ar2, D0.4
MOV D1Ar1, D0.4
MOV D0Ar2, D1RtP
SUB D1Ar1,D1Ar1,#MCOUNT_INSN_SIZE
.global _ftrace_call
_ftrace_call:
MOVT D1RtP,#HI(_ftrace_stub)
CALL D1RtP,#LO(_ftrace_stub)
GETL D0.4, D1RtP, [A0StP++#(-8)]
GETL D0Ar2, D1Ar1, [A0StP++#(-8)]
GETL D0Ar4, D1Ar3, [A0StP++#(-8)]
GETL D0Ar6, D1Ar5, [A0StP++#(-8)]
MOV PC, D0.4
#else
.global _mcount_wrapper
.type _mcount_wrapper,function
_mcount_wrapper:
MOVT D0Re0,#HI(_function_trace_stop)
ADD D0Re0,D0Re0,#LO(_function_trace_stop)
GETD D0Re0,[D0Re0]
CMP D0Re0,#0
BEQ $Lcall_mcount
MOV PC,D0.4
$Lcall_mcount:
MSETL [A0StP], D0Ar6, D0Ar4, D0Ar2, D0.4
MOV D1Ar1, D0.4
MOV D0Ar2, D1RtP
MOVT D0Re0,#HI(_ftrace_trace_function)
ADD D0Re0,D0Re0,#LO(_ftrace_trace_function)
GET D1Ar3,[D0Re0]
MOVT D1Re0,#HI(_ftrace_stub)
ADD D1Re0,D1Re0,#LO(_ftrace_stub)
CMP D1Ar3,D1Re0
BEQ $Ltrace_exit
MOV D1RtP,D1Ar3
SUB D1Ar1,D1Ar1,#MCOUNT_INSN_SIZE
SWAP PC,D1RtP
$Ltrace_exit:
GETL D0.4, D1RtP, [A0StP++#(-8)]
GETL D0Ar2, D1Ar1, [A0StP++#(-8)]
GETL D0Ar4, D1Ar3, [A0StP++#(-8)]
GETL D0Ar6, D1Ar5, [A0StP++#(-8)]
MOV PC, D0.4
#endif /* CONFIG_DYNAMIC_FTRACE */
.global _ftrace_stub
_ftrace_stub:
MOV PC,D1RtP