162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 362306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive for 462306a36Sopenharmony_ci * more details. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2009 DSLab, Lanzhou University, China 762306a36Sopenharmony_ci * Author: Wu Zhangjin <wuzhangjin@gmail.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef _ASM_MIPS_FTRACE_H 1162306a36Sopenharmony_ci#define _ASM_MIPS_FTRACE_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifdef CONFIG_FUNCTION_TRACER 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define MCOUNT_ADDR ((unsigned long)(_mcount)) 1662306a36Sopenharmony_ci#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 1962306a36Sopenharmony_ciextern void _mcount(void); 2062306a36Sopenharmony_ci#define mcount _mcount 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define safe_load(load, src, dst, error) \ 2362306a36Sopenharmony_cido { \ 2462306a36Sopenharmony_ci asm volatile ( \ 2562306a36Sopenharmony_ci "1: " load " %[tmp_dst], 0(%[tmp_src])\n" \ 2662306a36Sopenharmony_ci " li %[tmp_err], 0\n" \ 2762306a36Sopenharmony_ci "2: .insn\n" \ 2862306a36Sopenharmony_ci \ 2962306a36Sopenharmony_ci ".section .fixup, \"ax\"\n" \ 3062306a36Sopenharmony_ci "3: li %[tmp_err], 1\n" \ 3162306a36Sopenharmony_ci " j 2b\n" \ 3262306a36Sopenharmony_ci ".previous\n" \ 3362306a36Sopenharmony_ci \ 3462306a36Sopenharmony_ci ".section\t__ex_table,\"a\"\n\t" \ 3562306a36Sopenharmony_ci STR(PTR_WD) "\t1b, 3b\n\t" \ 3662306a36Sopenharmony_ci ".previous\n" \ 3762306a36Sopenharmony_ci \ 3862306a36Sopenharmony_ci : [tmp_dst] "=&r" (dst), [tmp_err] "=r" (error)\ 3962306a36Sopenharmony_ci : [tmp_src] "r" (src) \ 4062306a36Sopenharmony_ci : "memory" \ 4162306a36Sopenharmony_ci ); \ 4262306a36Sopenharmony_ci} while (0) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define safe_store(store, src, dst, error) \ 4562306a36Sopenharmony_cido { \ 4662306a36Sopenharmony_ci asm volatile ( \ 4762306a36Sopenharmony_ci "1: " store " %[tmp_src], 0(%[tmp_dst])\n"\ 4862306a36Sopenharmony_ci " li %[tmp_err], 0\n" \ 4962306a36Sopenharmony_ci "2: .insn\n" \ 5062306a36Sopenharmony_ci \ 5162306a36Sopenharmony_ci ".section .fixup, \"ax\"\n" \ 5262306a36Sopenharmony_ci "3: li %[tmp_err], 1\n" \ 5362306a36Sopenharmony_ci " j 2b\n" \ 5462306a36Sopenharmony_ci ".previous\n" \ 5562306a36Sopenharmony_ci \ 5662306a36Sopenharmony_ci ".section\t__ex_table,\"a\"\n\t"\ 5762306a36Sopenharmony_ci STR(PTR_WD) "\t1b, 3b\n\t" \ 5862306a36Sopenharmony_ci ".previous\n" \ 5962306a36Sopenharmony_ci \ 6062306a36Sopenharmony_ci : [tmp_err] "=r" (error) \ 6162306a36Sopenharmony_ci : [tmp_dst] "r" (dst), [tmp_src] "r" (src)\ 6262306a36Sopenharmony_ci : "memory" \ 6362306a36Sopenharmony_ci ); \ 6462306a36Sopenharmony_ci} while (0) 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define safe_load_code(dst, src, error) \ 6762306a36Sopenharmony_ci safe_load(STR(lw), src, dst, error) 6862306a36Sopenharmony_ci#define safe_store_code(src, dst, error) \ 6962306a36Sopenharmony_ci safe_store(STR(sw), src, dst, error) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#define safe_load_stack(dst, src, error) \ 7262306a36Sopenharmony_ci safe_load(STR(PTR_L), src, dst, error) 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define safe_store_stack(src, dst, error) \ 7562306a36Sopenharmony_ci safe_store(STR(PTR_S), src, dst, error) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#ifdef CONFIG_DYNAMIC_FTRACE 7962306a36Sopenharmony_cistatic inline unsigned long ftrace_call_adjust(unsigned long addr) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci return addr; 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistruct dyn_arch_ftrace { 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#endif /* CONFIG_DYNAMIC_FTRACE */ 8862306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 8962306a36Sopenharmony_ci#endif /* CONFIG_FUNCTION_TRACER */ 9062306a36Sopenharmony_ci#endif /* _ASM_MIPS_FTRACE_H */ 91