tree:
https://git.kernel.org/pub/scm/linux/kernel/git/mhiramat/linux.git
kprobes/kretprobe-stackfix
head: 6e2b8966c87adc1be0fb4a386fb24ae438f4cb79
commit: 663b1b4caed9e4b0ad1be80b30851e68fb9a40eb [8/10] kprobes: Setup instruction pointer
in __kretprobe_trampoline_handler
config: parisc-randconfig-r006-20210316 (attached as .config)
compiler: hppa-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://git.kernel.org/pub/scm/linux/kernel/git/mhiramat/linux.git/commit...
git remote add mhiramat
https://git.kernel.org/pub/scm/linux/kernel/git/mhiramat/linux.git
git fetch --no-tags mhiramat kprobes/kretprobe-stackfix
git checkout 663b1b4caed9e4b0ad1be80b30851e68fb9a40eb
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=parisc
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All warnings (new ones prefixed by >>):
kernel/kprobes.c:1847:12: warning: no previous prototype for
'kprobe_exceptions_notify' [-Wmissing-prototypes]
1847 | int __weak kprobe_exceptions_notify(struct notifier_block *self,
| ^~~~~~~~~~~~~~~~~~~~~~~~
kernel/kprobes.c: In function '__kretprobe_trampoline_handler':
> kernel/kprobes.c:1901:32: warning: passing argument 2 of
'instruction_pointer_set' makes integer from pointer without a cast
[-Wint-conversion]
1901 | instruction_pointer_set(regs, correct_ret_addr);
| ^~~~~~~~~~~~~~~~
| |
| kprobe_opcode_t * {aka unsigned int *}
In file included from arch/parisc/include/asm/processor.h:18,
from arch/parisc/include/asm/spinlock.h:7,
from arch/parisc/include/asm/atomic.h:22,
from include/linux/atomic.h:7,
from arch/parisc/include/asm/bitops.h:13,
from include/linux/bitops.h:32,
from include/linux/kernel.h:11,
from include/linux/list.h:9,
from include/linux/kprobes.h:21,
from kernel/kprobes.c:21:
arch/parisc/include/asm/ptrace.h:29:21: note: expected 'long unsigned int' but
argument is of type 'kprobe_opcode_t *' {aka 'unsigned int *'}
29 | unsigned long val)
| ~~~~~~~~~~~~~~^~~
vim +/instruction_pointer_set +1901 kernel/kprobes.c
1846
1847 int __weak kprobe_exceptions_notify(struct notifier_block *self,
1848 unsigned long val, void *data)
1849 {
1850 return NOTIFY_DONE;
1851 }
1852 NOKPROBE_SYMBOL(kprobe_exceptions_notify);
1853
1854 static struct notifier_block kprobe_exceptions_nb = {
1855 .notifier_call = kprobe_exceptions_notify,
1856 .priority = 0x7fffffff /* we need to be notified first */
1857 };
1858
1859 #ifdef CONFIG_KRETPROBES
1860
1861 /* This assumes the tsk is current or the task which is not running. */
1862 unsigned long kretprobe_find_ret_addr(struct task_struct *tsk,
1863 struct llist_node **cur)
1864 {
1865 struct kretprobe_instance *ri = NULL;
1866 struct llist_node *node = *cur;
1867
1868 if (!node)
1869 node = tsk->kretprobe_instances.first;
1870 else
1871 node = node->next;
1872
1873 while (node) {
1874 ri = container_of(node, struct kretprobe_instance, llist);
1875 if (ri->ret_addr != kretprobe_trampoline_addr()) {
1876 *cur = node;
1877 return (unsigned long)ri->ret_addr;
1878 }
1879 node = node->next;
1880 }
1881 return 0;
1882 }
1883 NOKPROBE_SYMBOL(kretprobe_find_ret_addr);
1884
1885 unsigned long __kretprobe_trampoline_handler(struct pt_regs *regs,
1886 void *frame_pointer)
1887 {
1888 kprobe_opcode_t *correct_ret_addr = NULL;
1889 struct kretprobe_instance *ri = NULL;
1890 struct llist_node *first, *node = NULL;
1891 struct kretprobe *rp;
1892
1893 /* Find correct address and all nodes for this frame. */
1894 correct_ret_addr = (void *)kretprobe_find_ret_addr(current, &node);
1895 if (!correct_ret_addr) {
1896 pr_err("Oops! Kretprobe fails to find correct return address.\n");
1897 BUG_ON(1);
1898 }
1899
1900 /* Set the instruction pointer to the correct address */
1901 instruction_pointer_set(regs, correct_ret_addr);
1902
1903 /* Run them. */
1904 first = current->kretprobe_instances.first;
1905 while (first) {
1906 ri = container_of(first, struct kretprobe_instance, llist);
1907
1908 BUG_ON(ri->fp != frame_pointer);
1909
1910 rp = get_kretprobe(ri);
1911 if (rp && rp->handler) {
1912 struct kprobe *prev = kprobe_running();
1913
1914 __this_cpu_write(current_kprobe, &rp->kp);
1915 ri->ret_addr = correct_ret_addr;
1916 rp->handler(ri, regs);
1917 __this_cpu_write(current_kprobe, prev);
1918 }
1919 if (first == node)
1920 break;
1921
1922 first = first->next;
1923 }
1924
1925 /* Unlink all nodes for this frame. */
1926 first = current->kretprobe_instances.first;
1927 current->kretprobe_instances.first = node->next;
1928 node->next = NULL;
1929
1930 /* Recycle them. */
1931 while (first) {
1932 ri = container_of(first, struct kretprobe_instance, llist);
1933 first = first->next;
1934
1935 recycle_rp_inst(ri);
1936 }
1937
1938 return (unsigned long)correct_ret_addr;
1939 }
1940 NOKPROBE_SYMBOL(__kretprobe_trampoline_handler)
1941
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org