# git rev-parse -q --verify 4ea6e7299deb821cd410d8efb8ad86de9f867251^{commit} 4ea6e7299deb821cd410d8efb8ad86de9f867251 already have revision, skipping fetch # git checkout -q -f -B kisskb 4ea6e7299deb821cd410d8efb8ad86de9f867251 # git clean -qxdf # < git log -1 # commit 4ea6e7299deb821cd410d8efb8ad86de9f867251 # Author: Ravi Bangoria # Date: Thu Jun 13 09:00:14 2019 +0530 # # powerpc/watchpoint: Restore NV GPRs while returning from exception # # powerpc hardware triggers watchpoint before executing the instruction. # To make trigger-after-execute behavior, kernel emulates the # instruction. If the instruction is 'load something into non-volatile # register', exception handler should restore emulated register state # while returning back, otherwise there will be register state # corruption. eg, adding a watchpoint on a list can corrput the list: # # # cat /proc/kallsyms | grep kthread_create_list # c00000000121c8b8 d kthread_create_list # # Add watchpoint on kthread_create_list->prev: # # # perf record -e mem:0xc00000000121c8c0 # # Run some workload such that new kthread gets invoked. eg, I just # logged out from console: # # list_add corruption. next->prev should be prev (c000000001214e00), \ # but was c00000000121c8b8. (next=c00000000121c8b8). # WARNING: CPU: 59 PID: 309 at lib/list_debug.c:25 __list_add_valid+0xb4/0xc0 # CPU: 59 PID: 309 Comm: kworker/59:0 Kdump: loaded Not tainted 5.1.0-rc7+ #69 # ... # NIP __list_add_valid+0xb4/0xc0 # LR __list_add_valid+0xb0/0xc0 # Call Trace: # __list_add_valid+0xb0/0xc0 (unreliable) # __kthread_create_on_node+0xe0/0x260 # kthread_create_on_node+0x34/0x50 # create_worker+0xe8/0x260 # worker_thread+0x444/0x560 # kthread+0x160/0x1a0 # ret_from_kernel_thread+0x5c/0x70 # # List corruption happened because it uses 'load into non-volatile # register' instruction: # # Snippet from __kthread_create_on_node: # # c000000000136be8: addis r29,r2,-19 # c000000000136bec: ld r29,31424(r29) # if (!__list_add_valid(new, prev, next)) # c000000000136bf0: mr r3,r30 # c000000000136bf4: mr r5,r28 # c000000000136bf8: mr r4,r29 # c000000000136bfc: bl c00000000059a2f8 <__list_add_valid+0x8> # # Register state from WARN_ON(): # # GPR00: c00000000059a3a0 c000007ff23afb50 c000000001344e00 0000000000000075 # GPR04: 0000000000000000 0000000000000000 0000001852af8bc1 0000000000000000 # GPR08: 0000000000000001 0000000000000007 0000000000000006 00000000000004aa # GPR12: 0000000000000000 c000007ffffeb080 c000000000137038 c000005ff62aaa00 # GPR16: 0000000000000000 0000000000000000 c000007fffbe7600 c000007fffbe7370 # GPR20: c000007fffbe7320 c000007fffbe7300 c000000001373a00 0000000000000000 # GPR24: fffffffffffffef7 c00000000012e320 c000007ff23afcb0 c000000000cb8628 # GPR28: c00000000121c8b8 c000000001214e00 c000007fef5b17e8 c000007fef5b17c0 # # Watchpoint hit at 0xc000000000136bec. # # addis r29,r2,-19 # => r29 = 0xc000000001344e00 + (-19 << 16) # => r29 = 0xc000000001214e00 # # ld r29,31424(r29) # => r29 = *(0xc000000001214e00 + 31424) # => r29 = *(0xc00000000121c8c0) # # 0xc00000000121c8c0 is where we placed a watchpoint and thus this # instruction was emulated by emulate_step. But because handle_dabr_fault # did not restore emulated register state, r29 still contains stale # value in above register state. # # Fixes: 5aae8a5370802 ("powerpc, hw_breakpoints: Implement hw_breakpoints for 64-bit server processors") # Signed-off-by: Ravi Bangoria # Cc: stable@vger.kernel.org # 2.6.36+ # Signed-off-by: Michael Ellerman # < /opt/cross/kisskb/gcc-4.6.3-nolibc/sh4-linux/bin/sh4-linux-gcc --version # < /opt/cross/kisskb/gcc-4.6.3-nolibc/sh4-linux/bin/sh4-linux-ld --version # < git log --format=%s --max-count=1 4ea6e7299deb821cd410d8efb8ad86de9f867251 # < make -s -j 120 ARCH=sh O=/kisskb/build/powerpc-next_sh-defconfig_sh4 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/sh4-linux/bin/sh4-linux- defconfig # make -s -j 120 ARCH=sh O=/kisskb/build/powerpc-next_sh-defconfig_sh4 CROSS_COMPILE=/opt/cross/kisskb/gcc-4.6.3-nolibc/sh4-linux/bin/sh4-linux- Generating include/generated/machtypes.h /kisskb/src/arch/sh/kernel/cpu/sh4/../sh3/../../entry-common.S: Assembler messages: /kisskb/src/arch/sh/kernel/cpu/sh4/../sh3/../../entry-common.S:385: Warning: overflow in branch to syscall_exit_work; converted into longer instruction sequence /kisskb/src/arch/sh/kernel/cpu/sh4/../sh3/../../entry-common.S:388: Warning: overflow in branch to syscall_exit_work; converted into longer instruction sequence /kisskb/src/kernel/rcu/srcutree.c: In function 'init_srcu_struct_fields': /kisskb/src/kernel/rcu/srcutree.c:140:32: warning: 'levelspread[]' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/kernel/rcu/srcutree.c:88:6: note: 'levelspread[]' was declared here /kisskb/src/kernel/printk/printk.c: In function 'devkmsg_sysctl_set_loglvl': /kisskb/src/kernel/printk/printk.c:194:16: warning: 'old' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/drivers/base/regmap/regmap.c: In function 'regmap_raw_read': /kisskb/src/drivers/base/regmap/regmap.c:2589:6: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/proc/inode.c: In function 'proc_reg_open': /kisskb/src/include/linux/list.h:65:12: warning: 'pdeo' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/proc/inode.c:331:21: note: 'pdeo' was declared here /kisskb/src/drivers/base/regmap/regmap.c: In function '_regmap_raw_write': /kisskb/src/drivers/base/regmap/regmap.c:1850:6: warning: 'ret' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/fs/ext4/readpage.c: In function 'ext4_mpage_readpages': /kisskb/src/fs/ext4/readpage.c:295:1: warning: the frame size of 1200 bytes is larger than 1024 bytes [-Wframe-larger-than=] /kisskb/src/drivers/sh/clk/cpg.c: In function 'r8': /kisskb/src/drivers/sh/clk/cpg.c:41:2: warning: passing argument 1 of 'ioread8' discards 'const' qualifier from pointer target type [enabled by default] /kisskb/src/include/asm-generic/iomap.h:29:21: note: expected 'void *' but argument is of type 'const void *' /kisskb/src/drivers/sh/clk/cpg.c: In function 'r16': /kisskb/src/drivers/sh/clk/cpg.c:46:2: warning: passing argument 1 of 'ioread16' discards 'const' qualifier from pointer target type [enabled by default] /kisskb/src/include/asm-generic/iomap.h:30:21: note: expected 'void *' but argument is of type 'const void *' /kisskb/src/drivers/sh/clk/cpg.c: In function 'r32': /kisskb/src/drivers/sh/clk/cpg.c:51:2: warning: passing argument 1 of 'ioread32' discards 'const' qualifier from pointer target type [enabled by default] /kisskb/src/include/asm-generic/iomap.h:32:21: note: expected 'void *' but argument is of type 'const void *' /kisskb/src/mm/vmstat.c: In function 'sysctl_vm_numa_stat_handler': /kisskb/src/mm/vmstat.c:90:5: warning: 'oldval' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/net/ipv6/ip6_output.c: In function '__ip6_append_data.isra.16': /kisskb/src/include/linux/skbuff.h:1406:6: warning: 'extra_uref' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/net/ipv6/ip6_output.c:1278:14: note: 'extra_uref' was declared here /kisskb/src/net/ipv4/ip_output.c: In function '__ip_append_data': /kisskb/src/include/linux/skbuff.h:1406:6: warning: 'extra_uref' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/net/ipv4/ip_output.c:881:14: note: 'extra_uref' was declared here /kisskb/src/fs/mpage.c: In function 'do_mpage_readpage': /kisskb/src/fs/mpage.c:338:1: warning: the frame size of 1108 bytes is larger than 1024 bytes [-Wframe-larger-than=] /kisskb/src/fs/mpage.c: In function '__mpage_writepage': /kisskb/src/fs/mpage.c:690:1: warning: the frame size of 1148 bytes is larger than 1024 bytes [-Wframe-larger-than=] /kisskb/src/mm/hugetlb.c: In function 'alloc_pool_huge_page': /kisskb/src/mm/hugetlb.c:1465:5: warning: 'page' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/net/ipv4/fib_semantics.c: In function 'fib_create_info': /kisskb/src/net/ipv4/fib_semantics.c:1027:12: warning: 'err' may be used uninitialized in this function [-Wuninitialized] /kisskb/src/net/ipv4/fib_semantics.c:971:6: note: 'err' was declared here Kernel: arch/sh/boot/zImage is ready Completed OK # rm -rf /kisskb/build/powerpc-next_sh-defconfig_sh4 # Build took: 0:00:25.731691