> On Aug 15, 2017, at 11:50 AM, Anatoly Pugachev <matorola@xxxxxxxxx> wrote: > > Hello. > > Together with Dmitry (ldv) , we've discovered that running test suite > from strace produces kernel OOPS, when kernel is compiled with gcc 7.1 > or with gcc 7.2 , but not with gcc 6 : > > $ git clone https://github.com/strace/strace.git > ttip:~/strace$ ./bootstrap > ttip:~/strace$ ./configure && make -j > ttip:~/strace$ cd tests-m32 && make mq > ttip:~/strace/tests-m32$ ./mq > Killed > > kernel log: > > [ 61.839563] Unable to handle kernel NULL pointer dereference > [ 61.839649] tsk->{mm,active_mm}->context = 000000000000040e > [ 61.839686] tsk->{mm,active_mm}->pgd = fff8004099e06000 > [ 61.839721] \|/ ____ \|/ > [ 61.839721] "@'/ .. \`@" > [ 61.839721] /_| \__/ |_\ > [ 61.839721] \__U_/ > [ 61.839879] mq(937): Oops [#1] > [ 61.839909] CPU: 10 PID: 937 Comm: mq Not tainted > 4.13.0-rc5-00009-gfcd07350007b #412 > [ 61.839958] task: fff80040968ed940 task.stack: fff800409c26c000 > [ 61.839997] TSTATE: 0000004411001600 TPC: 000000000069fb2c TNPC: > 000000000069fb30 Y: 000002f7 Not tainted > [ 61.840062] TPC: <current_umask+0xc/0x20> > [ 61.840091] g0: fff8004096588400 g1: 00000000000143c0 g2: > 000000000000000a g3: 0000000000000000 > [ 61.840143] g4: 0000000000000000 g5: 0000000000000000 g6: > fff800409c26c000 g7: 000000000000000a > [ 61.840196] o0: 0000000000000000 o1: 0000000000014000 o2: > 0000000000000000 o3: 000000000000000a > [ 61.840247] o4: 0000000000000001 o5: 0000000000000000 sp: > fff800409c26f3e1 ret_pc: 00000000007072d0 > [ 61.840308] RPC: <mq_attr_ok.isra.1+0x90/0x100> > [ 61.840341] l0: 00000000000000da l1: 00000000f7c87bf0 l2: > 00000000f7c34000 l3: 0000000000000000 > [ 61.840395] l4: 00000000f7c86100 l5: 0000000000000000 l6: > 000000017c96f087 l7: 00000000f7c86000 > [ 61.840450] i0: 0000000000000000 i1: 0000000000c4e924 i2: > fff800409c26fd58 i3: fff800409c26fd60 > [ 61.840504] i4: 0000000000014000 i5: 0000000000000014 i6: > fff800409c26f491 i7: 00000000007074fc > [ 61.840560] I7: <do_mq_open+0x1bc/0x320> > [ 61.840590] Call Trace: > [ 61.840614] [00000000007074fc] do_mq_open+0x1bc/0x320 > [ 61.840652] [000000000070839c] compat_SyS_mq_open+0x5c/0xa0 > [ 61.840694] [00000000004061d4] linux_sparc_syscall32+0x34/0x60 > [ 61.840734] Disabling lock debugging due to kernel taint > [ 61.840756] Caller[00000000007074fc]: do_mq_open+0x1bc/0x320 > [ 61.840778] Caller[000000000070839c]: compat_SyS_mq_open+0x5c/0xa0 > [ 61.840800] Caller[00000000004061d4]: linux_sparc_syscall32+0x34/0x60 > [ 61.840824] Caller[00000000f7c3c7fc]: 0xf7c3c7fc > [ 61.840842] Instruction DUMP: > [ 61.840846] 9de3bf50 > [ 61.840860] 01000000 > [ 61.840872] 01000000 > [ 61.840885] <c2592720> > [ 61.840897] 81cfe008 > [ 61.840910] d0406068 > [ 61.840922] 01000000 > [ 61.840935] 01000000 > [ 61.840947] 9de3bf30 > [ 61.840960] The panic happens in current_umask() on this instruction which fetches current->fs: ldx [%g4 + 0x720], %g1 %g4 is expected to be the current task pointer, but from the log messages above, %g4 and %g5 are 0. %g4 and %g5 are set to the current task pointer and the current CPU base pointer respectively in etrap and expected to be preserved while executing in the kernel. I compiled a kernel with gcc 7 and found that the compiler inserted a call to __multi3() in mq_attr_ok(). The sparc64 implementation of __multi3() was added by 1b4af13ff2cc specifically for gcc 7 and later, but it clobbers %g4 and %g5. Not sure if that was intended but it looks like __multi3() is not safe to call from kernel code. Anthony > > And if kernel is compiled with gcc 6 , test ends in other way: > > ttip:~$ cd strace/tests-m32/ && ./mq > mq_open("strace-mq-910.sample", O_RDONLY|O_CREAT, 0700, NULL) = 0 > mq_getsetattr(0, NULL, {mq_flags=0, mq_maxmsg=10, mq_msgsize=8192, > mq_curmsgs=0}) = 0 > mq_getsetattr(0, {mq_flags=0, mq_maxmsg=10, mq_msgsize=8192, > mq_curmsgs=0}, NULL) = 0 > mq_unlink("strace-mq-910.sample") = 0 > +++ exited with 0 +++ > > and nothing is printed in kernel logs. > > versions of used gcc and kernels: > > gcc 6 compiled kernel is git 4.13.0-rc5 > gcc 7.2 compiled kernel is git 4.13.0-rc5-00009-gfcd07350007b > > $ gcc-6 -v > Using built-in specs. > COLLECT_GCC=gcc-6 > COLLECT_LTO_WRAPPER=/usr/lib/gcc/sparc64-linux-gnu/6/lto-wrapper > Target: sparc64-linux-gnu > Configured with: ../src/configure -v --with-pkgversion='Debian > 6.4.0-3' --with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs > --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ > --prefix=/usr --program-suffix=-6 --program-prefix=sparc64-linux-gnu- > --enable-shared --enable-linker-build-id --libexecdir=/usr/lib > --without-included-gettext --enable-threads=posix --libdir=/usr/lib > --enable-nls --with-sysroot=/ --enable-clocale=gnu > --enable-libstdcxx-debug --enable-libstdcxx-time=yes > --with-default-libstdcxx-abi=new --enable-gnu-unique-object > --disable-libquadmath --enable-plugin --enable-default-pie > --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk > --enable-gtk-cairo > --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-sparc64/jre > --enable-java-home > --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-sparc64 > --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-sparc64 > --with-arch-directory=sparc64 > --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc=auto > --enable-multiarch --enable-targets=all --with-cpu-32=ultrasparc > --with-long-double-128 --enable-multilib --enable-checking=release > --build=sparc64-linux-gnu --host=sparc64-linux-gnu > --target=sparc64-linux-gnu > Thread model: posix > gcc version 6.4.0 20170805 (Debian 6.4.0-3) > > $ gcc-7 -v > Using built-in specs. > COLLECT_GCC=gcc-7 > COLLECT_LTO_WRAPPER=/usr/lib/gcc/sparc64-linux-gnu/7/lto-wrapper > Target: sparc64-linux-gnu > Configured with: ../src/configure -v --with-pkgversion='Debian > 7.1.0-13' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs > --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr > --with-gcc-major-version-only --program-suffix=-7 > --program-prefix=sparc64-linux-gnu- --enable-shared > --enable-linker-build-id --libexecdir=/usr/lib > --without-included-gettext --enable-threads=posix --libdir=/usr/lib > --enable-nls --with-sysroot=/ --enable-clocale=gnu > --enable-libstdcxx-debug --enable-libstdcxx-time=yes > --with-default-libstdcxx-abi=new --enable-gnu-unique-object > --disable-libquadmath --enable-plugin --enable-default-pie > --with-system-zlib --enable-objc-gc=auto --enable-multiarch > --disable-werror --with-cpu-32=ultrasparc --enable-targets=all > --with-long-double-128 --enable-multilib --enable-checking=release > --build=sparc64-linux-gnu --host=sparc64-linux-gnu > --target=sparc64-linux-gnu > Thread model: posix > gcc version 7.1.0 (Debian 7.1.0-13) > > $ gcc -v > Using built-in specs. > COLLECT_GCC=gcc > COLLECT_LTO_WRAPPER=/opt/gcc72/libexec/gcc/sparc64-unknown-linux-gnu/7.2.0/lto-wrapper > Target: sparc64-unknown-linux-gnu > Configured with: ../gcc-7.2.0/configure --prefix=/opt/gcc72 > Thread model: posix > gcc version 7.2.0 (GCC) > > Machine is LDOM debian sid sparc64. > -- > To unsubscribe from this list: send the line "unsubscribe sparclinux" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html