31 Jan, 2019

1 commit

  • commit f0907827a8a9152aedac2833ed1b674a7b2a44f2 upstream.

    This adds wrappers for the __builtin overflow checkers present in gcc
    5.1+ as well as fallback implementations for earlier compilers. It's not
    that easy to implement the fully generic __builtin_X_overflow(T1 a, T2
    b, T3 *d) in macros, so the fallback code assumes that T1, T2 and T3 are
    the same. We obviously don't want the wrappers to have different
    semantics depending on $GCC_VERSION, so we also insist on that even when
    using the builtins.

    There are a few problems with the 'a+b < a' idiom for checking for
    overflow: For signed types, it relies on undefined behaviour and is
    not actually complete (it doesn't check underflow;
    e.g. INT_MIN+INT_MIN == 0 isn't caught). Due to type promotion it
    is wrong for all types (signed and unsigned) narrower than
    int. Similarly, when a and b does not have the same type, there are
    subtle cases like

    u32 a;

    if (a + sizeof(foo) < a)
    return -EOVERFLOW;
    a += sizeof(foo);

    where the test is always false on 64 bit platforms. Add to that that it
    is not always possible to determine the types involved at a glance.

    The new overflow.h is somewhat bulky, but that's mostly a result of
    trying to be type-generic, complete (e.g. catching not only overflow
    but also signed underflow) and not relying on undefined behaviour.

    Linus is of course right [1] that for unsigned subtraction a-b, the
    right way to check for overflow (underflow) is "b > a" and not
    "__builtin_sub_overflow(a, b, &d)", but that's just one out of six cases
    covered here, and included mostly for completeness.

    So is it worth it? I think it is, if nothing else for the documentation
    value of seeing

    if (check_add_overflow(a, b, &d))
    return -EGOAWAY;
    do_stuff_with(d);

    instead of the open-coded (and possibly wrong and/or incomplete and/or
    UBsan-tickling)

    if (a+b < a)
    return -EGOAWAY;
    do_stuff_with(a+b);

    While gcc does recognize the 'a+b < a' idiom for testing unsigned add
    overflow, it doesn't do nearly as good for unsigned multiplication
    (there's also no single well-established idiom). So using
    check_mul_overflow in kcalloc and friends may also make gcc generate
    slightly better code.

    [1] https://lkml.org/lkml/2015/11/2/658

    Signed-off-by: Rasmus Villemoes
    Signed-off-by: Kees Cook
    Signed-off-by: Greg Kroah-Hartman

    Rasmus Villemoes
     

17 Jan, 2019

1 commit

  • commit e4f358916d528d479c3c12bd2fd03f2d5a576380 upstream.

    Commit

    4cd24de3a098 ("x86/retpoline: Make CONFIG_RETPOLINE depend on compiler support")

    replaced the RETPOLINE define with CONFIG_RETPOLINE checks. Remove the
    remaining pieces.

    [ bp: Massage commit message. ]

    Fixes: 4cd24de3a098 ("x86/retpoline: Make CONFIG_RETPOLINE depend on compiler support")
    Signed-off-by: WANG Chao
    Signed-off-by: Borislav Petkov
    Reviewed-by: Zhenzhong Duan
    Reviewed-by: Masahiro Yamada
    Cc: "H. Peter Anvin"
    Cc: Andi Kleen
    Cc: Andrew Morton
    Cc: Andy Lutomirski
    Cc: Arnd Bergmann
    Cc: Daniel Borkmann
    Cc: David Woodhouse
    Cc: Geert Uytterhoeven
    Cc: Jessica Yu
    Cc: Jiri Kosina
    Cc: Kees Cook
    Cc: Konrad Rzeszutek Wilk
    Cc: Luc Van Oostenryck
    Cc: Michal Marek
    Cc: Miguel Ojeda
    Cc: Peter Zijlstra
    Cc: Tim Chen
    Cc: Vasily Gorbik
    Cc: linux-kbuild@vger.kernel.org
    Cc: srinivas.eeda@oracle.com
    Cc: stable
    Cc: x86-ml
    Link: https://lkml.kernel.org/r/20181210163725.95977-1-chao.wang@ucloud.cn
    Signed-off-by: Greg Kroah-Hartman

    WANG Chao
     

22 Jul, 2018

1 commit

  • commit d03db2bc26f0e4a6849ad649a09c9c73fccdc656 upstream.

    Functions marked extern inline do not emit an externally visible
    function when the gnu89 C standard is used. Some KBUILD Makefiles
    overwrite KBUILD_CFLAGS. This is an issue for GCC 5.1+ users as without
    an explicit C standard specified, the default is gnu11. Since c99, the
    semantics of extern inline have changed such that an externally visible
    function is always emitted. This can lead to multiple definition errors
    of extern inline functions at link time of compilation units whose build
    files have removed an explicit C standard compiler flag for users of GCC
    5.1+ or Clang.

    Suggested-by: Arnd Bergmann
    Suggested-by: H. Peter Anvin
    Suggested-by: Joe Perches
    Signed-off-by: Nick Desaulniers
    Acked-by: Juergen Gross
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: acme@redhat.com
    Cc: akataria@vmware.com
    Cc: akpm@linux-foundation.org
    Cc: andrea.parri@amarulasolutions.com
    Cc: ard.biesheuvel@linaro.org
    Cc: aryabinin@virtuozzo.com
    Cc: astrachan@google.com
    Cc: boris.ostrovsky@oracle.com
    Cc: brijesh.singh@amd.com
    Cc: caoj.fnst@cn.fujitsu.com
    Cc: geert@linux-m68k.org
    Cc: ghackmann@google.com
    Cc: gregkh@linuxfoundation.org
    Cc: jan.kiszka@siemens.com
    Cc: jarkko.sakkinen@linux.intel.com
    Cc: jpoimboe@redhat.com
    Cc: keescook@google.com
    Cc: kirill.shutemov@linux.intel.com
    Cc: kstewart@linuxfoundation.org
    Cc: linux-efi@vger.kernel.org
    Cc: linux-kbuild@vger.kernel.org
    Cc: manojgupta@google.com
    Cc: mawilcox@microsoft.com
    Cc: michal.lkml@markovi.net
    Cc: mjg59@google.com
    Cc: mka@chromium.org
    Cc: pombredanne@nexb.com
    Cc: rientjes@google.com
    Cc: rostedt@goodmis.org
    Cc: sedat.dilek@gmail.com
    Cc: thomas.lendacky@amd.com
    Cc: tstellar@redhat.com
    Cc: tweek@google.com
    Cc: virtualization@lists.linux-foundation.org
    Cc: will.deacon@arm.com
    Cc: yamada.masahiro@socionext.com
    Link: http://lkml.kernel.org/r/20180621162324.36656-2-ndesaulniers@google.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Nick Desaulniers
     

30 May, 2018

1 commit

  • [ Upstream commit 173a3efd3edb2ef6ef07471397c5f542a360e9c1 ]

    Looking at functions with large stack frames across all architectures
    led me discovering that BUG() suffers from the same problem as
    fortify_panic(), which I've added a workaround for already.

    In short, variables that go out of scope by calling a noreturn function
    or __builtin_unreachable() keep using stack space in functions
    afterwards.

    A workaround that was identified is to insert an empty assembler
    statement just before calling the function that doesn't return. I'm
    adding a macro "barrier_before_unreachable()" to document this, and
    insert calls to that in all instances of BUG() that currently suffer
    from this problem.

    The files that saw the largest change from this had these frame sizes
    before, and much less with my patch:

    fs/ext4/inode.c:82:1: warning: the frame size of 1672 bytes is larger than 800 bytes [-Wframe-larger-than=]
    fs/ext4/namei.c:434:1: warning: the frame size of 904 bytes is larger than 800 bytes [-Wframe-larger-than=]
    fs/ext4/super.c:2279:1: warning: the frame size of 1160 bytes is larger than 800 bytes [-Wframe-larger-than=]
    fs/ext4/xattr.c:146:1: warning: the frame size of 1168 bytes is larger than 800 bytes [-Wframe-larger-than=]
    fs/f2fs/inode.c:152:1: warning: the frame size of 1424 bytes is larger than 800 bytes [-Wframe-larger-than=]
    net/netfilter/ipvs/ip_vs_core.c:1195:1: warning: the frame size of 1068 bytes is larger than 800 bytes [-Wframe-larger-than=]
    net/netfilter/ipvs/ip_vs_core.c:395:1: warning: the frame size of 1084 bytes is larger than 800 bytes [-Wframe-larger-than=]
    net/netfilter/ipvs/ip_vs_ftp.c:298:1: warning: the frame size of 928 bytes is larger than 800 bytes [-Wframe-larger-than=]
    net/netfilter/ipvs/ip_vs_ftp.c:418:1: warning: the frame size of 908 bytes is larger than 800 bytes [-Wframe-larger-than=]
    net/netfilter/ipvs/ip_vs_lblcr.c:718:1: warning: the frame size of 960 bytes is larger than 800 bytes [-Wframe-larger-than=]
    drivers/net/xen-netback/netback.c:1500:1: warning: the frame size of 1088 bytes is larger than 800 bytes [-Wframe-larger-than=]

    In case of ARC and CRIS, it turns out that the BUG() implementation
    actually does return (or at least the compiler thinks it does),
    resulting in lots of warnings about uninitialized variable use and
    leaving noreturn functions, such as:

    block/cfq-iosched.c: In function 'cfq_async_queue_prio':
    block/cfq-iosched.c:3804:1: error: control reaches end of non-void function [-Werror=return-type]
    include/linux/dmaengine.h: In function 'dma_maxpq':
    include/linux/dmaengine.h:1123:1: error: control reaches end of non-void function [-Werror=return-type]

    This makes them call __builtin_trap() instead, which should normally
    dump the stack and kill the current process, like some of the other
    architectures already do.

    I tried adding barrier_before_unreachable() to panic() and
    fortify_panic() as well, but that had very little effect, so I'm not
    submitting that patch.

    Vineet said:

    : For ARC, it is double win.
    :
    : 1. Fixes 3 -Wreturn-type warnings
    :
    : | ../net/core/ethtool.c:311:1: warning: control reaches end of non-void function
    : [-Wreturn-type]
    : | ../kernel/sched/core.c:3246:1: warning: control reaches end of non-void function
    : [-Wreturn-type]
    : | ../include/linux/sunrpc/svc_xprt.h:180:1: warning: control reaches end of
    : non-void function [-Wreturn-type]
    :
    : 2. bloat-o-meter reports code size improvements as gcc elides the
    : generated code for stack return.

    Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365
    Link: http://lkml.kernel.org/r/20171219114112.939391-1-arnd@arndb.de
    Signed-off-by: Arnd Bergmann
    Acked-by: Vineet Gupta [arch/arc]
    Tested-by: Vineet Gupta [arch/arc]
    Cc: Mikael Starvik
    Cc: Jesper Nilsson
    Cc: Tony Luck
    Cc: Fenghua Yu
    Cc: Geert Uytterhoeven
    Cc: "David S. Miller"
    Cc: Christopher Li
    Cc: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: Kees Cook
    Cc: Ingo Molnar
    Cc: Josh Poimboeuf
    Cc: Will Deacon
    Cc: "Steven Rostedt (VMware)"
    Cc: Mark Rutland
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Arnd Bergmann
     

24 Apr, 2018

1 commit

  • commit 2cfe0d3009418a132b93d78642a8059a38fe5944 upstream.

    The original intent for always adding the anonymous struct in
    task_struct was to make sure we had compiler coverage.

    However, this caused pathological padding of 40 bytes at the start of
    task_struct. Instead, move the anonymous struct to being only used when
    struct layout randomization is enabled.

    Link: http://lkml.kernel.org/r/20180327213609.GA2964@beast
    Fixes: 29e48ce87f1e ("task_struct: Allow randomized")
    Signed-off-by: Kees Cook
    Reported-by: Peter Zijlstra
    Cc: Peter Zijlstra
    Cc: Ingo Molnar
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Kees Cook
     

15 Mar, 2018

1 commit

  • commit 87358710c1fb4f1bf96bbe2349975ff9953fc9b2 upstream.

    Signed-off-by: David Woodhouse
    Reviewed-by: Thomas Gleixner
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: arjan.van.de.ven@intel.com
    Cc: bp@alien8.de
    Cc: dave.hansen@intel.com
    Cc: jmattson@google.com
    Cc: karahmed@amazon.de
    Cc: kvm@vger.kernel.org
    Cc: pbonzini@redhat.com
    Cc: rkrcmar@redhat.com
    Link: http://lkml.kernel.org/r/1519037457-7643-5-git-send-email-dwmw@amazon.co.uk
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    David Woodhouse
     

22 Feb, 2018

2 commits

  • commit d9afaaa4ff7af8b87d4a205e48cb8a6f666d7f01 upstream.

    Gcc versions before 4.4 do not recognize the __optimize__ compiler
    attribute:

    warning: ‘__optimize__’ attribute directive ignored

    Fixes: 7375ae3a0b79ea07 ("compiler-gcc.h: Introduce __nostackprotector function attribute")
    Signed-off-by: Geert Uytterhoeven
    Signed-off-by: Herbert Xu
    Signed-off-by: Greg Kroah-Hartman

    Geert Uytterhoeven
     
  • commit df5d45aa08f848b79caf395211b222790534ccc7 upstream.

    Create a new function attribute __optimize, which allows to specify an
    optimization level on a per-function basis.

    Signed-off-by: Geert Uytterhoeven
    Acked-by: Ard Biesheuvel
    Signed-off-by: Herbert Xu
    Signed-off-by: Greg Kroah-Hartman

    Geert Uytterhoeven
     

25 Dec, 2017

1 commit

  • commit d15155824c5014803d91b829736d249c500bdda6 upstream.

    linux/compiler.h is included indirectly by linux/types.h via
    uapi/linux/types.h -> uapi/linux/posix_types.h -> linux/stddef.h
    -> uapi/linux/stddef.h and is needed to provide a proper definition of
    offsetof.

    Unfortunately, compiler.h requires a definition of
    smp_read_barrier_depends() for defining lockless_dereference() and soon
    for defining READ_ONCE(), which means that all
    users of READ_ONCE() will need to include asm/barrier.h to avoid splats
    such as:

    In file included from include/uapi/linux/stddef.h:1:0,
    from include/linux/stddef.h:4,
    from arch/h8300/kernel/asm-offsets.c:11:
    include/linux/list.h: In function 'list_empty':
    >> include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' [-Werror=implicit-function-declaration]
    smp_read_barrier_depends(); /* Enforce dependency ordering from x */ \
    ^

    A better alternative is to include asm/barrier.h in linux/compiler.h,
    but this requires a type definition for "bool" on some architectures
    (e.g. x86), which is defined later by linux/types.h. Type "bool" is also
    used directly in linux/compiler.h, so the whole thing is pretty fragile.

    This patch splits compiler.h in two: compiler_types.h contains type
    annotations, definitions and the compiler-specific parts, whereas
    compiler.h #includes compiler-types.h and additionally defines macros
    such as {READ,WRITE.ACCESS}_ONCE().

    uapi/linux/stddef.h and linux/linkage.h are then moved over to include
    linux/compiler_types.h, which fixes the build for h8 and blackfin.

    Signed-off-by: Will Deacon
    Cc: Linus Torvalds
    Cc: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/1508840570-22169-2-git-send-email-will.deacon@arm.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Will Deacon
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

05 Sep, 2017

1 commit

  • Pull x86 mm changes from Ingo Molnar:
    "PCID support, 5-level paging support, Secure Memory Encryption support

    The main changes in this cycle are support for three new, complex
    hardware features of x86 CPUs:

    - Add 5-level paging support, which is a new hardware feature on
    upcoming Intel CPUs allowing up to 128 PB of virtual address space
    and 4 PB of physical RAM space - a 512-fold increase over the old
    limits. (Supercomputers of the future forecasting hurricanes on an
    ever warming planet can certainly make good use of more RAM.)

    Many of the necessary changes went upstream in previous cycles,
    v4.14 is the first kernel that can enable 5-level paging.

    This feature is activated via CONFIG_X86_5LEVEL=y - disabled by
    default.

    (By Kirill A. Shutemov)

    - Add 'encrypted memory' support, which is a new hardware feature on
    upcoming AMD CPUs ('Secure Memory Encryption', SME) allowing system
    RAM to be encrypted and decrypted (mostly) transparently by the
    CPU, with a little help from the kernel to transition to/from
    encrypted RAM. Such RAM should be more secure against various
    attacks like RAM access via the memory bus and should make the
    radio signature of memory bus traffic harder to intercept (and
    decrypt) as well.

    This feature is activated via CONFIG_AMD_MEM_ENCRYPT=y - disabled
    by default.

    (By Tom Lendacky)

    - Enable PCID optimized TLB flushing on newer Intel CPUs: PCID is a
    hardware feature that attaches an address space tag to TLB entries
    and thus allows to skip TLB flushing in many cases, even if we
    switch mm's.

    (By Andy Lutomirski)

    All three of these features were in the works for a long time, and
    it's coincidence of the three independent development paths that they
    are all enabled in v4.14 at once"

    * 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (65 commits)
    x86/mm: Enable RCU based page table freeing (CONFIG_HAVE_RCU_TABLE_FREE=y)
    x86/mm: Use pr_cont() in dump_pagetable()
    x86/mm: Fix SME encryption stack ptr handling
    kvm/x86: Avoid clearing the C-bit in rsvd_bits()
    x86/CPU: Align CR3 defines
    x86/mm, mm/hwpoison: Clear PRESENT bit for kernel 1:1 mappings of poison pages
    acpi, x86/mm: Remove encryption mask from ACPI page protection type
    x86/mm, kexec: Fix memory corruption with SME on successive kexecs
    x86/mm/pkeys: Fix typo in Documentation/x86/protection-keys.txt
    x86/mm/dump_pagetables: Speed up page tables dump for CONFIG_KASAN=y
    x86/mm: Implement PCID based optimization: try to preserve old TLB entries using PCID
    x86: Enable 5-level paging support via CONFIG_X86_5LEVEL=y
    x86/mm: Allow userspace have mappings above 47-bit
    x86/mm: Prepare to expose larger address space to userspace
    x86/mpx: Do not allow MPX if we have mappings above 47-bit
    x86/mm: Rename tasksize_32bit/64bit to task_size_32bit/64bit()
    x86/xen: Redefine XEN_ELFNOTE_INIT_P2M using PUD_SIZE * PTRS_PER_PUD
    x86/mm/dump_pagetables: Fix printout of p4d level
    x86/mm/dump_pagetables: Generalize address normalization
    x86/boot: Fix memremap() related build failure
    ...

    Linus Torvalds
     

26 Aug, 2017

1 commit


10 Aug, 2017

1 commit


28 Jul, 2017

1 commit

  • Arnd reported some false positive warnings with GCC 7:

    drivers/hid/wacom_wac.o: warning: objtool: wacom_bpt3_touch()+0x2a5: stack state mismatch: cfa1=7+8 cfa2=6+16
    drivers/iio/adc/vf610_adc.o: warning: objtool: vf610_adc_calculate_rates() falls through to next function vf610_adc_sample_set()
    drivers/pwm/pwm-hibvt.o: warning: objtool: hibvt_pwm_get_state() falls through to next function hibvt_pwm_remove()
    drivers/pwm/pwm-mediatek.o: warning: objtool: mtk_pwm_config() falls through to next function mtk_pwm_enable()
    drivers/spi/spi-bcm2835.o: warning: objtool: .text: unexpected end of section
    drivers/spi/spi-bcm2835aux.o: warning: objtool: .text: unexpected end of section
    drivers/watchdog/digicolor_wdt.o: warning: objtool: dc_wdt_get_timeleft() falls through to next function dc_wdt_restart()

    When GCC 7 detects a potential divide-by-zero condition, it sometimes
    inserts a UD2 instruction for the case where the divisor is zero,
    instead of letting the hardware trap on the divide instruction.

    Objtool doesn't consider UD2 to be fatal unless it's annotated with
    unreachable(). So it considers the GCC-generated UD2 to be non-fatal,
    and it tries to follow the control flow past the UD2 and gets
    confused.

    Previously, objtool *did* assume UD2 was always a dead end. That
    changed with the following commit:

    d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")

    The motivation behind that change was that Peter was planning on using
    UD2 for __WARN(), which is *not* a dead end. However, it turns out
    that some emulators rely on UD2 being fatal, so he ended up using
    'ud0' instead:

    9a93848fe787 ("x86/debug: Implement __WARN() using UD0")

    For GCC 4.5+, it should be safe to go back to the previous assumption
    that UD2 is fatal, even when it's not annotated with unreachable().

    But for pre-4.5 versions of GCC, the unreachable() macro isn't
    supported, so such cases of UD2 need to be explicitly annotated as
    reachable.

    Reported-by: Arnd Bergmann
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
    Link: http://lkml.kernel.org/r/e57fa9dfede25f79487da8126ee9cdf7b856db65.1501188854.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

25 Jul, 2017

2 commits

  • The ASM_UNREACHABLE macro isn't GCC version-specific, so move it outside
    the GCC 4.5+ check. Otherwise the 0-day robot will report objtool
    warnings for uses of ASM_UNREACHABLE with GCC 4.4.

    Also move the annotate_unreachable() macro so the related macros can
    stay together.

    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Cc: Kees Cook
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: aa5d1b81500e ("x86/asm: Add ASM_UNREACHABLE")
    Link: http://lkml.kernel.org/r/fb18337dbf230fd36450d9faf19a2b2533dbcba1.1500993873.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • This creates an unreachable annotation in asm for CONFIG_STACK_VALIDATION=y.
    While here, adjust earlier uses of \t\n into \n\t.

    Suggested-by: Josh Poimboeuf
    Signed-off-by: Kees Cook
    Cc: Alexey Dobriyan
    Cc: Andrew Morton
    Cc: Arnd Bergmann
    Cc: Christoph Hellwig
    Cc: David S. Miller
    Cc: Davidlohr Bueso
    Cc: Elena Reshetova
    Cc: Eric Biggers
    Cc: Eric W. Biederman
    Cc: Greg KH
    Cc: Hans Liljestrand
    Cc: James Bottomley
    Cc: Jann Horn
    Cc: Linus Torvalds
    Cc: Manfred Spraul
    Cc: Peter Zijlstra
    Cc: Rik van Riel
    Cc: Serge E. Hallyn
    Cc: Thomas Gleixner
    Cc: arozansk@redhat.com
    Cc: axboe@kernel.dk
    Cc: kernel-hardening@lists.openwall.com
    Cc: linux-arch
    Link: http://lkml.kernel.org/r/1500921349-10803-3-git-send-email-keescook@chromium.org
    Signed-off-by: Ingo Molnar

    Kees Cook
     

19 Jul, 2017

2 commits

  • Pull structure randomization updates from Kees Cook:
    "Now that IPC and other changes have landed, enable manual markings for
    randstruct plugin, including the task_struct.

    This is the rest of what was staged in -next for the gcc-plugins, and
    comes in three patches, largest first:

    - mark "easy" structs with __randomize_layout

    - mark task_struct with an optional anonymous struct to isolate the
    __randomize_layout section

    - mark structs to opt _out_ of automated marking (which will come
    later)

    And, FWIW, this continues to pass allmodconfig (normal and patched to
    enable gcc-plugins) builds of x86_64, i386, arm64, arm, powerpc, and
    s390 for me"

    * tag 'gcc-plugins-v4.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
    randstruct: opt-out externally exposed function pointer structs
    task_struct: Allow randomized layout
    randstruct: Mark various structs for randomization

    Linus Torvalds
     
  • Create a new function attribute, __nostackprotector, that can used to turn off
    stack protection on a per function basis.

    Signed-off-by: Tom Lendacky
    Reviewed-by: Thomas Gleixner
    Cc: Alexander Potapenko
    Cc: Andrey Ryabinin
    Cc: Andy Lutomirski
    Cc: Arnd Bergmann
    Cc: Borislav Petkov
    Cc: Brijesh Singh
    Cc: Dave Young
    Cc: Dmitry Vyukov
    Cc: Jonathan Corbet
    Cc: Konrad Rzeszutek Wilk
    Cc: Larry Woodman
    Cc: Linus Torvalds
    Cc: Matt Fleming
    Cc: Michael S. Tsirkin
    Cc: Paolo Bonzini
    Cc: Peter Zijlstra
    Cc: Radim Krčmář
    Cc: Rik van Riel
    Cc: Toshimitsu Kani
    Cc: kasan-dev@googlegroups.com
    Cc: kvm@vger.kernel.org
    Cc: linux-arch@vger.kernel.org
    Cc: linux-doc@vger.kernel.org
    Cc: linux-efi@vger.kernel.org
    Cc: linux-mm@kvack.org
    Link: http://lkml.kernel.org/r/0576fd5c74440ad0250f16ac6609ecf587812456.1500319216.git.thomas.lendacky@amd.com
    Signed-off-by: Ingo Molnar

    Tom Lendacky
     

07 Jul, 2017

1 commit

  • The motivation for commit abb2ea7dfd82 ("compiler, clang: suppress
    warning for unused static inline functions") was to suppress clang's
    warnings about unused static inline functions.

    For configs without CONFIG_OPTIMIZE_INLINING enabled, such as any non-x86
    architecture, `inline' in the kernel implies that
    __attribute__((always_inline)) is used.

    Some code depends on that behavior, see
    https://lkml.org/lkml/2017/6/13/918:

    net/built-in.o: In function `__xchg_mb':
    arch/arm64/include/asm/cmpxchg.h:99: undefined reference to `__compiletime_assert_99'
    arch/arm64/include/asm/cmpxchg.h:99: undefined reference to `__compiletime_assert_99

    The full fix would be to identify these breakages and annotate the
    functions with __always_inline instead of `inline'. But since we are
    late in the 4.12-rc cycle, simply carry forward the forced inlining
    behavior and work toward moving arm64, and other architectures, toward
    CONFIG_OPTIMIZE_INLINING behavior.

    Link: http://lkml.kernel.org/r/alpine.DEB.2.10.1706261552200.1075@chino.kir.corp.google.com
    Signed-off-by: David Rientjes
    Reported-by: Sodagudi Prasad
    Tested-by: Sodagudi Prasad
    Tested-by: Matthias Kaehlcke
    Cc: Mark Rutland
    Cc: Will Deacon
    Cc: Catalin Marinas
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Rientjes
     

01 Jul, 2017

1 commit

  • This marks most of the layout of task_struct as randomizable, but leaves
    thread_info and scheduler state untouched at the start, and thread_struct
    untouched at the end.

    Other parts of the kernel use unnamed structures, but the 0-day builder
    using gcc-4.4 blows up on static initializers. Officially, it's documented
    as only working on gcc 4.6 and later, which further confuses me:
    https://gcc.gnu.org/wiki/C11Status
    The structure layout randomization already requires gcc 4.7, but instead
    of depending on the plugin being enabled, just check the gcc versions
    for wider build testing. At Linus's suggestion, the marking is hidden
    in a macro to reduce how ugly it looks. Additionally, indenting is left
    unchanged since it would make things harder to read.

    Randomization of task_struct is modified from Brad Spengler/PaX Team's
    code in the last public patch of grsecurity/PaX based on my understanding
    of the code. Changes or omissions from the original code are mine and
    don't reflect the original grsecurity/PaX code.

    Cc: Linus Torvalds
    Signed-off-by: Kees Cook

    Kees Cook
     

23 Jun, 2017

1 commit

  • This randstruct plugin is modified from Brad Spengler/PaX Team's code
    in the last public patch of grsecurity/PaX based on my understanding
    of the code. Changes or omissions from the original code are mine and
    don't reflect the original grsecurity/PaX code.

    The randstruct GCC plugin randomizes the layout of selected structures
    at compile time, as a probabilistic defense against attacks that need to
    know the layout of structures within the kernel. This is most useful for
    "in-house" kernel builds where neither the randomization seed nor other
    build artifacts are made available to an attacker. While less useful for
    distribution kernels (where the randomization seed must be exposed for
    third party kernel module builds), it still has some value there since now
    all kernel builds would need to be tracked by an attacker.

    In more performance sensitive scenarios, GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
    can be selected to make a best effort to restrict randomization to
    cacheline-sized groups of elements, and will not randomize bitfields. This
    comes at the cost of reduced randomization.

    Two annotations are defined,__randomize_layout and __no_randomize_layout,
    which respectively tell the plugin to either randomize or not to
    randomize instances of the struct in question. Follow-on patches enable
    the auto-detection logic for selecting structures for randomization
    that contain only function pointers. It is disabled here to assist with
    bisection.

    Since any randomized structs must be initialized using designated
    initializers, __randomize_layout includes the __designated_init annotation
    even when the plugin is disabled so that all builds will require
    the needed initialization. (With the plugin enabled, annotations for
    automatically chosen structures are marked as well.)

    The main differences between this implemenation and grsecurity are:
    - disable automatic struct selection (to be enabled in follow-up patch)
    - add designated_init attribute at runtime and for manual marking
    - clarify debugging output to differentiate bad cast warnings
    - add whitelisting infrastructure
    - support gcc 7's DECL_ALIGN and DECL_MODE changes (Laura Abbott)
    - raise minimum required GCC version to 4.7

    Earlier versions of this patch series were ported by Michael Leibowitz.

    Signed-off-by: Kees Cook

    Kees Cook
     

29 May, 2017

1 commit

  • This allows structure annotations for requiring designated initialization
    in GCC 5.1.0 and later:
    https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

    The structure randomization layout plugin will be using this to help
    identify structures that need this form of initialization.

    Signed-off-by: Kees Cook

    Kees Cook
     

02 Mar, 2017

1 commit

  • The '__unreachable' and '__func_stack_frame_non_standard' sections are
    only used at compile time. They're discarded for vmlinux but they
    should also be discarded for modules.

    Since this is a recurring pattern, prefix the section names with
    ".discard.". It's a nice convention and vmlinux.lds.h already discards
    such sections.

    Also remove the 'a' (allocatable) flag from the __unreachable section
    since it doesn't make sense for a discarded section.

    Suggested-by: Linus Torvalds
    Signed-off-by: Josh Poimboeuf
    Cc: Jessica Yu
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
    Link: http://lkml.kernel.org/r/20170301180444.lhd53c5tibc4ns77@treble
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

01 Mar, 2017

2 commits

  • Linus reported the following commit broke module loading on his laptop:

    d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")

    It showed errors like the following:

    module: overflow in relocation type 10 val ffffffffc02afc81
    module: 'nvme' likely not compiled with -mcmodel=kernel

    The problem is that the __unreachable section addresses are stored using
    the '.long' asm directive, which isn't big enough for .text section
    kernel addresses. Use relative addresses instead:

    ".long %c0b - .\t\n"

    Suggested-by: Linus Torvalds
    Reported-by: Linus Torvalds
    Signed-off-by: Josh Poimboeuf
    Cc: Peter Zijlstra
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
    Link: http://lkml.kernel.org/r/20170301060504.oltm3iws6fmubnom@treble
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • Pull objtool fixes from Ingo Molnar:
    "A handful of objtool fixes related to unreachable code, plus a build
    fix for out of tree modules"

    * 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    objtool: Enclose contents of unreachable() macro in a block
    objtool: Prevent GCC from merging annotate_unreachable()
    objtool: Improve detection of BUG() and other dead ends
    objtool: Fix CONFIG_STACK_VALIDATION=y warning for out-of-tree modules

    Linus Torvalds
     

28 Feb, 2017

1 commit

  • Guenter Roeck reported a boot failure in mips64. It was bisected to the
    following commit:

    d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")

    The unreachable() macro was formerly only composed of a single
    statement. The above commit added a second statement, but neglected to
    enclose the statements in a block.

    Suggested-by: Guenter Roeck
    Reported-by: Guenter Roeck
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
    Link: http://lkml.kernel.org/r/20170228042116.glmwmwiohcix7o4a@treble
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

25 Feb, 2017

2 commits

  • 0-day bot reported some new objtool warnings which were caused by the
    new annotate_unreachable() macro:

    fs/afs/flock.o: warning: objtool: afs_do_unlk()+0x0: duplicate frame pointer save
    fs/afs/flock.o: warning: objtool: afs_do_unlk()+0x0: frame pointer state mismatch
    fs/btrfs/delayed-inode.o: warning: objtool: btrfs_delete_delayed_dir_index()+0x0: duplicate frame pointer save
    fs/btrfs/delayed-inode.o: warning: objtool: btrfs_delete_delayed_dir_index()+0x0: frame pointer state mismatch
    fs/dlm/lock.o: warning: objtool: _grant_lock()+0x0: duplicate frame pointer save
    fs/dlm/lock.o: warning: objtool: _grant_lock()+0x0: frame pointer state mismatch
    fs/ocfs2/alloc.o: warning: objtool: ocfs2_mv_path()+0x0: duplicate frame pointer save
    fs/ocfs2/alloc.o: warning: objtool: ocfs2_mv_path()+0x0: frame pointer state mismatch

    It turns out that, for older versions of GCC, if a function has multiple
    BUG() incantations, GCC will sometimes merge the corresponding
    annotate_unreachable() inline asm statements into a single block. That
    has the undesirable effect of removing one of the entries in the
    __unreachable section, confusing objtool greatly.

    A workaround for this issue is to ensure that each instance of the
    inline asm statement uses a different label, so that GCC sees the
    statements are unique and leaves them alone. The inline asm ‘%=’ token
    could be used for that, but unfortunately older versions of GCC don't
    support it. So I implemented a poor man's version of it with the
    __LINE__ macro.

    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
    Link: http://lkml.kernel.org/r/0c14b00baf9f68d1b0221ddb6c88b925181c8be8.1487997036.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • Add __mode(x) into compiler-gcc.h as part of a cleanup task I've taken
    up, to replace gcc specific attributes with macros.

    The next patch is a cleanup of the m68k subsystem and it requires a new
    macro to wrap __attribute__ ((mode (...)))

    Link: http://lkml.kernel.org/r/1485540901-1988-2-git-send-email-gidisrael@gmail.com
    Signed-off-by: Gideon Israel Dsouza
    Cc: Greg Ungerer
    Cc: Geert Uytterhoeven
    Cc: Paul Gortmaker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Gideon Israel Dsouza
     

24 Feb, 2017

1 commit

  • The BUG() macro's use of __builtin_unreachable() via the unreachable()
    macro tells gcc that the instruction is a dead end, and that it's safe
    to assume the current code path will not execute past the previous
    instruction.

    On x86, the BUG() macro is implemented with the 'ud2' instruction. When
    objtool's branch analysis sees that instruction, it knows the current
    code path has come to a dead end.

    Peter Zijlstra has been working on a patch to change the WARN macros to
    use 'ud2'. That patch will break objtool's assumption that 'ud2' is
    always a dead end.

    Generally it's best for objtool to avoid making those kinds of
    assumptions anyway. The more ignorant it is of kernel code internals,
    the better.

    So create a more generic way for objtool to detect dead ends by adding
    an annotation to the unreachable() macro. The annotation stores a
    pointer to the end of the unreachable code path in an '__unreachable'
    section. Objtool can read that section to find the dead ends.

    Tested-by: Peter Zijlstra (Intel)
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/41a6d33971462ebd944a1c60ad4bf5be86c17b77.1487712920.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

13 Jan, 2017

1 commit

  • Continuing from this commit: 52f5684c8e1e
    ("kernel: use macros from compiler.h instead of __attribute__((...))")

    I submitted 4 total patches. They are part of task I've taken up to
    increase compiler portability in the kernel. I've cleaned up the
    subsystems under /kernel /mm /block and /security, this patch targets
    /crypto.

    There is which provides macros for various gcc specific
    constructs. Eg: __weak for __attribute__((weak)). I've cleaned all
    instances of gcc specific attributes with the right macros for the crypto
    subsystem.

    I had to make one additional change into compiler-gcc.h for the case when
    one wants to use this: __attribute__((aligned) and not specify an alignment
    factor. From the gcc docs, this will result in the largest alignment for
    that data type on the target machine so I've named the macro
    __aligned_largest. Please advise if another name is more appropriate.

    Signed-off-by: Gideon Israel Dsouza
    Signed-off-by: Herbert Xu

    Gideon Israel Dsouza
     

13 Dec, 2016

1 commit


01 Dec, 2016

1 commit

  • kasan_global struct is part of compiler/runtime ABI. gcc revision
    241983 has added a new field to kasan_global struct. Update kernel
    definition of kasan_global struct to include the new field.

    Without this patch KASAN is broken with gcc 7.

    Link: http://lkml.kernel.org/r/1479219743-28682-1-git-send-email-dvyukov@google.com
    Signed-off-by: Dmitry Vyukov
    Acked-by: Andrey Ryabinin
    Cc: Alexander Potapenko
    Cc: [4.0+]
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dmitry Vyukov
     

11 Oct, 2016

1 commit

  • The __latent_entropy gcc attribute can be used only on functions and
    variables. If it is on a function then the plugin will instrument it for
    gathering control-flow entropy. If the attribute is on a variable then
    the plugin will initialize it with random contents. The variable must
    be an integer, an integer array type or a structure with integer fields.

    These specific functions have been selected because they are init
    functions (to help gather boot-time entropy), are called at unpredictable
    times, or they have variable loops, each of which provide some level of
    latent entropy.

    Signed-off-by: Emese Revfy
    [kees: expanded commit message]
    Signed-off-by: Kees Cook

    Emese Revfy
     

31 Aug, 2016

1 commit

  • There are three usercopy warnings which are currently being silenced for
    gcc 4.6 and newer:

    1) "copy_from_user() buffer size is too small" compile warning/error

    This is a static warning which happens when object size and copy size
    are both const, and copy size > object size. I didn't see any false
    positives for this one. So the function warning attribute seems to
    be working fine here.

    Note this scenario is always a bug and so I think it should be
    changed to *always* be an error, regardless of
    CONFIG_DEBUG_STRICT_USER_COPY_CHECKS.

    2) "copy_from_user() buffer size is not provably correct" compile warning

    This is another static warning which happens when I enable
    __compiletime_object_size() for new compilers (and
    CONFIG_DEBUG_STRICT_USER_COPY_CHECKS). It happens when object size
    is const, but copy size is *not*. In this case there's no way to
    compare the two at build time, so it gives the warning. (Note the
    warning is a byproduct of the fact that gcc has no way of knowing
    whether the overflow function will be called, so the call isn't dead
    code and the warning attribute is activated.)

    So this warning seems to only indicate "this is an unusual pattern,
    maybe you should check it out" rather than "this is a bug".

    I get 102(!) of these warnings with allyesconfig and the
    __compiletime_object_size() gcc check removed. I don't know if there
    are any real bugs hiding in there, but from looking at a small
    sample, I didn't see any. According to Kees, it does sometimes find
    real bugs. But the false positive rate seems high.

    3) "Buffer overflow detected" runtime warning

    This is a runtime warning where object size is const, and copy size >
    object size.

    All three warnings (both static and runtime) were completely disabled
    for gcc 4.6 with the following commit:

    2fb0815c9ee6 ("gcc4: disable __compiletime_object_size for GCC 4.6+")

    That commit mistakenly assumed that the false positives were caused by a
    gcc bug in __compiletime_object_size(). But in fact,
    __compiletime_object_size() seems to be working fine. The false
    positives were instead triggered by #2 above. (Though I don't have an
    explanation for why the warnings supposedly only started showing up in
    gcc 4.6.)

    So remove warning #2 to get rid of all the false positives, and re-enable
    warnings #1 and #3 by reverting the above commit.

    Furthermore, since #1 is a real bug which is detected at compile time,
    upgrade it to always be an error.

    Having done all that, CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is no longer
    needed.

    Signed-off-by: Josh Poimboeuf
    Cc: Kees Cook
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: "H . Peter Anvin"
    Cc: Andy Lutomirski
    Cc: Steven Rostedt
    Cc: Brian Gerst
    Cc: Peter Zijlstra
    Cc: Frederic Weisbecker
    Cc: Byungchul Park
    Cc: Nilay Vaish
    Signed-off-by: Linus Torvalds

    Josh Poimboeuf
     

27 Aug, 2016

1 commit

  • Although sparse declares __builtin_bswap*(), it can't actually do
    constant folding inside them (yet). As such, things like

    switch (protocol) {
    case htons(ETH_P_IP):
    break;
    }

    which we do all over the place cause sparse to warn that it expects a
    constant instead of a function call.

    Disable __HAVE_BUILTIN_BSWAP*__ if __CHECKER__ is defined to avoid this.

    Fixes: 7322dd755e7d ("byteswap: try to avoid __builtin_constant_p gcc bug")
    Link: http://lkml.kernel.org/r/1470914102-26389-1-git-send-email-johannes@sipsolutions.net
    Signed-off-by: Johannes Berg
    Acked-by: Arnd Bergmann
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Johannes Berg
     

20 May, 2016

1 commit

  • gcc as far back as at least 3.04 documents the function attribute
    __malloc__. Add a shorthand for attaching that to a function
    declaration. This was also suggested by Andi Kleen way back in 2002
    [1], but didn't get applied, perhaps because gcc at that time generated
    the exact same code with and without this attribute.

    This attribute tells the compiler that the return value (if non-NULL)
    can be assumed not to alias any other valid pointers at the time of the
    call.

    Please note that the documentation for a range of gcc versions (starting
    from around 4.7) contained a somewhat confusing and self-contradicting
    text:

    The malloc attribute is used to tell the compiler that a function may
    be treated as if any non-NULL pointer it returns cannot alias any other
    pointer valid when the function returns and *that the memory has
    undefined content*. [...] Standard functions with this property include
    malloc and *calloc*.

    (emphasis mine). The intended meaning has later been clarified [2]:

    This tells the compiler that a function is malloc-like, i.e., that the
    pointer P returned by the function cannot alias any other pointer valid
    when the function returns, and moreover no pointers to valid objects
    occur in any storage addressed by P.

    What this means is that we can apply the attribute to kmalloc and
    friends, and it is ok for the returned memory to have well-defined
    contents (__GFP_ZERO). But it is not ok to apply it to kmemdup(), nor
    to other functions which both allocate and possibly initialize the
    memory with existing pointers. So unless someone is doing something
    pretty perverted kstrdup() should also be a fine candidate.

    [1] http://thread.gmane.org/gmane.linux.kernel/57172
    [2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56955

    Signed-off-by: Rasmus Villemoes
    Cc: Christoph Lameter
    Cc: Pekka Enberg
    Cc: David Rientjes
    Cc: Joonsoo Kim
    Cc: Andi Kleen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rasmus Villemoes
     

10 May, 2016

1 commit

  • gcc support for __builtin_bswap16() was supposedly added for powerpc in
    gcc 4.6, and was then later added for other architectures in gcc 4.8.

    However, Stephen Rothwell reported that attempting to use it on powerpc
    in gcc 4.6 fails with:

    lib/vsprintf.c:160:2: error: initializer element is not constant
    lib/vsprintf.c:160:2: error: (near initialization for 'decpair[0]')
    lib/vsprintf.c:160:2: error: initializer element is not constant
    lib/vsprintf.c:160:2: error: (near initialization for 'decpair[1]')
    ...

    I'm not entirely sure what those errors mean, but I don't see them on
    gcc 4.8. So let's consider gcc 4.8 to be the official starting point
    for __builtin_bswap16().

    Arnd Bergmann adds:
    "I found the commit in gcc-4.8 that replaced the powerpc-specific
    implementation of __builtin_bswap16 with an architecture-independent
    one. Apparently the powerpc version (gcc-4.6 and 4.7) just mapped to
    the lhbrx/sthbrx instructions, so it ended up not being a constant,
    though the intent of the patch was mainly to add support for the
    builtin to x86:

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52624

    has the patch that went into gcc-4.8 and more information."

    Fixes: 7322dd755e7d ("byteswap: try to avoid __builtin_constant_p gcc bug")
    Reported-by: Stephen Rothwell
    Tested-by: Stephen Rothwell
    Acked-by: Arnd Bergmann
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Stephen Rothwell
    Signed-off-by: Linus Torvalds

    Josh Poimboeuf
     

05 Apr, 2016

1 commit

  • -ftracer can duplicate asm blocks causing compilation to fail in
    noclone functions. For example, KVM declares a global variable
    in an asm like

    asm("2: ... \n
    .pushsection data \n
    .global vmx_return \n
    vmx_return: .long 2b");

    and -ftracer causes a double declaration.

    Cc: Andrew Morton
    Cc: Michal Marek
    Cc: stable@vger.kernel.org
    Cc: kvm@vger.kernel.org
    Reported-by: Linda Walsh
    Signed-off-by: Paolo Bonzini

    Paolo Bonzini
     

07 Nov, 2015

1 commit


06 Nov, 2015

1 commit

  • The patch "slab.h: sprinkle __assume_aligned attributes" causes *tons* of
    whinges if you do 'make C=2' with sparse 0.5.0:

    CHECK drivers/media/usb/pwc/pwc-if.c
    include/linux/slab.h:307:43: error: attribute '__assume_aligned__': unknown attribute
    include/linux/slab.h:308:58: error: attribute '__assume_aligned__': unknown attribute
    include/linux/slab.h:337:73: error: attribute '__assume_aligned__': unknown attribute
    include/linux/slab.h:375:74: error: attribute '__assume_aligned__': unknown attribute
    include/linux/slab.h:378:80: error: attribute '__assume_aligned__': unknown attribute

    sparse apparently pretends to be gcc >= 4.9, yet isn't prepared to handle
    all the function attributes supported by those gccs and complains loudly.
    So hide the definition of __assume_aligned from it (so that the generic
    one in compiler.h gets used).

    Signed-off-by: Rasmus Villemoes
    Reported-by: Valdis Kletnieks
    Tested-By: Valdis Kletnieks
    Cc: Christopher Li
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Rasmus Villemoes