diff mbox series

[4/4] MIPS: add DYNAMIC_FTRACE_WITH_REGS

Message ID 20210305101933.9799-5-huangpei@loongson.cn (mailing list archive)
State New, archived
Headers show
Series [1/4] MIPS: replace -pg with CC_FLAGS_FTRACE | expand

Commit Message

Huang Pei March 5, 2021, 10:19 a.m. UTC
Add another ftrace implementation in parallel with mcount-based ftrace

+. Depend on GCC with -fpatchable-function-entry

+. Use 3 nops for stub in module and vmlinux, smaller than old one.

+. Simplify ftrace_regs_caller/ftrace_caller handling, especially
on MIPS O32

+. No adjustment on sp, so callee(the traced function) can get caller's
sp, very friendly to livepatch

Signed-off-by: Huang Pei <huangpei@loongson.cn>
---
 arch/mips/Kconfig               |   2 +
 arch/mips/Makefile              |  16 ++-
 arch/mips/include/asm/ftrace.h  |   7 ++
 arch/mips/kernel/Makefile       |   5 +-
 arch/mips/kernel/entry-ftrace.S | 182 +++++++++++++++++++++++++++
 arch/mips/kernel/ftrace.c       | 215 ++++++++++++++++++++++++++++++++
 6 files changed, 422 insertions(+), 5 deletions(-)
 create mode 100644 arch/mips/kernel/entry-ftrace.S
 create mode 100644 arch/mips/kernel/ftrace.c

Comments

kernel test robot March 7, 2021, 10:50 a.m. UTC | #1
Hi Huang,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on tip/perf/core]
[also build test ERROR on linus/master hnaz-linux-mm/master v5.12-rc2 next-20210305]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Huang-Pei/MIPS-replace-pg-with-CC_FLAGS_FTRACE/20210307-115946
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 8bcfdd7cad3dffdd340f9a79098cbf331eb2cd53
config: mips-randconfig-r003-20210307 (attached as .config)
compiler: mips-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/32a9684a1c08df48b3dcf8402a201ae5b0244472
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Huang-Pei/MIPS-replace-pg-with-CC_FLAGS_FTRACE/20210307-115946
        git checkout 32a9684a1c08df48b3dcf8402a201ae5b0244472
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=mips 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   {standard input}: Assembler messages:
>> {standard input}:118: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:119: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:120: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:146: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:147: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:148: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:192: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:193: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:194: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:245: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:246: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:247: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:329: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:330: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:331: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:357: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:358: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:359: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:431: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:432: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:433: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:539: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:540: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:541: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:640: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:641: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:642: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:733: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:734: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:735: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:854: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:855: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:856: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:898: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:899: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:900: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1159: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1160: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1161: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1415: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1416: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1417: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2114: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2115: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2116: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2416: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2417: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2418: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3109: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3110: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3111: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3318: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3319: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3320: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3655: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3656: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3657: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3690: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3691: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3692: Error: junk at end of line, first unrecognized character is `%'
--
   {standard input}: Assembler messages:
   {standard input}:117: Error: junk at end of line, first unrecognized character is `%'
>> {standard input}:118: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:119: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:158: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:159: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:160: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:187: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:188: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:189: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:232: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:233: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:234: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:260: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:261: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:262: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:448: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:449: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:450: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:496: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:497: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:498: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:537: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:538: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:539: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:565: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:566: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:567: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:610: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:611: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:612: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:782: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:783: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:784: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:858: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:859: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:860: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:977: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:978: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:979: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1048: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1049: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1050: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1121: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1122: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1123: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1175: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1176: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1177: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1290: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1291: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1292: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1626: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1627: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1628: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1902: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1903: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1904: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2421: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2422: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2423: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2569: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2570: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2571: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2916: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2917: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2918: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2951: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2952: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2953: Error: junk at end of line, first unrecognized character is `%'
--
   drivers/net/ethernet/hisilicon/hns_mdio.c:553:36: warning: 'hns_mdio_acpi_match' defined but not used [-Wunused-const-variable=]
     553 | static const struct acpi_device_id hns_mdio_acpi_match[] = {
         |                                    ^~~~~~~~~~~~~~~~~~~
   {standard input}: Assembler messages:
>> {standard input}:118: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:119: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:120: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:146: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:147: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:148: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:214: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:215: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:216: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:461: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:462: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:463: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:520: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:521: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:522: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:627: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:628: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:629: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:756: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:757: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:758: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:799: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:800: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:801: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:989: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:990: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:991: Error: junk at end of line, first unrecognized character is `%'
--
   {standard input}: Assembler messages:
>> {standard input}:118: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:119: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:120: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:146: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:147: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:148: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:200: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:201: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:202: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:288: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:289: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:290: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:328: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:329: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:330: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:395: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:396: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:397: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:439: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:440: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:441: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:497: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:498: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:499: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:773: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:774: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:775: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:823: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:824: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:825: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1384: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1385: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1386: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1432: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1433: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1434: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1650: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1651: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1652: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1717: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1718: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1719: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1773: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1774: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1775: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1818: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1819: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1820: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1919: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1920: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1921: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2107: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2108: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2109: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2169: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2170: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2171: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2417: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2418: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2419: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2555: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2556: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2557: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2686: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2687: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2688: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3101: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3102: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:3103: Error: junk at end of line, first unrecognized character is `%'
--
   {standard input}: Assembler messages:
   {standard input}:117: Error: junk at end of line, first unrecognized character is `%'
>> {standard input}:118: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:119: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:147: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:148: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:149: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:193: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:194: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:195: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:254: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:255: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:256: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:328: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:329: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:330: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:368: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:369: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:370: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:418: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:419: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:420: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:527: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:528: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:529: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:619: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:620: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:621: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:671: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:672: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:673: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:977: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:978: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:979: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1059: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1060: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1061: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1168: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1169: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1170: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1201: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1202: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1203: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1244: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1245: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1246: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1375: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1376: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1377: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1669: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1670: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1671: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1821: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1822: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1823: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1962: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1963: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1964: Error: junk at end of line, first unrecognized character is `%'
--
   {standard input}: Assembler messages:
   {standard input}:117: Error: junk at end of line, first unrecognized character is `%'
>> {standard input}:118: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:119: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:143: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:144: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:145: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:205: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:206: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:207: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:230: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:231: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:232: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:255: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:256: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:257: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:285: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:286: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:287: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:315: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:316: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:317: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:381: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:382: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:383: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:457: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:458: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:459: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:525: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:526: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:527: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:630: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:631: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:632: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:655: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:656: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:657: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:690: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:691: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:692: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:767: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:768: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:769: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:888: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:889: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:890: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1014: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1015: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1016: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1225: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1226: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1227: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1256: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1257: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1258: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1342: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1343: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1344: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1446: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1447: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1448: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1481: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1482: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1483: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1516: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1517: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1518: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1551: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1552: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1553: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1591: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1592: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1593: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1674: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1675: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1676: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1703: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1704: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1705: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1782: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1783: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1784: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1830: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1831: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1832: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1855: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1856: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1857: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1932: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1933: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1934: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1979: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1980: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:1981: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2042: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2043: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2044: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2093: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2094: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2095: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2118: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2119: Error: junk at end of line, first unrecognized character is `%'
   {standard input}:2120: Error: junk at end of line, first unrecognized character is `%'
..

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 5741dae35b74..6b96a19a42c2 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -56,6 +56,8 @@  config MIPS
 	select HAVE_DEBUG_STACKOVERFLOW
 	select HAVE_DMA_CONTIGUOUS
 	select HAVE_DYNAMIC_FTRACE
+	select HAVE_DYNAMIC_FTRACE_WITH_REGS \
+		if $(cc-option, -fpatchable-function-entry=3)
 	select HAVE_EBPF_JIT if 64BIT && !CPU_MICROMIPS && TARGET_ISA_REV >= 2
 	select HAVE_EXIT_THREAD
 	select HAVE_FAST_GUP
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 0d0f29d662c9..1d6553f0623e 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -56,13 +56,16 @@  ifneq ($(SUBARCH),$(ARCH))
   endif
 endif
 
-ifdef CONFIG_FUNCTION_GRAPH_TRACER
-  ifndef KBUILD_MCOUNT_RA_ADDRESS
-    ifeq ($(call cc-option-yn,-mmcount-ra-address), y)
-      cflags-y += -mmcount-ra-address -DKBUILD_MCOUNT_RA_ADDRESS
+ifndef CONFIG_DYNMAIC_FTRACE_WITH_REGS
+  ifdef CONFIG_FUNCTION_GRAPH_TRACER
+    ifndef KBUILD_MCOUNT_RA_ADDRESS
+      ifeq ($(call cc-option-yn,-mmcount-ra-address), y)
+        cflags-y += -mmcount-ra-address -DKBUILD_MCOUNT_RA_ADDRESS
+      endif
     endif
   endif
 endif
+
 cflags-y += $(call cc-option, -mno-check-zero-division)
 
 ifdef CONFIG_32BIT
@@ -293,6 +296,11 @@  ifdef CONFIG_64BIT
 bootvars-y	+= ADDR_BITS=64
 endif
 
+ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
+	KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
+	CC_FLAGS_FTRACE := -fpatchable-function-entry=3
+endif
+
 # This is required to get dwarf unwinding tables into .debug_frame
 # instead of .eh_frame so we don't discard them.
 KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
diff --git a/arch/mips/include/asm/ftrace.h b/arch/mips/include/asm/ftrace.h
index b463f2aa5a61..e3b0910486ab 100644
--- a/arch/mips/include/asm/ftrace.h
+++ b/arch/mips/include/asm/ftrace.h
@@ -87,4 +87,11 @@  struct dyn_arch_ftrace {
 #endif /*  CONFIG_DYNAMIC_FTRACE */
 #endif /* __ASSEMBLY__ */
 #endif /* CONFIG_FUNCTION_TRACER */
+
+#ifdef CONFIG_DYNAMIC_FTRACE_WITH_REGS
+struct dyn_ftrace;
+int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
+#define ftrace_init_nop ftrace_init_nop
+#endif
+
 #endif /* _ASM_MIPS_FTRACE_H */
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
index 3e7b0ee54cfb..7b07d80aadd5 100644
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -21,6 +21,7 @@  CFLAGS_REMOVE_ftrace-mcount.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_early_printk.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_perf_event.o = $(CC_FLAGS_FTRACE)
 CFLAGS_REMOVE_perf_event_mipsxx.o = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
 endif
 
 obj-$(CONFIG_CEVT_BCM1480)	+= cevt-bcm1480.o
@@ -39,7 +40,9 @@  obj-$(CONFIG_DEBUG_FS)		+= segment.o
 obj-$(CONFIG_STACKTRACE)	+= stacktrace.o
 obj-$(CONFIG_MODULES)		+= module.o
 
-obj-$(CONFIG_FUNCTION_TRACER)	+= mcount.o ftrace-mcount.o
+ft-$(CONFIG_FUNCTION_TRACER)	+= mcount.o ftrace-mcount.o
+ft-$(CONFIG_DYNAMIC_FTRACE_WITH_REGS)	:= entry-ftrace.o ftrace.o
+obj-y				+= $(ft-y)
 
 sw-y				:= r4k_switch.o
 sw-$(CONFIG_CPU_R3000)		:= r2300_switch.o
diff --git a/arch/mips/kernel/entry-ftrace.S b/arch/mips/kernel/entry-ftrace.S
new file mode 100644
index 000000000000..1e1eebc523ea
--- /dev/null
+++ b/arch/mips/kernel/entry-ftrace.S
@@ -0,0 +1,182 @@ 
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * arch/mips/kernel/entry_ftrace.S
+ *
+ * Copyright (C) 2021 Loongson Corp
+ * Author: Huang Pei <huangpei@loongson.cn>
+ */
+
+#include <asm/export.h>
+#include <asm/regdef.h>
+#include <asm/stackframe.h>
+
+/*
+ * ftrace_regs_caller() is the function that replaces _mcount() when ftrace
+ * is active.
+ *
+ * we arrive here after a function A calls function B, and B is what we
+ * are tracing for. When we enter, sp points to A's stack frame, B has not
+ * yet had a chance to allocate one yet. (This is different from -pg case
+ * , in which the B's stack is allocated))
+
+ * when ftrace initialized, it replace three nops from all function with 
+ * "lui + nop + move"
+ * B:
+ *	lui	at, %hi(ftrace_regs_caller)
+ *	nop
+ *	li	t0, 0
+ * #	B's real start
+ *
+ * at B's entry, when tracing enabled, replace the 'nop' with 'jalr'
+ *
+ * #	B's entry, three nop for both in vmlinux and in kernel modules
+ * B:
+ *	lui	at, %hi(ftrace_regs_caller)
+ *	jalr	at, at
+ *	move	t0, zero
+ * #	B's real start
+ *
+ * if set t0 to 1, then calling ftrace_regs_caller with partial regs saved
+ *
+ * B:
+ *	lui	at, %hi(ftrace_regs_caller)
+ *	jalr	at, at
+ *	li	t0, 1
+ * #	B's real start
+ *
+ * we make ftrace_regs_caller 64KB aligned, when entring ftrace_regs_caller
+ * AT points to the return address to B, and ra points to return address
+ * to A,
+ *
+ * if patched to new funcition, then clobbered the first real instruction
+ *
+ * B:
+ *	lui	at, %hi(new_B)
+ *	addiu	at, at, %lo(new_B)
+ *	jr	at
+ * #	B's real start, now clobbered with zero
+ *	nop
+ *
+ */
+	.text
+	.set push
+	.set noreorder
+	.set noat
+	.align 16
+NESTED(ftrace_regs_caller, PT_SIZE, ra)
+	PTR_ADDIU	sp, sp, -PT_SIZE
+	.globl ftrace_caller
+ftrace_caller:
+#ifdef CONFIG_64BIT
+	PTR_S	a4, PT_R8(sp)
+	PTR_S	a5, PT_R9(sp)
+	PTR_S	a6, PT_R10(sp)
+	PTR_S	a7, PT_R11(sp)
+#endif
+	PTR_S	a0, PT_R4(sp)
+	PTR_S	a1, PT_R5(sp)
+	PTR_S	a2, PT_R6(sp)
+
+	bnez	t0, 1f
+	PTR_S	a3, PT_R7(sp)
+
+	PTR_S	t0, PT_R12(sp)
+	PTR_S	t1, PT_R13(sp)
+	PTR_S	t2, PT_R14(sp)
+	PTR_S	t3, PT_R15(sp)
+
+	PTR_S	s0, PT_R16(sp)
+	PTR_S	s1, PT_R17(sp)
+	PTR_S	s2, PT_R18(sp)
+	PTR_S	s3, PT_R19(sp)
+
+	PTR_S	s4, PT_R20(sp)
+	PTR_S	s5, PT_R21(sp)
+	PTR_S	s6, PT_R22(sp)
+	PTR_S	s7, PT_R23(sp)
+
+	PTR_S	t8, PT_R24(sp)
+	PTR_S	t9, PT_R25(sp)
+	PTR_S	s8, PT_R30(sp)
+	PTR_S	gp, PT_R28(sp)
+
+1:
+	PTR_S	sp, PT_R29(sp)
+	PTR_S	ra, PT_R1(sp)
+	PTR_S	AT, PT_R31(sp)
+
+	END(ftrace_regs_caller)
+
+ftrace_common:
+	PTR_ADDIU	a0, AT, -12	//a0 points to B's entry address
+	move	a1, ra			//a1 points to return address to A
+	PTR_L	a2, function_trace_op	//a2 points to function_trace op
+
+	.globl	ftrace_call
+ftrace_call:
+	jal	ftrace_stub
+	move	a3, sp			//a3 point to frame pointer
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+	.globl ftrace_graph_call
+ftrace_graph_call:
+	nop
+	nop
+#endif
+
+ftrace_common_return:
+	PTR_L	AT, PT_R1(sp)
+ftrace_graph_return:
+	PTR_L	ra, PT_R31(sp)
+	PTR_L	a0, PT_R4(sp)
+	PTR_L	a1, PT_R5(sp)
+	PTR_L	a2, PT_R6(sp)
+	PTR_L	a3, PT_R7(sp)
+#ifdef CONFIG_64BIT
+	PTR_L	a4, PT_R8(sp)
+	PTR_L	a5, PT_R9(sp)
+	PTR_L	a6, PT_R10(sp)
+	PTR_L	a7, PT_R11(sp)
+#endif
+	PTR_ADDIU	sp, sp, PT_SIZE	//retore stack frame
+	jr	ra
+	move	ra, AT
+
+
+	.globl ftrace_stub
+ftrace_stub:
+	jr	ra
+	nop
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+	.globl	ftrace_graph_caller
+ftrace_graph_caller:
+	PTR_L	a0, PT_R1(sp)
+	PTR_L	a1, PT_R31(sp)
+	jal	prepare_ftrace_return
+	PTR_ADDIU	a2, sp, PT_SIZE
+
+	b	ftrace_graph_return
+	move	AT, v0
+
+
+	.align	2
+	.globl	return_to_handler
+return_to_handler:
+	PTR_SUBU	sp, PT_SIZE
+	PTR_S	v0, PT_R2(sp)
+
+	jal	ftrace_return_to_handler
+	 PTR_S	v1, PT_R3(sp)
+
+	/* restore the real parent address: v0 -> ra */
+	move	ra, v0
+
+	PTR_L	v0, PT_R2(sp)
+	PTR_L	v1, PT_R3(sp)
+	jr	ra
+	 PTR_ADDIU	sp, PT_SIZE
+
+	.set at
+	.set reorder
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c
new file mode 100644
index 000000000000..4c8bea1818cb
--- /dev/null
+++ b/arch/mips/kernel/ftrace.c
@@ -0,0 +1,215 @@ 
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * arch/mips/kernel/ftrace.c
+ *
+ * Copyright (C) 2021 Loongson Limited Corp.
+ * Author: Huang Pei <huangpei@loongson.cn>
+ */
+
+#include <linux/ftrace.h>
+#include <linux/module.h>
+#include <linux/swab.h>
+#include <linux/uaccess.h>
+
+#include <asm/ftrace.h>
+#include <asm/asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/cacheflush.h>
+#include <asm/uasm.h>
+
+
+#define INSN_NOP	0x00000000	/* nop */
+#define INSN_JALR_AT2	0x00200809 	/* jalr at, at */
+#define INSN_LI_0	0x240c0000	/* li t0, 0 */
+#define INSN_LI_1	0x240c0001	/* li t0, 1 */
+#define FTRACE_CALL_IP	((unsigned long)(&ftrace_call))
+#define JAL		0x0c000000	/* jump & link: ip --> ra, jump to target */
+#define ADDR_MASK	0x03ffffff	/*  op_code|addr : 31...26|25 ....0 */
+#define INSN_JAL(addr)	\
+	((unsigned int)(JAL | (((addr) >> 2) & ADDR_MASK)))
+
+extern void ftrace_graph_call(void);
+
+static unsigned int insn_lui __read_mostly;
+
+/* Arch override because MIPS doesn't need to run this from stop_machine() */
+void arch_ftrace_update_code(int command)
+{
+	ftrace_modify_all_code(command);
+}
+
+static int ftrace_modify_code(unsigned long ip, unsigned int new_code)
+{
+	int faulted;
+	mm_segment_t old_fs;
+
+	/* *(unsigned int *)ip = new_code; */
+	safe_store_code(new_code, ip, faulted);
+
+	if (unlikely(faulted))
+		return -EFAULT;
+
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	flush_icache_range(ip, ip + 8);
+	set_fs(old_fs);
+
+	return 0;
+}
+
+int ftrace_update_ftrace_func(ftrace_func_t func)
+{
+	unsigned int new;
+
+	new = INSN_JAL((unsigned long)func);
+
+	return ftrace_modify_code(FTRACE_CALL_IP, new);
+}
+
+/*
+ * enable tracing by replacing the middle nop with jalr, like
+ *
+ * lui	at, %hi(ftrace_regs_all)
+ * jalr	at, at
+ * li	t0, 0
+ */
+int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
+{
+	unsigned long ip = rec->ip;
+
+	ftrace_modify_code(ip + 4, INSN_JALR_AT2);
+	return 0;
+}
+
+/*
+ * disable recording regs by replacing
+ *
+ *  li	t0, 0
+ *
+ * with
+ *
+ *  li, t0, 1
+ *
+ * or vesa
+ */
+int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr,
+			unsigned long addr)
+{
+	unsigned long ip = rec->ip;
+
+	if (abs(old_addr - addr) == 4) {
+		if (addr == (unsigned long)ftrace_regs_caller)
+			return ftrace_modify_code(ip + 4, INSN_LI_0);
+
+		if (addr == (unsigned long)ftrace_caller)
+			return ftrace_modify_code(ip + 4, INSN_LI_1);
+
+	}
+
+	/* we do not support direct call or trampoline now */
+
+	return -1;
+
+}
+
+/*
+ * replace all three nop at the entry with
+ *
+ * lui	at, %hi(ftrace_regs_all)
+ * nop
+ * li	t0, 1
+ */
+
+int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec)
+{
+	unsigned long ip = rec->ip;
+
+	ftrace_modify_code(ip, insn_lui);
+
+	ftrace_modify_code(ip + 8, INSN_LI_1);
+	return 0;
+}
+
+
+
+/*
+ * disable tracing by replacing
+ *
+ *  jalr at, at
+ *
+ * with
+ *
+ *  nop
+ *
+ */
+
+int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,
+			unsigned long addr)
+
+{
+	unsigned int new = INSN_NOP;
+	unsigned long ip = rec->ip + 4;
+
+	return ftrace_modify_code(ip, new);
+}
+
+int __init ftrace_dyn_arch_init(void)
+{
+	u32 *buf;
+	int reg;
+
+	reg = 1;
+	/* lui at, %hi(ftrace_regs_all) */
+	buf = (u32*)&insn_lui;
+	uasm_i_lui(&buf, reg, uasm_rel_hi((long)ftrace_regs_caller));
+
+	return 0;
+}
+
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+unsigned long prepare_ftrace_return(unsigned long parent, unsigned long self_ra,
+			   unsigned long fp)
+{
+	unsigned long return_hooker = (unsigned long)&return_to_handler;
+
+	if (unlikely(ftrace_graph_is_dead()))
+		goto out;
+
+	if (unlikely(atomic_read(&current->tracing_graph_pause)))
+		goto out;
+
+	self_ra -=  8;
+	if (!function_graph_enter(parent, self_ra, fp, NULL))
+		parent = return_hooker;
+out:
+	return parent;
+}
+
+/*
+ * Turn on/off the call to ftrace_graph_caller() in ftrace_caller()
+ * depending on @enable.
+ */
+static int ftrace_modify_graph_caller(bool enable)
+{
+	unsigned long pc = (unsigned long)ftrace_graph_call;
+	unsigned new;
+
+	if (enable)
+		new = INSN_JAL((unsigned long)ftrace_graph_caller);
+	else
+		new = INSN_NOP;
+
+	return ftrace_modify_code(pc, new);
+}
+
+int ftrace_enable_ftrace_graph_caller(void)
+{
+	return ftrace_modify_graph_caller(true);
+}
+
+int ftrace_disable_ftrace_graph_caller(void)
+{
+	return ftrace_modify_graph_caller(false);
+}
+
+#endif /* CONFIG_FUNCTION_GRAPH_TRACER */