Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1323325 > unrolled thread

[PATCH -mm] ubsan, x86: disable alignemnt checks for arch/x86/*

Started byAndrey Ryabinin <aryabinin@virtuozzo.com>
First post2016-02-01 18:10 +0100
Last post2016-02-01 22:10 +0100
Articles 3 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH -mm] ubsan, x86: disable alignemnt checks for arch/x86/* Andrey Ryabinin <aryabinin@virtuozzo.com> - 2016-02-01 18:10 +0100
    Re: [PATCH -mm] ubsan, x86: disable alignemnt checks for arch/x86/* kbuild test robot <lkp@intel.com> - 2016-02-01 19:30 +0100
    Re: [PATCH -mm] ubsan, x86: disable alignemnt checks for arch/x86/* Mike Krinkin <krinkin.m.u@gmail.com> - 2016-02-01 22:10 +0100

#1323325 — [PATCH -mm] ubsan, x86: disable alignemnt checks for arch/x86/*

FromAndrey Ryabinin <aryabinin@virtuozzo.com>
Date2016-02-01 18:10 +0100
Subject[PATCH -mm] ubsan, x86: disable alignemnt checks for arch/x86/*
Message-ID<qXq9b-62X-3@gated-at.bofh.it>
On 01/30/2016 03:36 AM, Mike Krinkin wrote:
> option CONFIG_UBSAN_ALIGNMENT breaks x86-64 kernel with lockdep enabled,
> i. e kernel with CONFIG_UBSAN_ALIGNMENT fails to load without even any
> error message.
>
> The problem is that ubsan callbacks use spinlocks and might be called
> before lockdep is initialized.

There is also report from kernel test robot:
[    0.000000] WARNING: lockdep init error: lock 'report_lock' was acquired before lockdep_init().
[    0.000000] Call stack leading to lockdep invocation was:
[    0.000000]  [<b9e30ec5>] save_stack_trace+0x26/0x16d
[    0.000000]  [<b9f98054>] __lock_acquire+0x237/0x15a4
[    0.000000]  [<b9f994db>] lock_acquire+0x11a/0x1a9
[    0.000000]  [<bae228f9>] _raw_spin_lock_irqsave+0x39/0x49
[    0.000000]  [<ba5df852>] ubsan_prologue+0x1e/0x51
[    0.000000]  [<ba5dfb02>] __ubsan_handle_type_mismatch+0xbd/0x14a
[    0.000000]  [<bbca63c3>] reserve_ebda_region+0x8b/0x1bb
[    0.000000]  [<bbca632c>] i386_start_kernel+0xf6/0x102
[    0.000000]  [<ffffffff>] 0xffffffff

Let's disable aligment checks for x86-specific code since those are not
useful.
Changes around CFLAGS_UBSAN in this patch needed to be sure that cflags
from 'subdir-ccflags-' appears only after CFLAGS_UBSAN.

Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Reported-by: kernel test robot <ying.huang@linux.intel.com>
Reported-by: Mike Krinkin <krinkin.m.u@gmail.com>
---
 Makefile               | 2 +-
 arch/x86/Kbuild        | 2 ++
 scripts/Makefile.lib   | 4 ++--
 scripts/Makefile.ubsan | 5 +++++
 4 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile
index 6c1a3c2..1da29a0 100644
--- a/Makefile
+++ b/Makefile
@@ -411,7 +411,7 @@ export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
 export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
 
 export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
-export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KASAN CFLAGS_UBSAN
+export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KASAN
 export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
 export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
 export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild
index 1538562..f1348ce 100644
--- a/arch/x86/Kbuild
+++ b/arch/x86/Kbuild
@@ -21,3 +21,5 @@ obj-y += platform/
 obj-y += net/
 
 obj-$(CONFIG_KEXEC_FILE) += purgatory/
+
+subdir-ccflags-$(CONFIG_UBSAN_ALIGNMENT) := $(call cc-option, -fno-sanitize=alignment)
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 2edbcad..d7342cf 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -132,8 +132,8 @@ endif
 
 ifeq ($(CONFIG_UBSAN),y)
 _c_flags += $(if $(patsubst n%,, \
-		$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)$(CONFIG_UBSAN_SANITIZE_ALL)), \
-		$(CFLAGS_UBSAN))
+		$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)$(CONFIG_UBSAN_SANITIZE_ALL)),, \
+		$(DISABLE_UBSAN))
 endif
 
 # If building the kernel in a separate objtree expand all occurrences
diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
index 77ce538..91c1dd3 100644
--- a/scripts/Makefile.ubsan
+++ b/scripts/Makefile.ubsan
@@ -18,4 +18,9 @@ endif
       # -fsanitize=* options makes GCC less smart than usual and
       # increase number of 'maybe-uninitialized false-positives
       CFLAGS_UBSAN += $(call cc-option, -Wno-maybe-uninitialized)
+
+      KBUILD_CFLAGS += $(CFLAGS_UBSAN)
+      export DISABLE_UBSAN
+      DISABLE_UBSAN := $(call cc-option, -fno-sanitize=undefined)
+      DISABLE_UBSAN += $(call cc-option, -Wmaybe-uninitialized)
 endif
-- 
2.4.10

[toc] | [next] | [standalone]


#1323399

Fromkbuild test robot <lkp@intel.com>
Date2016-02-01 19:30 +0100
Message-ID<qXroC-6S9-19@gated-at.bofh.it>
In reply to#1323325

[Multipart message — attachments visible in raw view] — view raw

Hi Andrey,

[auto build test WARNING on next-20160201]
[cannot apply to kbuild/for-next kbuild/rc-fixes v4.5-rc2 v4.5-rc1 v4.4-rc8 v4.5-rc2]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Andrey-Ryabinin/ubsan-x86-disable-alignemnt-checks-for-arch-x86/20160202-010948
config: i386-randconfig-c0-02020138 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

Note: it may well be a FALSE warning. FWIW you are at least aware of it now.
http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings

All warnings (new ones prefixed by >>):

   drivers/char/tpm/tpm2-cmd.c: In function 'tpm2_unseal_trusted':
>> drivers/char/tpm/tpm2-cmd.c:600:3: warning: 'blob_handle' may be used uninitialized in this function [-Wmaybe-uninitialized]
      dev_warn(chip->pdev, "0x%08x was not flushed, out of memory\n",
      ^
   drivers/char/tpm/tpm2-cmd.c:668:6: note: 'blob_handle' was declared here
     u32 blob_handle;
         ^
--
   drivers/gpio/gpiolib-of.c: In function 'of_gpiochip_add':
>> drivers/gpio/gpiolib-of.c:221:7: warning: 'dflags' may be used uninitialized in this function [-Wmaybe-uninitialized]
      if (gpiod_hog(desc, name, lflags, dflags))
          ^
   drivers/gpio/gpiolib-of.c:211:19: note: 'dflags' was declared here
     enum gpiod_flags dflags;
                      ^
>> drivers/gpio/gpiolib-of.c:221:7: warning: 'lflags' may be used uninitialized in this function [-Wmaybe-uninitialized]
      if (gpiod_hog(desc, name, lflags, dflags))
          ^
   drivers/gpio/gpiolib-of.c:210:25: note: 'lflags' was declared here
     enum gpio_lookup_flags lflags;
                            ^
--
   drivers/media/dvb-frontends/drx39xyj/drxj.c: In function 'drx39xxj_read_status':
>> drivers/media/dvb-frontends/drx39xyj/drxj.c:10737:33: warning: 'mer' may be used uninitialized in this function [-Wmaybe-uninitialized]
        p->cnr.stat[0].svalue = mer * 100;
                                    ^
   drivers/media/dvb-frontends/drx39xyj/drxj.c:10670:6: note: 'mer' was declared here
     u16 mer, strength = 0;
         ^
>> drivers/media/dvb-frontends/drx39xyj/drxj.c:10728:38: warning: 'ber' may be used uninitialized in this function [-Wmaybe-uninitialized]
        p->post_bit_error.stat[0].uvalue += ber;
                                         ^
   drivers/media/dvb-frontends/drx39xyj/drxj.c:10669:6: note: 'ber' was declared here
     u32 ber, cnt, err, pkt;
         ^
>> drivers/media/dvb-frontends/drx39xyj/drxj.c:10705:35: warning: 'err' may be used uninitialized in this function [-Wmaybe-uninitialized]
        p->block_error.stat[0].uvalue += err;
                                      ^
   drivers/media/dvb-frontends/drx39xyj/drxj.c:10669:16: note: 'err' was declared here
     u32 ber, cnt, err, pkt;
                   ^
--
   drivers/media/tuners/tda18218.c: In function 'tda18218_attach':
>> drivers/media/tuners/tda18218.c:324:10: warning: 'val' may be used uninitialized in this function [-Wmaybe-uninitialized]
     if (ret || val != def_regs[R00_ID]) {
             ^
--
   In file included from drivers/spi/spidev.c:28:0:
   drivers/spi/spidev.c: In function 'spidev_ioctl':
>> include/linux/slab.h:562:9: warning: 'n_ioc' may be used uninitialized in this function [-Wmaybe-uninitialized]
     return __kmalloc(n * size, flags);
            ^
   drivers/spi/spidev.c:362:12: note: 'n_ioc' was declared here
     unsigned  n_ioc;
               ^
--
   fs/btrfs/send.c: In function '__iterate_backrefs':
>> fs/btrfs/send.c:1228:5: warning: 'i_size' may be used uninitialized in this function [-Wmaybe-uninitialized]
     if (offset + bctx->data_offset + bctx->extent_len > i_size)
        ^
--
   ipc/shm.c: In function 'SyS_shmdt':
>> ipc/shm.c:1311:59: warning: 'file' may be used uninitialized in this function [-Wmaybe-uninitialized]
          ((vma->vm_start - addr)/PAGE_SIZE == vma->vm_pgoff) &&
                                                              ^
   ipc/shm.c:1234:15: note: 'file' was declared here
     struct file *file;
                  ^
--
   mm/vmscan.c: In function 'shrink_zone':
>> mm/vmscan.c:2410:18: warning: 'lru_pages' may be used uninitialized in this function [-Wmaybe-uninitialized]
       unsigned long lru_pages;
                     ^
--
   net/core/dev.c: In function 'validate_xmit_skb_list':
>> net/core/dev.c:2984:15: warning: 'tail' may be used uninitialized in this function [-Wmaybe-uninitialized]
       tail->next = skb;
                  ^

vim +/blob_handle +600 drivers/char/tpm/tpm2-cmd.c

954650ef Jarkko Sakkinen 2015-05-30  584  out:
954650ef Jarkko Sakkinen 2015-05-30  585  	tpm_buf_destroy(&buf);
954650ef Jarkko Sakkinen 2015-05-30  586  
954650ef Jarkko Sakkinen 2015-05-30  587  	if (rc > 0)
954650ef Jarkko Sakkinen 2015-05-30  588  		rc = -EPERM;
954650ef Jarkko Sakkinen 2015-05-30  589  
954650ef Jarkko Sakkinen 2015-05-30  590  	return rc;
954650ef Jarkko Sakkinen 2015-05-30  591  }
954650ef Jarkko Sakkinen 2015-05-30  592  
954650ef Jarkko Sakkinen 2015-05-30  593  static void tpm2_flush_context(struct tpm_chip *chip, u32 handle)
954650ef Jarkko Sakkinen 2015-05-30  594  {
954650ef Jarkko Sakkinen 2015-05-30  595  	struct tpm_buf buf;
954650ef Jarkko Sakkinen 2015-05-30  596  	int rc;
954650ef Jarkko Sakkinen 2015-05-30  597  
954650ef Jarkko Sakkinen 2015-05-30  598  	rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_FLUSH_CONTEXT);
954650ef Jarkko Sakkinen 2015-05-30  599  	if (rc) {
954650ef Jarkko Sakkinen 2015-05-30 @600  		dev_warn(chip->pdev, "0x%08x was not flushed, out of memory\n",
954650ef Jarkko Sakkinen 2015-05-30  601  			 handle);
954650ef Jarkko Sakkinen 2015-05-30  602  		return;
954650ef Jarkko Sakkinen 2015-05-30  603  	}
954650ef Jarkko Sakkinen 2015-05-30  604  
954650ef Jarkko Sakkinen 2015-05-30  605  	tpm_buf_append_u32(&buf, handle);
954650ef Jarkko Sakkinen 2015-05-30  606  
954650ef Jarkko Sakkinen 2015-05-30  607  	rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, "flushing context");
954650ef Jarkko Sakkinen 2015-05-30  608  	if (rc)

:::::: The code at line 600 was first introduced by commit
:::::: 954650efb79f99d5c817c121bb0a7c6c53362048 tpm: seal/unseal for TPM 2.0

:::::: TO: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
:::::: CC: Peter Huewe <peterhuewe@gmx.de>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[toc] | [prev] | [next] | [standalone]


#1323506

FromMike Krinkin <krinkin.m.u@gmail.com>
Date2016-02-01 22:10 +0100
Message-ID<qXtTr-iU-3@gated-at.bofh.it>
In reply to#1323325
Works well for me, thank you.

Tested-by: Mike Krinkin <krinkin.m.u@gmail.com>

On Mon, Feb 01, 2016 at 08:08:19PM +0300, Andrey Ryabinin wrote:
> On 01/30/2016 03:36 AM, Mike Krinkin wrote:
> > option CONFIG_UBSAN_ALIGNMENT breaks x86-64 kernel with lockdep enabled,
> > i. e kernel with CONFIG_UBSAN_ALIGNMENT fails to load without even any
> > error message.
> >
> > The problem is that ubsan callbacks use spinlocks and might be called
> > before lockdep is initialized.
> 
> There is also report from kernel test robot:
> [    0.000000] WARNING: lockdep init error: lock 'report_lock' was acquired before lockdep_init().
> [    0.000000] Call stack leading to lockdep invocation was:
> [    0.000000]  [<b9e30ec5>] save_stack_trace+0x26/0x16d
> [    0.000000]  [<b9f98054>] __lock_acquire+0x237/0x15a4
> [    0.000000]  [<b9f994db>] lock_acquire+0x11a/0x1a9
> [    0.000000]  [<bae228f9>] _raw_spin_lock_irqsave+0x39/0x49
> [    0.000000]  [<ba5df852>] ubsan_prologue+0x1e/0x51
> [    0.000000]  [<ba5dfb02>] __ubsan_handle_type_mismatch+0xbd/0x14a
> [    0.000000]  [<bbca63c3>] reserve_ebda_region+0x8b/0x1bb
> [    0.000000]  [<bbca632c>] i386_start_kernel+0xf6/0x102
> [    0.000000]  [<ffffffff>] 0xffffffff
> 
> Let's disable aligment checks for x86-specific code since those are not
> useful.
> Changes around CFLAGS_UBSAN in this patch needed to be sure that cflags
> from 'subdir-ccflags-' appears only after CFLAGS_UBSAN.
> 
> Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
> Reported-by: kernel test robot <ying.huang@linux.intel.com>
> Reported-by: Mike Krinkin <krinkin.m.u@gmail.com>
> ---
>  Makefile               | 2 +-
>  arch/x86/Kbuild        | 2 ++
>  scripts/Makefile.lib   | 4 ++--
>  scripts/Makefile.ubsan | 5 +++++
>  4 files changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 6c1a3c2..1da29a0 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -411,7 +411,7 @@ export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
>  export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
>  
>  export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
> -export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KASAN CFLAGS_UBSAN
> +export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KASAN
>  export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
>  export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
>  export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
> diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild
> index 1538562..f1348ce 100644
> --- a/arch/x86/Kbuild
> +++ b/arch/x86/Kbuild
> @@ -21,3 +21,5 @@ obj-y += platform/
>  obj-y += net/
>  
>  obj-$(CONFIG_KEXEC_FILE) += purgatory/
> +
> +subdir-ccflags-$(CONFIG_UBSAN_ALIGNMENT) := $(call cc-option, -fno-sanitize=alignment)
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index 2edbcad..d7342cf 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -132,8 +132,8 @@ endif
>  
>  ifeq ($(CONFIG_UBSAN),y)
>  _c_flags += $(if $(patsubst n%,, \
> -		$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)$(CONFIG_UBSAN_SANITIZE_ALL)), \
> -		$(CFLAGS_UBSAN))
> +		$(UBSAN_SANITIZE_$(basetarget).o)$(UBSAN_SANITIZE)$(CONFIG_UBSAN_SANITIZE_ALL)),, \
> +		$(DISABLE_UBSAN))
>  endif
>  
>  # If building the kernel in a separate objtree expand all occurrences
> diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
> index 77ce538..91c1dd3 100644
> --- a/scripts/Makefile.ubsan
> +++ b/scripts/Makefile.ubsan
> @@ -18,4 +18,9 @@ endif
>        # -fsanitize=* options makes GCC less smart than usual and
>        # increase number of 'maybe-uninitialized false-positives
>        CFLAGS_UBSAN += $(call cc-option, -Wno-maybe-uninitialized)
> +
> +      KBUILD_CFLAGS += $(CFLAGS_UBSAN)
> +      export DISABLE_UBSAN
> +      DISABLE_UBSAN := $(call cc-option, -fno-sanitize=undefined)
> +      DISABLE_UBSAN += $(call cc-option, -Wmaybe-uninitialized)
>  endif
> -- 
> 2.4.10
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web