OSDN Git Service

Merge tag 'mips_4.19_2' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Aug 2018 21:23:08 +0000 (14:23 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Aug 2018 21:23:08 +0000 (14:23 -0700)
Pull MIPS fixes from Paul Burton:

  - Fix microMIPS build failures by adding a .insn directive to the
    barrier_before_unreachable() asm statement in order to convince the
    toolchain that the asm statement is a valid branch target rather
    than a bogus attempt to switch ISA.

  - Clean up our declarations of TLB functions that we overwrite with
    generated code in order to prevent the compiler making assumptions
    about alignment that cause microMIPS kernels built with GCC 7 &
    above to die early during boot.

  - Fix up a regression for MIPS32 kernels which slipped into the main
    MIPS pull for 4.19, causing CONFIG_32BIT=y kernels to contain
    inappropriate MIPS64 instructions.

  - Extend our existing workaround for MIPSr6 builds that end up using
    the __multi3 intrinsic to GCC 7 & below, rather than just GCC 7.

* tag 'mips_4.19_2' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux:
  MIPS: lib: Provide MIPS64r6 __multi3() for GCC < 7
  MIPS: Workaround GCC __builtin_unreachable reordering bug
  compiler.h: Allow arch-specific asm/compiler.h
  MIPS: Avoid move psuedo-instruction whilst using MIPS_ISA_LEVEL
  MIPS: Consistently declare TLB functions
  MIPS: Export tlbmiss_handler_setup_pgd near its definition

1  2 
arch/Kconfig
arch/mips/Kconfig
arch/mips/include/asm/atomic.h
arch/mips/kernel/traps.c
include/linux/compiler_types.h

diff --combined arch/Kconfig
@@@ -3,14 -3,6 +3,14 @@@
  # General architecture dependent options
  #
  
 +#
 +# Note: arch/$(SRCARCH)/Kconfig needs to be included first so that it can
 +# override the default values in this file.
 +#
 +source "arch/$(SRCARCH)/Kconfig"
 +
 +menu "General architecture-dependent options"
 +
  config CRASH_CORE
        bool
  
@@@ -21,9 -13,6 +21,9 @@@ config KEXEC_COR
  config HAVE_IMA_KEXEC
        bool
  
 +config HOTPLUG_SMT
 +      bool
 +
  config OPROFILE
        tristate "OProfile system profiling"
        depends on PROFILING
@@@ -416,6 -405,150 +416,6 @@@ config SECCOMP_FILTE
  
          See Documentation/userspace-api/seccomp_filter.rst for details.
  
 -preferred-plugin-hostcc := $(if-success,[ $(gcc-version) -ge 40800 ],$(HOSTCXX),$(HOSTCC))
 -
 -config PLUGIN_HOSTCC
 -      string
 -      default "$(shell,$(srctree)/scripts/gcc-plugin.sh "$(preferred-plugin-hostcc)" "$(HOSTCXX)" "$(CC)")"
 -      help
 -        Host compiler used to build GCC plugins.  This can be $(HOSTCXX),
 -        $(HOSTCC), or a null string if GCC plugin is unsupported.
 -
 -config HAVE_GCC_PLUGINS
 -      bool
 -      help
 -        An arch should select this symbol if it supports building with
 -        GCC plugins.
 -
 -menuconfig GCC_PLUGINS
 -      bool "GCC plugins"
 -      depends on HAVE_GCC_PLUGINS
 -      depends on PLUGIN_HOSTCC != ""
 -      help
 -        GCC plugins are loadable modules that provide extra features to the
 -        compiler. They are useful for runtime instrumentation and static analysis.
 -
 -        See Documentation/gcc-plugins.txt for details.
 -
 -config GCC_PLUGIN_CYC_COMPLEXITY
 -      bool "Compute the cyclomatic complexity of a function" if EXPERT
 -      depends on GCC_PLUGINS
 -      depends on !COMPILE_TEST        # too noisy
 -      help
 -        The complexity M of a function's control flow graph is defined as:
 -         M = E - N + 2P
 -        where
 -
 -        E = the number of edges
 -        N = the number of nodes
 -        P = the number of connected components (exit nodes).
 -
 -        Enabling this plugin reports the complexity to stderr during the
 -        build. It mainly serves as a simple example of how to create a
 -        gcc plugin for the kernel.
 -
 -config GCC_PLUGIN_SANCOV
 -      bool
 -      depends on GCC_PLUGINS
 -      help
 -        This plugin inserts a __sanitizer_cov_trace_pc() call at the start of
 -        basic blocks. It supports all gcc versions with plugin support (from
 -        gcc-4.5 on). It is based on the commit "Add fuzzing coverage support"
 -        by Dmitry Vyukov <dvyukov@google.com>.
 -
 -config GCC_PLUGIN_LATENT_ENTROPY
 -      bool "Generate some entropy during boot and runtime"
 -      depends on GCC_PLUGINS
 -      help
 -        By saying Y here the kernel will instrument some kernel code to
 -        extract some entropy from both original and artificially created
 -        program state.  This will help especially embedded systems where
 -        there is little 'natural' source of entropy normally.  The cost
 -        is some slowdown of the boot process (about 0.5%) and fork and
 -        irq processing.
 -
 -        Note that entropy extracted this way is not cryptographically
 -        secure!
 -
 -        This plugin was ported from grsecurity/PaX. More information at:
 -         * https://grsecurity.net/
 -         * https://pax.grsecurity.net/
 -
 -config GCC_PLUGIN_STRUCTLEAK
 -      bool "Force initialization of variables containing userspace addresses"
 -      depends on GCC_PLUGINS
 -      # Currently STRUCTLEAK inserts initialization out of live scope of
 -      # variables from KASAN point of view. This leads to KASAN false
 -      # positive reports. Prohibit this combination for now.
 -      depends on !KASAN_EXTRA
 -      help
 -        This plugin zero-initializes any structures containing a
 -        __user attribute. This can prevent some classes of information
 -        exposures.
 -
 -        This plugin was ported from grsecurity/PaX. More information at:
 -         * https://grsecurity.net/
 -         * https://pax.grsecurity.net/
 -
 -config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL
 -      bool "Force initialize all struct type variables passed by reference"
 -      depends on GCC_PLUGIN_STRUCTLEAK
 -      depends on !COMPILE_TEST
 -      help
 -        Zero initialize any struct type local variable that may be passed by
 -        reference without having been initialized.
 -
 -config GCC_PLUGIN_STRUCTLEAK_VERBOSE
 -      bool "Report forcefully initialized variables"
 -      depends on GCC_PLUGIN_STRUCTLEAK
 -      depends on !COMPILE_TEST        # too noisy
 -      help
 -        This option will cause a warning to be printed each time the
 -        structleak plugin finds a variable it thinks needs to be
 -        initialized. Since not all existing initializers are detected
 -        by the plugin, this can produce false positive warnings.
 -
 -config GCC_PLUGIN_RANDSTRUCT
 -      bool "Randomize layout of sensitive kernel structures"
 -      depends on GCC_PLUGINS
 -      select MODVERSIONS if MODULES
 -      help
 -        If you say Y here, the layouts of structures that are entirely
 -        function pointers (and have not been manually annotated with
 -        __no_randomize_layout), or structures that have been explicitly
 -        marked with __randomize_layout, will be randomized at compile-time.
 -        This can introduce the requirement of an additional information
 -        exposure vulnerability for exploits targeting these structure
 -        types.
 -
 -        Enabling this feature will introduce some performance impact,
 -        slightly increase memory usage, and prevent the use of forensic
 -        tools like Volatility against the system (unless the kernel
 -        source tree isn't cleaned after kernel installation).
 -
 -        The seed used for compilation is located at
 -        scripts/gcc-plgins/randomize_layout_seed.h.  It remains after
 -        a make clean to allow for external modules to be compiled with
 -        the existing seed and will be removed by a make mrproper or
 -        make distclean.
 -
 -        Note that the implementation requires gcc 4.7 or newer.
 -
 -        This plugin was ported from grsecurity/PaX. More information at:
 -         * https://grsecurity.net/
 -         * https://pax.grsecurity.net/
 -
 -config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
 -      bool "Use cacheline-aware structure randomization"
 -      depends on GCC_PLUGIN_RANDSTRUCT
 -      depends on !COMPILE_TEST        # do not reduce test coverage
 -      help
 -        If you say Y here, the RANDSTRUCT randomization will make a
 -        best effort at restricting randomization to cacheline-sized
 -        groups of elements.  It will further not randomize bitfields
 -        in structures.  This reduces the performance hit of RANDSTRUCT
 -        at the cost of weakened randomization.
 -
  config HAVE_STACKPROTECTOR
        bool
        help
@@@ -742,9 -875,6 +742,9 @@@ config COMPAT_32BIT_TIM
  config ARCH_NO_COHERENT_DMA_MMAP
        bool
  
 +config ARCH_NO_PREEMPT
 +      bool
 +
  config CPU_NO_EFFICIENT_FFS
        def_bool n
  
@@@ -841,18 -971,12 +841,26 @@@ config REFCOUNT_FUL
          against various use-after-free conditions that can be used in
          security flaw exploits.
  
+ config HAVE_ARCH_COMPILER_H
+       bool
+       help
+         An architecture can select this if it provides an
+         asm/compiler.h header that should be included after
+         linux/compiler-*.h in order to override macro definitions that those
+         headers generally provide.
 +config HAVE_ARCH_PREL32_RELOCATIONS
 +      bool
 +      help
 +        May be selected by an architecture if it supports place-relative
 +        32-bit relocations, both in the toolchain and in the module loader,
 +        in which case relative references can be used in special sections
 +        for PCI fixup, initcalls etc which are only half the size on 64 bit
 +        architectures, and don't require runtime relocation on relocatable
 +        kernels.
 +
  source "kernel/gcov/Kconfig"
 +
 +source "scripts/gcc-plugins/Kconfig"
 +
 +endmenu
diff --combined arch/mips/Kconfig
@@@ -33,6 -33,7 +33,7 @@@ config MIP
        select GENERIC_SMP_IDLE_THREAD
        select GENERIC_TIME_VSYSCALL
        select HANDLE_DOMAIN_IRQ
+       select HAVE_ARCH_COMPILER_H
        select HAVE_ARCH_JUMP_LABEL
        select HAVE_ARCH_KGDB
        select HAVE_ARCH_MMAP_RND_BITS if MMU
@@@ -2635,6 -2636,8 +2636,6 @@@ config HW_PERF_EVENT
          Enable hardware performance counter support for perf events. If
          disabled, perf events will use software events only.
  
 -source "mm/Kconfig"
 -
  config SMP
        bool "Multi-Processing support"
        depends on SYS_SUPPORTS_SMP
@@@ -2812,6 -2815,8 +2813,6 @@@ config H
  config SCHED_HRTICK
        def_bool HIGH_RES_TIMERS
  
 -source "kernel/Kconfig.preempt"
 -
  config KEXEC
        bool "Kexec system call"
        select KEXEC_CORE
@@@ -2987,6 -2992,10 +2988,6 @@@ config PGTABLE_LEVEL
  config MIPS_AUTO_PFN_OFFSET
        bool
  
 -source "init/Kconfig"
 -
 -source "kernel/Kconfig.freezer"
 -
  menu "Bus options (PCI, PCMCIA, EISA, ISA, TC)"
  
  config HW_HAS_EISA
@@@ -3119,6 -3128,10 +3120,6 @@@ source "drivers/rapidio/Kconfig
  
  endmenu
  
 -menu "Executable file formats"
 -
 -source "fs/Kconfig.binfmt"
 -
  config TRAD_SIGNALS
        bool
  
@@@ -3164,6 -3177,8 +3165,6 @@@ config BINFMT_ELF3
        default y if MIPS32_O32 || MIPS32_N32
        select ELFCORE
  
 -endmenu
 -
  menu "Power management options"
  
  config ARCH_HIBERNATION_POSSIBLE
@@@ -3191,6 -3206,20 +3192,6 @@@ source "drivers/cpuidle/Kconfig
  
  endmenu
  
 -source "net/Kconfig"
 -
 -source "drivers/Kconfig"
 -
  source "drivers/firmware/Kconfig"
  
 -source "fs/Kconfig"
 -
 -source "arch/mips/Kconfig.debug"
 -
 -source "security/Kconfig"
 -
 -source "crypto/Kconfig"
 -
 -source "lib/Kconfig"
 -
  source "arch/mips/kvm/Kconfig"
@@@ -122,8 -122,8 +122,8 @@@ static __inline__ int atomic_fetch_##op
                "       " #asm_op " %0, %1, %3                          \n"   \
                "       sc      %0, %2                                  \n"   \
                "\t" __scbeqz " %0, 1b                                  \n"   \
-               "       move    %0, %1                                  \n"   \
                "       .set    mips0                                   \n"   \
+               "       move    %0, %1                                  \n"   \
                : "=&r" (result), "=&r" (temp),                               \
                  "+" GCC_OFF_SMALL_ASM() (v->counter)                        \
                : "Ir" (i));                                                  \
@@@ -190,9 -190,11 +190,11 @@@ static __inline__ int atomic_sub_if_pos
                __asm__ __volatile__(
                "       .set    "MIPS_ISA_LEVEL"                        \n"
                "1:     ll      %1, %2          # atomic_sub_if_positive\n"
+               "       .set    mips0                                   \n"
                "       subu    %0, %1, %3                              \n"
                "       move    %1, %0                                  \n"
                "       bltz    %0, 1f                                  \n"
+               "       .set    "MIPS_ISA_LEVEL"                        \n"
                "       sc      %1, %2                                  \n"
                "\t" __scbeqz " %1, 1b                                  \n"
                "1:                                                     \n"
  #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n)))
  #define atomic_xchg(v, new) (xchg(&((v)->counter), (new)))
  
 -/**
 - * __atomic_add_unless - add unless the number is a given value
 - * @v: pointer of type atomic_t
 - * @a: the amount to add to v...
 - * @u: ...unless v is equal to u.
 - *
 - * Atomically adds @a to @v, so long as it was not @u.
 - * Returns the old value of @v.
 - */
 -static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)
 -{
 -      int c, old;
 -      c = atomic_read(v);
 -      for (;;) {
 -              if (unlikely(c == (u)))
 -                      break;
 -              old = atomic_cmpxchg((v), c, c + (a));
 -              if (likely(old == c))
 -                      break;
 -              c = old;
 -      }
 -      return c;
 -}
 -
 -#define atomic_dec_return(v) atomic_sub_return(1, (v))
 -#define atomic_inc_return(v) atomic_add_return(1, (v))
 -
 -/*
 - * atomic_sub_and_test - subtract value from variable and test result
 - * @i: integer value to subtract
 - * @v: pointer of type atomic_t
 - *
 - * Atomically subtracts @i from @v and returns
 - * true if the result is zero, or false for all
 - * other cases.
 - */
 -#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0)
 -
 -/*
 - * atomic_inc_and_test - increment and test
 - * @v: pointer of type atomic_t
 - *
 - * Atomically increments @v by 1
 - * and returns true if the result is zero, or false for all
 - * other cases.
 - */
 -#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
 -
 -/*
 - * atomic_dec_and_test - decrement by 1 and test
 - * @v: pointer of type atomic_t
 - *
 - * Atomically decrements @v by 1 and
 - * returns true if the result is 0, or false for all other
 - * cases.
 - */
 -#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
 -
  /*
   * atomic_dec_if_positive - decrement by 1 if old value positive
   * @v: pointer of type atomic_t
   */
  #define atomic_dec_if_positive(v)     atomic_sub_if_positive(1, v)
  
 -/*
 - * atomic_inc - increment atomic variable
 - * @v: pointer of type atomic_t
 - *
 - * Atomically increments @v by 1.
 - */
 -#define atomic_inc(v) atomic_add(1, (v))
 -
 -/*
 - * atomic_dec - decrement and test
 - * @v: pointer of type atomic_t
 - *
 - * Atomically decrements @v by 1.
 - */
 -#define atomic_dec(v) atomic_sub(1, (v))
 -
 -/*
 - * atomic_add_negative - add and test if negative
 - * @v: pointer of type atomic_t
 - * @i: integer value to add
 - *
 - * Atomically adds @i to @v and returns true
 - * if the result is negative, or false when
 - * result is greater than or equal to zero.
 - */
 -#define atomic_add_negative(i, v) (atomic_add_return(i, (v)) < 0)
 -
  #ifdef CONFIG_64BIT
  
  #define ATOMIC64_INIT(i)    { (i) }
@@@ -412,12 -499,99 +414,12 @@@ static __inline__ long atomic64_sub_if_
        ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n)))
  #define atomic64_xchg(v, new) (xchg(&((v)->counter), (new)))
  
 -/**
 - * atomic64_add_unless - add unless the number is a given value
 - * @v: pointer of type atomic64_t
 - * @a: the amount to add to v...
 - * @u: ...unless v is equal to u.
 - *
 - * Atomically adds @a to @v, so long as it was not @u.
 - * Returns true iff @v was not @u.
 - */
 -static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 -{
 -      long c, old;
 -      c = atomic64_read(v);
 -      for (;;) {
 -              if (unlikely(c == (u)))
 -                      break;
 -              old = atomic64_cmpxchg((v), c, c + (a));
 -              if (likely(old == c))
 -                      break;
 -              c = old;
 -      }
 -      return c != (u);
 -}
 -
 -#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
 -
 -#define atomic64_dec_return(v) atomic64_sub_return(1, (v))
 -#define atomic64_inc_return(v) atomic64_add_return(1, (v))
 -
 -/*
 - * atomic64_sub_and_test - subtract value from variable and test result
 - * @i: integer value to subtract
 - * @v: pointer of type atomic64_t
 - *
 - * Atomically subtracts @i from @v and returns
 - * true if the result is zero, or false for all
 - * other cases.
 - */
 -#define atomic64_sub_and_test(i, v) (atomic64_sub_return((i), (v)) == 0)
 -
 -/*
 - * atomic64_inc_and_test - increment and test
 - * @v: pointer of type atomic64_t
 - *
 - * Atomically increments @v by 1
 - * and returns true if the result is zero, or false for all
 - * other cases.
 - */
 -#define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0)
 -
 -/*
 - * atomic64_dec_and_test - decrement by 1 and test
 - * @v: pointer of type atomic64_t
 - *
 - * Atomically decrements @v by 1 and
 - * returns true if the result is 0, or false for all other
 - * cases.
 - */
 -#define atomic64_dec_and_test(v) (atomic64_sub_return(1, (v)) == 0)
 -
  /*
   * atomic64_dec_if_positive - decrement by 1 if old value positive
   * @v: pointer of type atomic64_t
   */
  #define atomic64_dec_if_positive(v)   atomic64_sub_if_positive(1, v)
  
 -/*
 - * atomic64_inc - increment atomic variable
 - * @v: pointer of type atomic64_t
 - *
 - * Atomically increments @v by 1.
 - */
 -#define atomic64_inc(v) atomic64_add(1, (v))
 -
 -/*
 - * atomic64_dec - decrement and test
 - * @v: pointer of type atomic64_t
 - *
 - * Atomically decrements @v by 1.
 - */
 -#define atomic64_dec(v) atomic64_sub(1, (v))
 -
 -/*
 - * atomic64_add_negative - add and test if negative
 - * @v: pointer of type atomic64_t
 - * @i: integer value to add
 - *
 - * Atomically adds @i to @v and returns true
 - * if the result is negative, or false when
 - * result is greater than or equal to zero.
 - */
 -#define atomic64_add_negative(i, v) (atomic64_add_return(i, (v)) < 0)
 -
  #endif /* CONFIG_64BIT */
  
  #endif /* _ASM_ATOMIC_H */
diff --combined arch/mips/kernel/traps.c
  #include <asm/mmu_context.h>
  #include <asm/types.h>
  #include <asm/stacktrace.h>
+ #include <asm/tlbex.h>
  #include <asm/uasm.h>
  
  extern void check_wait(void);
  extern asmlinkage void rollback_handle_int(void);
  extern asmlinkage void handle_int(void);
- extern u32 handle_tlbl[];
- extern u32 handle_tlbs[];
- extern u32 handle_tlbm[];
  extern asmlinkage void handle_adel(void);
  extern asmlinkage void handle_ades(void);
  extern asmlinkage void handle_ibe(void);
@@@ -351,7 -349,6 +349,7 @@@ static void __show_regs(const struct pt
  void show_regs(struct pt_regs *regs)
  {
        __show_regs((struct pt_regs *)regs);
 +      dump_stack();
  }
  
  void show_registers(struct pt_regs *regs)
@@@ -54,20 -54,44 +54,32 @@@ extern void __chk_io_ptr(const volatil
  
  #ifdef __KERNEL__
  
 -#ifdef __GNUC__
 -#include <linux/compiler-gcc.h>
 -#endif
 -
 -#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
 -#define notrace __attribute__((hotpatch(0,0)))
 -#else
 -#define notrace __attribute__((no_instrument_function))
 -#endif
 -
 -/* Intel compiler defines __GNUC__. So we will overwrite implementations
 - * coming from above header files here
 - */
 -#ifdef __INTEL_COMPILER
 -# include <linux/compiler-intel.h>
 -#endif
 -
 -/* Clang compiler defines __GNUC__. So we will overwrite implementations
 - * coming from above header files here
 - */
 +/* Compiler specific macros. */
  #ifdef __clang__
  #include <linux/compiler-clang.h>
 +#elif defined(__INTEL_COMPILER)
 +#include <linux/compiler-intel.h>
 +#elif defined(__GNUC__)
 +/* The above compilers also define __GNUC__, so order is important here. */
 +#include <linux/compiler-gcc.h>
 +#else
 +#error "Unknown compiler"
  #endif
  
  /*
 - * Generic compiler-dependent macros required for kernel
+  * Some architectures need to provide custom definitions of macros provided
+  * by linux/compiler-*.h, and can do so using asm/compiler.h. We include that
+  * conditionally rather than using an asm-generic wrapper in order to avoid
+  * build failures if any C compilation, which will include this file via an
+  * -include argument in c_flags, occurs prior to the asm-generic wrappers being
+  * generated.
+  */
+ #ifdef CONFIG_HAVE_ARCH_COMPILER_H
+ #include <asm/compiler.h>
+ #endif
+ /*
 + * Generic compiler-independent macros required for kernel
   * build go below this comment. Actual compiler/compiler version
   * specific implementations come from the above header files
   */
@@@ -94,172 -118,169 +106,172 @@@ struct ftrace_likely_data 
        unsigned long                   constant;
  };
  
 +/* Don't. Just don't. */
 +#define __deprecated
 +#define __deprecated_for_modules
 +
  #endif /* __KERNEL__ */
  
  #endif /* __ASSEMBLY__ */
  
 -#ifdef __KERNEL__
  /*
 - * Allow us to mark functions as 'deprecated' and have gcc emit a nice
 - * warning for each use, in hopes of speeding the functions removal.
 - * Usage is:
 - *            int __deprecated foo(void)
 + * The below symbols may be defined for one or more, but not ALL, of the above
 + * compilers. We don't consider that to be an error, so set them to nothing.
 + * For example, some of them are for compiler specific plugins.
   */
 -#ifndef __deprecated
 -# define __deprecated         /* unimplemented */
 -#endif
 -
 -#ifdef MODULE
 -#define __deprecated_for_modules __deprecated
 -#else
 -#define __deprecated_for_modules
 -#endif
 -
 -#ifndef __must_check
 -#define __must_check
 -#endif
 -
 -#ifndef CONFIG_ENABLE_MUST_CHECK
 -#undef __must_check
 -#define __must_check
 -#endif
 -#ifndef CONFIG_ENABLE_WARN_DEPRECATED
 -#undef __deprecated
 -#undef __deprecated_for_modules
 -#define __deprecated
 -#define __deprecated_for_modules
 +#ifndef __designated_init
 +# define __designated_init
  #endif
  
 -#ifndef __malloc
 -#define __malloc
 +#ifndef __latent_entropy
 +# define __latent_entropy
  #endif
  
 -/*
 - * Allow us to avoid 'defined but not used' warnings on functions and data,
 - * as well as force them to be emitted to the assembly file.
 - *
 - * As of gcc 3.4, static functions that are not marked with attribute((used))
 - * may be elided from the assembly file.  As of gcc 3.4, static data not so
 - * marked will not be elided, but this may change in a future gcc version.
 - *
 - * NOTE: Because distributions shipped with a backported unit-at-a-time
 - * compiler in gcc 3.3, we must define __used to be __attribute__((used))
 - * for gcc >=3.3 instead of 3.4.
 - *
 - * In prior versions of gcc, such functions and data would be emitted, but
 - * would be warned about except with attribute((unused)).
 - *
 - * Mark functions that are referenced only in inline assembly as __used so
 - * the code is emitted even though it appears to be unreferenced.
 - */
 -#ifndef __used
 -# define __used                       /* unimplemented */
 +#ifndef __randomize_layout
 +# define __randomize_layout __designated_init
  #endif
  
 -#ifndef __maybe_unused
 -# define __maybe_unused               /* unimplemented */
 +#ifndef __no_randomize_layout
 +# define __no_randomize_layout
  #endif
  
 -#ifndef __always_unused
 -# define __always_unused      /* unimplemented */
 +#ifndef randomized_struct_fields_start
 +# define randomized_struct_fields_start
 +# define randomized_struct_fields_end
  #endif
  
 -#ifndef noinline
 -#define noinline
 +#ifndef __visible
 +#define __visible
  #endif
  
  /*
 - * Rather then using noinline to prevent stack consumption, use
 - * noinline_for_stack instead.  For documentation reasons.
 + * Assume alignment of return value.
   */
 -#define noinline_for_stack noinline
 -
 -#ifndef __always_inline
 -#define __always_inline inline
 +#ifndef __assume_aligned
 +#define __assume_aligned(a, ...)
  #endif
  
 -#endif /* __KERNEL__ */
 +/* Are two types/vars the same type (ignoring qualifiers)? */
 +#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 +
 +/* Is this type a native word size -- useful for atomic operations */
 +#define __native_word(t) \
 +      (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
 +       sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
  
 -/*
 - * From the GCC manual:
 - *
 - * Many functions do not examine any values except their arguments,
 - * and have no effects except the return value.  Basically this is
 - * just slightly more strict class than the `pure' attribute above,
 - * since function is not allowed to read global memory.
 - *
 - * Note that a function that has pointer arguments and examines the
 - * data pointed to must _not_ be declared `const'.  Likewise, a
 - * function that calls a non-`const' function usually must not be
 - * `const'.  It does not make sense for a `const' function to return
 - * `void'.
 - */
  #ifndef __attribute_const__
 -# define __attribute_const__  /* unimplemented */
 +#define __attribute_const__   __attribute__((__const__))
  #endif
  
 -#ifndef __designated_init
 -# define __designated_init
 +#ifndef __noclone
 +#define __noclone
  #endif
  
 -#ifndef __latent_entropy
 -# define __latent_entropy
 +/* Helpers for emitting diagnostics in pragmas. */
 +#ifndef __diag
 +#define __diag(string)
  #endif
  
 -#ifndef __randomize_layout
 -# define __randomize_layout __designated_init
 +#ifndef __diag_GCC
 +#define __diag_GCC(version, severity, string)
  #endif
  
 -#ifndef __no_randomize_layout
 -# define __no_randomize_layout
 -#endif
 +#define __diag_push() __diag(push)
 +#define __diag_pop()  __diag(pop)
  
 -#ifndef randomized_struct_fields_start
 -# define randomized_struct_fields_start
 -# define randomized_struct_fields_end
 -#endif
 +#define __diag_ignore(compiler, version, option, comment) \
 +      __diag_ ## compiler(version, ignore, option)
 +#define __diag_warn(compiler, version, option, comment) \
 +      __diag_ ## compiler(version, warn, option)
 +#define __diag_error(compiler, version, option, comment) \
 +      __diag_ ## compiler(version, error, option)
  
  /*
 - * Tell gcc if a function is cold. The compiler will assume any path
 - * directly leading to the call is unlikely.
 + * From the GCC manual:
 + *
 + * Many functions have no effects except the return value and their
 + * return value depends only on the parameters and/or global
 + * variables.  Such a function can be subject to common subexpression
 + * elimination and loop optimization just as an arithmetic operator
 + * would be.
 + * [...]
   */
 -
 -#ifndef __cold
 -#define __cold
 +#define __pure                        __attribute__((pure))
 +#define __aligned(x)          __attribute__((aligned(x)))
 +#define __aligned_largest     __attribute__((aligned))
 +#define __printf(a, b)                __attribute__((format(printf, a, b)))
 +#define __scanf(a, b)         __attribute__((format(scanf, a, b)))
 +#define __maybe_unused                __attribute__((unused))
 +#define __always_unused               __attribute__((unused))
 +#define __mode(x)             __attribute__((mode(x)))
 +#define __malloc              __attribute__((__malloc__))
 +#define __used                        __attribute__((__used__))
 +#define __noreturn            __attribute__((noreturn))
 +#define __packed              __attribute__((packed))
 +#define __weak                        __attribute__((weak))
 +#define __alias(symbol)               __attribute__((alias(#symbol)))
 +#define __cold                        __attribute__((cold))
 +#define __section(S)          __attribute__((__section__(#S)))
 +
 +
 +#ifdef CONFIG_ENABLE_MUST_CHECK
 +#define __must_check          __attribute__((warn_unused_result))
 +#else
 +#define __must_check
  #endif
  
 -/* Simple shorthand for a section definition */
 -#ifndef __section
 -# define __section(S) __attribute__ ((__section__(#S)))
 +#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
 +#define notrace                       __attribute__((hotpatch(0, 0)))
 +#else
 +#define notrace                       __attribute__((no_instrument_function))
  #endif
  
 -#ifndef __visible
 -#define __visible
 -#endif
 +#define __compiler_offsetof(a, b)     __builtin_offsetof(a, b)
  
 -#ifndef __nostackprotector
 -# define __nostackprotector
 +/*
 + * Feature detection for gnu_inline (gnu89 extern inline semantics). Either
 + * __GNUC_STDC_INLINE__ is defined (not using gnu89 extern inline semantics,
 + * and we opt in to the gnu89 semantics), or __GNUC_STDC_INLINE__ is not
 + * defined so the gnu89 semantics are the default.
 + */
 +#ifdef __GNUC_STDC_INLINE__
 +# define __gnu_inline __attribute__((gnu_inline))
 +#else
 +# define __gnu_inline
  #endif
  
  /*
 - * Assume alignment of return value.
 + * Force always-inline if the user requests it so via the .config.
 + * GCC does not warn about unused static inline functions for
 + * -Wunused-function.  This turns out to avoid the need for complex #ifdef
 + * directives.  Suppress the warning in clang as well by using "unused"
 + * function attribute, which is redundant but not harmful for gcc.
 + * Prefer gnu_inline, so that extern inline functions do not emit an
 + * externally visible function. This makes extern inline behave as per gnu89
 + * semantics rather than c99. This prevents multiple symbol definition errors
 + * of extern inline functions at link time.
 + * A lot of inline functions can cause havoc with function tracing.
   */
 -#ifndef __assume_aligned
 -#define __assume_aligned(a, ...)
 +#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
 +      !defined(CONFIG_OPTIMIZE_INLINING)
 +#define inline \
 +      inline __attribute__((always_inline, unused)) notrace __gnu_inline
 +#else
 +#define inline inline __attribute__((unused)) notrace __gnu_inline
  #endif
  
 +#define __inline__ inline
 +#define __inline inline
 +#define noinline      __attribute__((noinline))
  
 -/* Are two types/vars the same type (ignoring qualifiers)? */
 -#ifndef __same_type
 -# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 +#ifndef __always_inline
 +#define __always_inline inline __attribute__((always_inline))
  #endif
  
 -/* Is this type a native word size -- useful for atomic operations */
 -#ifndef __native_word
 -# define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
 -#endif
 +/*
 + * Rather then using noinline to prevent stack consumption, use
 + * noinline_for_stack instead.  For documentation reasons.
 + */
 +#define noinline_for_stack noinline
  
  #endif /* __LINUX_COMPILER_TYPES_H */