All of lore.kernel.org
 help / color / mirror / Atom feed
* arch/x86/kernel/ftrace.c:371:59: sparse: sparse: subtraction of functions? Share your drugs
@ 2020-06-02  4:11 kbuild test robot
  0 siblings, 0 replies; only message in thread
From: kbuild test robot @ 2020-06-02  4:11 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 11958 bytes --]

CC: kbuild-all(a)lists.01.org
CC: linux-kernel(a)vger.kernel.org
TO: "Peter, Zijlstra," <peterz@infradead.org>
CC: Ingo Molnar <mingo@kernel.org>
CC: Miroslav Benes <mbenes@suse.cz>
CC: Alexandre Chartre <alexandre.chartre@oracle.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   f359287765c04711ff54fbd11645271d8e5ff763
commit: 0298739b7983cf9bf4fcfb4bfb815c539bdb87ca x86,ftrace: Fix ftrace_regs_caller() unwind
date:   6 weeks ago
:::::: branch date: 4 hours ago
:::::: commit date: 6 weeks ago
config: x86_64-randconfig-s021-20200602 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-13) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.1-243-gc100a7ab-dirty
        git checkout 0298739b7983cf9bf4fcfb4bfb815c539bdb87ca
        # save the attached .config to linux build tree
        make W=1 C=1 ARCH=x86_64 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

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


sparse warnings: (new ones prefixed by >>)

>> arch/x86/kernel/ftrace.c:371:59: sparse: sparse: subtraction of functions? Share your drugs
   arch/x86/kernel/ftrace.c:40:5: sparse: sparse: context imbalance in 'ftrace_arch_code_modify_prepare' - wrong count at exit
   arch/x86/kernel/ftrace.c:53:5: sparse: sparse: context imbalance in 'ftrace_arch_code_modify_post_process' - wrong count at exit

# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0298739b7983cf9bf4fcfb4bfb815c539bdb87ca
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git remote update linus
git checkout 0298739b7983cf9bf4fcfb4bfb815c539bdb87ca
vim +371 arch/x86/kernel/ftrace.c

d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  311) 
aec0be2d6e9f02 Steven Rostedt (Red Hat  2014-11-18  312) static unsigned long
aec0be2d6e9f02 Steven Rostedt (Red Hat  2014-11-18  313) create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  314) {
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  315) 	unsigned long start_offset;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  316) 	unsigned long end_offset;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  317) 	unsigned long op_offset;
768ae4406a5cab Peter Zijlstra           2019-08-26  318  	unsigned long call_offset;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  319) 	unsigned long offset;
3c0dab44e22782 Nadav Amit               2019-04-25  320  	unsigned long npages;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  321) 	unsigned long size;
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  322) 	unsigned long retq;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  323) 	unsigned long *ptr;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  324) 	void *trampoline;
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  325) 	void *ip;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  326) 	/* 48 8b 15 <offset> is movq <offset>(%rip), %rdx */
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  327) 	unsigned const char op_ref[] = { 0x48, 0x8b, 0x15 };
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  328) 	union ftrace_op_code_union op_ptr;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  329) 	int ret;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  330) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  331) 	if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) {
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  332) 		start_offset = (unsigned long)ftrace_regs_caller;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  333) 		end_offset = (unsigned long)ftrace_regs_caller_end;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  334) 		op_offset = (unsigned long)ftrace_regs_caller_op_ptr;
768ae4406a5cab Peter Zijlstra           2019-08-26  335  		call_offset = (unsigned long)ftrace_regs_call;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  336) 	} else {
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  337) 		start_offset = (unsigned long)ftrace_caller;
0298739b7983cf Peter Zijlstra           2020-04-01  338  		end_offset = (unsigned long)ftrace_caller_end;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  339) 		op_offset = (unsigned long)ftrace_caller_op_ptr;
768ae4406a5cab Peter Zijlstra           2019-08-26  340  		call_offset = (unsigned long)ftrace_call;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  341) 	}
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  342) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  343) 	size = end_offset - start_offset;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  344) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  345) 	/*
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  346) 	 * Allocate enough size to store the ftrace_caller code,
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  347) 	 * the iret , as well as the address of the ftrace_ops this
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  348) 	 * trampoline is used for.
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  349) 	 */
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  350) 	trampoline = alloc_tramp(size + RET_SIZE + sizeof(void *));
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  351) 	if (!trampoline)
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  352) 		return 0;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  353) 
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  354) 	*tramp_size = size + RET_SIZE + sizeof(void *);
3c0dab44e22782 Nadav Amit               2019-04-25  355  	npages = DIV_ROUND_UP(*tramp_size, PAGE_SIZE);
aec0be2d6e9f02 Steven Rostedt (Red Hat  2014-11-18  356) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  357) 	/* Copy ftrace_caller onto the trampoline memory */
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  358) 	ret = probe_kernel_read(trampoline, (void *)start_offset, size);
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  359) 	if (WARN_ON(ret < 0))
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  360) 		goto fail;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  361) 
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  362) 	ip = trampoline + size;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  363) 
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  364) 	/* The trampoline ends with ret(q) */
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  365) 	retq = (unsigned long)ftrace_stub;
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  366) 	ret = probe_kernel_read(ip, (void *)retq, RET_SIZE);
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  367) 	if (WARN_ON(ret < 0))
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  368) 		goto fail;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  369) 
0298739b7983cf Peter Zijlstra           2020-04-01  370  	if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) {
0298739b7983cf Peter Zijlstra           2020-04-01 @371  		ip = trampoline + (ftrace_regs_caller_ret - ftrace_regs_caller);
0298739b7983cf Peter Zijlstra           2020-04-01  372  		ret = probe_kernel_read(ip, (void *)retq, RET_SIZE);
0298739b7983cf Peter Zijlstra           2020-04-01  373  		if (WARN_ON(ret < 0))
0298739b7983cf Peter Zijlstra           2020-04-01  374  			goto fail;
0298739b7983cf Peter Zijlstra           2020-04-01  375  	}
0298739b7983cf Peter Zijlstra           2020-04-01  376  
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  377) 	/*
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  378) 	 * The address of the ftrace_ops that is used for this trampoline
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  379) 	 * is stored at the end of the trampoline. This will be used to
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  380) 	 * load the third parameter for the callback. Basically, that
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  381) 	 * location@the end of the trampoline takes the place of
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  382) 	 * the global function_trace_op variable.
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  383) 	 */
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  384) 
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  385) 	ptr = (unsigned long *)(trampoline + size + RET_SIZE);
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  386) 	*ptr = (unsigned long)ops;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  387) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  388) 	op_offset -= start_offset;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  389) 	memcpy(&op_ptr, trampoline + op_offset, OP_REF_SIZE);
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  390) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  391) 	/* Are we pointing to the reference? */
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  392) 	if (WARN_ON(memcmp(op_ptr.op, op_ref, 3) != 0))
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  393) 		goto fail;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  394) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  395) 	/* Load the contents of ptr into the callback parameter */
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  396) 	offset = (unsigned long)ptr;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  397) 	offset -= (unsigned long)trampoline + op_offset + OP_REF_SIZE;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  398) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  399) 	op_ptr.offset = offset;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  400) 
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  401) 	/* put in the new offset to the ftrace_ops */
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  402) 	memcpy(trampoline + op_offset, &op_ptr, OP_REF_SIZE);
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  403) 
768ae4406a5cab Peter Zijlstra           2019-08-26  404  	/* put in the call to the function */
768ae4406a5cab Peter Zijlstra           2019-08-26  405  	mutex_lock(&text_mutex);
768ae4406a5cab Peter Zijlstra           2019-08-26  406  	call_offset -= start_offset;
768ae4406a5cab Peter Zijlstra           2019-08-26  407  	memcpy(trampoline + call_offset,
768ae4406a5cab Peter Zijlstra           2019-08-26  408  	       text_gen_insn(CALL_INSN_OPCODE,
768ae4406a5cab Peter Zijlstra           2019-08-26  409  			     trampoline + call_offset,
768ae4406a5cab Peter Zijlstra           2019-08-26  410  			     ftrace_ops_get_func(ops)), CALL_INSN_SIZE);
768ae4406a5cab Peter Zijlstra           2019-08-26  411  	mutex_unlock(&text_mutex);
768ae4406a5cab Peter Zijlstra           2019-08-26  412  
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  413) 	/* ALLOC_TRAMP flags lets us know we created it */
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  414) 	ops->flags |= FTRACE_OPS_FL_ALLOC_TRAMP;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  415) 
7fdfe1e40b225b Rick Edgecombe           2019-04-25  416  	set_vm_flush_reset_perms(trampoline);
7fdfe1e40b225b Rick Edgecombe           2019-04-25  417  
768ae4406a5cab Peter Zijlstra           2019-08-26  418  	set_memory_ro((unsigned long)trampoline, npages);
3c0dab44e22782 Nadav Amit               2019-04-25  419  	set_memory_x((unsigned long)trampoline, npages);
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  420) 	return (unsigned long)trampoline;
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  421) fail:
7fdfe1e40b225b Rick Edgecombe           2019-04-25  422  	tramp_free(trampoline);
d2a68c4effd821 Steven Rostedt (VMware   2018-12-08  423) 	return 0;
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  424) }
f3bea49115b21e Steven Rostedt (Red Hat  2014-07-02  425) 

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 35160 bytes --]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-02  4:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-02  4:11 arch/x86/kernel/ftrace.c:371:59: sparse: sparse: subtraction of functions? Share your drugs kbuild test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.