kernel: Update to 3.15.6.
[people/ms/ipfire-3.x.git] / kernel / patches / grsecurity-3.0-3.15.6-201407232200.patch
@@ -1,9 +1,9 @@
 diff --git a/Documentation/dontdiff b/Documentation/dontdiff
-index b89a739..e289b9b 100644
+index 9de9813..1462492 100644
 --- a/Documentation/dontdiff
 +++ b/Documentation/dontdiff
-@@ -2,9 +2,11 @@
- *.aux
+@@ -3,9 +3,11 @@
+ *.bc
  *.bin
  *.bz2
 +*.c.[012]*.*
@@ -14,7 +14,7 @@ index b89a739..e289b9b 100644
  *.dsp
  *.dvi
  *.elf
-@@ -14,6 +16,7 @@
+@@ -15,6 +17,7 @@
  *.gcov
  *.gen.S
  *.gif
@@ -22,7 +22,7 @@ index b89a739..e289b9b 100644
  *.grep
  *.grp
  *.gz
-@@ -48,14 +51,17 @@
+@@ -51,14 +54,17 @@
  *.tab.h
  *.tex
  *.ver
@@ -41,7 +41,7 @@ index b89a739..e289b9b 100644
  .*.d
  .mm
  53c700_d.h
-@@ -69,9 +75,11 @@ Image
+@@ -72,9 +78,11 @@ Image
  Module.markers
  Module.symvers
  PENDING
@@ -53,7 +53,7 @@ index b89a739..e289b9b 100644
  aconf
  af_names.h
  aic7*reg.h*
-@@ -80,6 +88,7 @@ aic7*seq.h*
+@@ -83,6 +91,7 @@ aic7*seq.h*
  aicasm
  aicdb.h*
  altivec*.c
@@ -61,7 +61,7 @@ index b89a739..e289b9b 100644
  asm-offsets.h
  asm_offsets.h
  autoconf.h*
-@@ -92,32 +101,40 @@ bounds.h
+@@ -95,32 +104,40 @@ bounds.h
  bsetup
  btfixupprep
  build
@@ -102,7 +102,7 @@ index b89a739..e289b9b 100644
  fixdep
  flask.h
  fore200e_mkfirm
-@@ -125,12 +142,15 @@ fore200e_pca_fw.c*
+@@ -128,12 +145,15 @@ fore200e_pca_fw.c*
  gconf
  gconf.glade.h
  gen-devlist
@@ -118,7 +118,7 @@ index b89a739..e289b9b 100644
  hpet_example
  hugepage-mmap
  hugepage-shm
-@@ -145,14 +165,14 @@ int32.c
+@@ -148,14 +168,14 @@ int32.c
  int4.c
  int8.c
  kallsyms
@@ -135,7 +135,7 @@ index b89a739..e289b9b 100644
  logo_*.c
  logo_*_clut224.c
  logo_*_mono.c
-@@ -162,14 +182,15 @@ mach-types.h
+@@ -165,14 +185,15 @@ mach-types.h
  machtypes.h
  map
  map_hugetlb
@@ -152,7 +152,7 @@ index b89a739..e289b9b 100644
  mkprep
  mkregtable
  mktables
-@@ -185,6 +206,8 @@ oui.c*
+@@ -188,6 +209,8 @@ oui.c*
  page-types
  parse.c
  parse.h
@@ -161,7 +161,7 @@ index b89a739..e289b9b 100644
  patches*
  pca200e.bin
  pca200e_ecd.bin2
-@@ -194,6 +217,7 @@ perf-archive
+@@ -197,6 +220,7 @@ perf-archive
  piggyback
  piggy.gzip
  piggy.S
@@ -169,7 +169,7 @@ index b89a739..e289b9b 100644
  pnmtologo
  ppc_defs.h*
  pss_boot.h
-@@ -203,7 +227,12 @@ r200_reg_safe.h
+@@ -206,7 +230,12 @@ r200_reg_safe.h
  r300_reg_safe.h
  r420_reg_safe.h
  r600_reg_safe.h
@@ -182,7 +182,7 @@ index b89a739..e289b9b 100644
  relocs
  rlim_names.h
  rn50_reg_safe.h
-@@ -213,8 +242,12 @@ series
+@@ -216,8 +245,12 @@ series
  setup
  setup.bin
  setup.elf
@@ -195,7 +195,7 @@ index b89a739..e289b9b 100644
  split-include
  syscalltab.h
  tables.c
-@@ -224,6 +257,7 @@ tftpboot.img
+@@ -227,6 +260,7 @@ tftpboot.img
  timeconst.h
  times.h*
  trix_boot.h
@@ -203,7 +203,7 @@ index b89a739..e289b9b 100644
  utsrelease.h*
  vdso-syms.lds
  vdso.lds
-@@ -235,13 +269,17 @@ vdso32.lds
+@@ -238,13 +272,17 @@ vdso32.lds
  vdso32.so.dbg
  vdso64.lds
  vdso64.so.dbg
@@ -221,7 +221,7 @@ index b89a739..e289b9b 100644
  vmlinuz
  voffset.h
  vsyscall.lds
-@@ -249,9 +287,12 @@ vsyscall_32.lds
+@@ -252,9 +290,12 @@ vsyscall_32.lds
  wanxlfw.inc
  uImage
  unifdef
@@ -235,10 +235,10 @@ index b89a739..e289b9b 100644
 +zconf.lex.c
  zoffset.h
 diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
-index 7116fda..d8ed6e8 100644
+index 30a8ad0d..2ed9efd 100644
 --- a/Documentation/kernel-parameters.txt
 +++ b/Documentation/kernel-parameters.txt
-@@ -1084,6 +1084,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
+@@ -1103,6 +1103,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        Format: <unsigned int> such that (rxsize & ~0x1fffc0) == 0.
                        Default: 1024
  
@@ -249,7 +249,7 @@ index 7116fda..d8ed6e8 100644
        hashdist=       [KNL,NUMA] Large hashes allocated during boot
                        are distributed across NUMA nodes.  Defaults on
                        for 64-bit NUMA, off otherwise.
-@@ -2080,6 +2084,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
+@@ -2099,6 +2103,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        noexec=on: enable non-executable mappings (default)
                        noexec=off: disable non-executable mappings
  
@@ -260,7 +260,7 @@ index 7116fda..d8ed6e8 100644
        nosmap          [X86]
                        Disable SMAP (Supervisor Mode Access Prevention)
                        even if it is supported by processor.
-@@ -2347,6 +2355,25 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
+@@ -2366,6 +2374,25 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        the specified number of seconds.  This is to be used if
                        your oopses keep scrolling off the screen.
  
@@ -287,10 +287,10 @@ index 7116fda..d8ed6e8 100644
  
        pcd.            [PARIDE]
 diff --git a/Makefile b/Makefile
-index b2f7de8..9e2b63f 100644
+index fefa023..06f4bb4 100644
 --- a/Makefile
 +++ b/Makefile
-@@ -244,8 +244,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
+@@ -245,8 +245,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
  
  HOSTCC       = gcc
  HOSTCXX      = g++
@@ -300,9 +300,9 @@ index b2f7de8..9e2b63f 100644
 +HOSTCFLAGS  += $(call cc-option, -Wno-empty-body)
 +HOSTCXXFLAGS = -O2 -Wall -W -Wno-array-bounds
  
- # Decide whether to build built-in, modular, or both.
- # Normally, just do built-in.
-@@ -423,8 +424,8 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
+ ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
+ HOSTCFLAGS  += -Wno-unused-value -Wno-unused-parameter \
+@@ -438,8 +439,8 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
  # Rules shared between *config targets and build targets
  
  # Basic helpers built in scripts/
@@ -313,7 +313,7 @@ index b2f7de8..9e2b63f 100644
        $(Q)$(MAKE) $(build)=scripts/basic
        $(Q)rm -f .tmp_quiet_recordmcount
  
-@@ -585,6 +586,72 @@ else
+@@ -600,6 +601,72 @@ else
  KBUILD_CFLAGS += -O2
  endif
  
@@ -352,7 +352,7 @@ index b2f7de8..9e2b63f 100644
 +endif
 +COLORIZE_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/colorize_plugin.so
 +ifdef CONFIG_PAX_SIZE_OVERFLOW
-+SIZE_OVERFLOW_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/size_overflow_plugin.so -DSIZE_OVERFLOW_PLUGIN
++SIZE_OVERFLOW_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/size_overflow_plugin/size_overflow_plugin.so -DSIZE_OVERFLOW_PLUGIN
 +endif
 +ifdef CONFIG_PAX_LATENT_ENTROPY
 +LATENT_ENTROPY_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/latent_entropy_plugin.so -DLATENT_ENTROPY_PLUGIN
@@ -386,7 +386,7 @@ index b2f7de8..9e2b63f 100644
  include $(srctree)/arch/$(SRCARCH)/Makefile
  
  ifdef CONFIG_READABLE_ASM
-@@ -779,7 +846,7 @@ export mod_sign_cmd
+@@ -816,7 +883,7 @@ export mod_sign_cmd
  
  
  ifeq ($(KBUILD_EXTMOD),)
@@ -395,7 +395,7 @@ index b2f7de8..9e2b63f 100644
  
  vmlinux-dirs  := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
                     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
-@@ -828,6 +895,8 @@ endif
+@@ -865,6 +932,8 @@ endif
  
  # The actual objects are generated when descending, 
  # make sure no implicit rule kicks in
@@ -404,7 +404,7 @@ index b2f7de8..9e2b63f 100644
  $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
  
  # Handle descending into subdirectories listed in $(vmlinux-dirs)
-@@ -837,7 +906,7 @@ $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
+@@ -874,7 +943,7 @@ $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
  # Error messages still appears in the original language
  
  PHONY += $(vmlinux-dirs)
@@ -413,7 +413,7 @@ index b2f7de8..9e2b63f 100644
        $(Q)$(MAKE) $(build)=$@
  
  define filechk_kernel.release
-@@ -880,10 +949,13 @@ prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
+@@ -917,10 +986,13 @@ prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
  
  archprepare: archheaders archscripts prepare1 scripts_basic
  
@@ -427,7 +427,7 @@ index b2f7de8..9e2b63f 100644
  prepare: prepare0
  
  # Generate some files
-@@ -991,6 +1063,8 @@ all: modules
+@@ -1028,6 +1100,8 @@ all: modules
  #     using awk while concatenating to the final file.
  
  PHONY += modules
@@ -436,7 +436,7 @@ index b2f7de8..9e2b63f 100644
  modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
        $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
        @$(kecho) '  Building modules, stage 2.';
-@@ -1006,7 +1080,7 @@ modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
+@@ -1043,7 +1117,7 @@ modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
  
  # Target to prepare building external modules
  PHONY += modules_prepare
@@ -445,25 +445,28 @@ index b2f7de8..9e2b63f 100644
  
  # Target to install modules
  PHONY += modules_install
-@@ -1072,7 +1146,8 @@ MRPROPER_FILES += .config .config.old .version .old_version $(version_h) \
+@@ -1109,7 +1183,10 @@ MRPROPER_FILES += .config .config.old .version .old_version $(version_h) \
                  Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
                  signing_key.priv signing_key.x509 x509.genkey         \
                  extra_certificates signing_key.x509.keyid             \
--                signing_key.x509.signer
-+                signing_key.x509.signer tools/gcc/size_overflow_hash.h \
+-                signing_key.x509.signer include/linux/version.h
++                signing_key.x509.signer include/linux/version.h       \
++                tools/gcc/size_overflow_plugin/size_overflow_hash_aux.h \
++                tools/gcc/size_overflow_plugin/size_overflow_hash.h \
 +                tools/gcc/randomize_layout_seed.h
  
  # clean - Delete most, but leave enough to build external modules
  #
-@@ -1112,6 +1187,7 @@ distclean: mrproper
+@@ -1148,7 +1225,7 @@ distclean: mrproper
+       @find $(srctree) $(RCS_FIND_IGNORE) \
                \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
                -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
-               -o -name '.*.rej' \
-+              -o -name '.*.rej' -o -name '*.so' \
-               -o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
+-              -o -name '.*.rej' -o -name '*%'  -o -name 'core' \) \
++              -o -name '.*.rej' -o -name '*.so' -o -name '*%' -o -name 'core' \) \
                -type f -print | xargs rm -f
  
-@@ -1273,6 +1349,8 @@ PHONY += $(module-dirs) modules
+@@ -1309,6 +1386,8 @@ PHONY += $(module-dirs) modules
  $(module-dirs): crmodverdir $(objtree)/Module.symvers
        $(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
  
@@ -472,7 +475,7 @@ index b2f7de8..9e2b63f 100644
  modules: $(module-dirs)
        @$(kecho) '  Building modules, stage 2.';
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
-@@ -1412,17 +1490,21 @@ else
+@@ -1448,17 +1527,21 @@ else
          target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
  endif
  
@@ -498,7 +501,7 @@ index b2f7de8..9e2b63f 100644
        $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
  %.symtypes: %.c prepare scripts FORCE
        $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
-@@ -1432,11 +1514,15 @@ endif
+@@ -1468,11 +1551,15 @@ endif
        $(cmd_crmodverdir)
        $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
        $(build)=$(build-dir)
@@ -849,10 +852,10 @@ index 98838a0..b304fb4 100644
                /* Allow reads even for write-only mappings */
                if (!(vma->vm_flags & (VM_READ | VM_WRITE)))
 diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
-index 1594945..adf4001 100644
+index db3c541..a1acc89 100644
 --- a/arch/arm/Kconfig
 +++ b/arch/arm/Kconfig
-@@ -1862,7 +1862,7 @@ config ALIGNMENT_TRAP
+@@ -1877,7 +1877,7 @@ config ALIGNMENT_TRAP
  
  config UACCESS_WITH_MEMCPY
        bool "Use kernel mem{cpy,set}() for {copy_to,clear}_user()"
@@ -861,7 +864,7 @@ index 1594945..adf4001 100644
        default y if CPU_FEROCEON
        help
          Implement faster copy_to_user and clear_user methods for CPU
-@@ -2125,6 +2125,7 @@ config XIP_PHYS_ADDR
+@@ -2141,6 +2141,7 @@ config XIP_PHYS_ADDR
  config KEXEC
        bool "Kexec system call (EXPERIMENTAL)"
        depends on (!SMP || PM_SLEEP_SMP)
@@ -870,7 +873,7 @@ index 1594945..adf4001 100644
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
 diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
-index 62d2cb5..09d45e3 100644
+index 9a92fd7..3502a80 100644
 --- a/arch/arm/include/asm/atomic.h
 +++ b/arch/arm/include/asm/atomic.h
 @@ -18,17 +18,35 @@
@@ -946,8 +949,8 @@ index 62d2cb5..09d45e3 100644
  "1:   ldrex   %0, [%3]\n"
  "     add     %0, %0, %4\n"
  "     strex   %1, %0, [%3]\n"
-@@ -62,6 +110,42 @@ static inline int atomic_add_return(int i, atomic_t *v)
-       smp_mb();
+@@ -63,6 +111,43 @@ static inline int atomic_add_return(int i, atomic_t *v)
+       prefetchw(&v->counter);
  
        __asm__ __volatile__("@ atomic_add_return\n"
 +"1:   ldrex   %1, [%3]\n"
@@ -984,12 +987,13 @@ index 62d2cb5..09d45e3 100644
 +      int result;
 +
 +      smp_mb();
++      prefetchw(&v->counter);
 +
 +      __asm__ __volatile__("@ atomic_add_return_unchecked\n"
  "1:   ldrex   %0, [%3]\n"
  "     add     %0, %0, %4\n"
  "     strex   %1, %0, [%3]\n"
-@@ -83,6 +167,36 @@ static inline void atomic_sub(int i, atomic_t *v)
+@@ -84,6 +169,36 @@ static inline void atomic_sub(int i, atomic_t *v)
  
        prefetchw(&v->counter);
        __asm__ __volatile__("@ atomic_sub\n"
@@ -1026,8 +1030,8 @@ index 62d2cb5..09d45e3 100644
  "1:   ldrex   %0, [%3]\n"
  "     sub     %0, %0, %4\n"
  "     strex   %1, %0, [%3]\n"
-@@ -101,11 +215,25 @@ static inline int atomic_sub_return(int i, atomic_t *v)
-       smp_mb();
+@@ -103,11 +218,25 @@ static inline int atomic_sub_return(int i, atomic_t *v)
+       prefetchw(&v->counter);
  
        __asm__ __volatile__("@ atomic_sub_return\n"
 -"1:   ldrex   %0, [%3]\n"
@@ -1054,7 +1058,35 @@ index 62d2cb5..09d45e3 100644
        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
        : "r" (&v->counter), "Ir" (i)
        : "cc");
-@@ -138,6 +266,28 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
+@@ -152,12 +281,24 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
+       __asm__ __volatile__ ("@ atomic_add_unless\n"
+ "1:   ldrex   %0, [%4]\n"
+ "     teq     %0, %5\n"
+-"     beq     2f\n"
+-"     add     %1, %0, %6\n"
++"     beq     4f\n"
++"     adds    %1, %0, %6\n"
++
++#ifdef CONFIG_PAX_REFCOUNT
++"     bvc     3f\n"
++"2:   bkpt    0xf103\n"
++"3:\n"
++#endif
++
+ "     strex   %2, %1, [%4]\n"
+ "     teq     %2, #0\n"
+ "     bne     1b\n"
+-"2:"
++"4:"
++
++#ifdef CONFIG_PAX_REFCOUNT
++      _ASM_EXTABLE(2b, 4b)
++#endif
++
+       : "=&r" (oldval), "=&r" (newval), "=&r" (tmp), "+Qo" (v->counter)
+       : "r" (&v->counter), "r" (u), "r" (a)
+       : "cc");
+@@ -168,6 +309,28 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
        return oldval;
  }
  
@@ -1083,7 +1115,7 @@ index 62d2cb5..09d45e3 100644
  #else /* ARM_ARCH_6 */
  
  #ifdef CONFIG_SMP
-@@ -156,7 +306,17 @@ static inline int atomic_add_return(int i, atomic_t *v)
+@@ -186,7 +349,17 @@ static inline int atomic_add_return(int i, atomic_t *v)
  
        return val;
  }
@@ -1101,7 +1133,7 @@ index 62d2cb5..09d45e3 100644
  
  static inline int atomic_sub_return(int i, atomic_t *v)
  {
-@@ -171,6 +331,10 @@ static inline int atomic_sub_return(int i, atomic_t *v)
+@@ -201,6 +374,10 @@ static inline int atomic_sub_return(int i, atomic_t *v)
        return val;
  }
  #define atomic_sub(i, v)      (void) atomic_sub_return(i, v)
@@ -1112,7 +1144,7 @@ index 62d2cb5..09d45e3 100644
  
  static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
  {
-@@ -186,9 +350,18 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
+@@ -216,6 +393,11 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
        return ret;
  }
  
@@ -1121,6 +1153,10 @@ index 62d2cb5..09d45e3 100644
 +      return atomic_cmpxchg(v, old, new);
 +}
 +
+ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
+ {
+       int c, old;
+@@ -229,13 +411,33 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
  #endif /* __LINUX_ARM_ARCH__ */
  
  #define atomic_xchg(v, new) (xchg(&((v)->counter), new))
@@ -1129,11 +1165,6 @@ index 62d2cb5..09d45e3 100644
 +      return xchg(&v->counter, new);
 +}
  
- static inline int __atomic_add_unless(atomic_t *v, int a, int u)
- {
-@@ -201,11 +374,27 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
- }
  #define atomic_inc(v)         atomic_add(1, v)
 +static inline void atomic_inc_unchecked(atomic_unchecked_t *v)
 +{
@@ -1159,7 +1190,7 @@ index 62d2cb5..09d45e3 100644
  #define atomic_dec_return(v)    (atomic_sub_return(1, v))
  #define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
  
-@@ -221,6 +410,14 @@ typedef struct {
+@@ -251,6 +453,14 @@ typedef struct {
        long long counter;
  } atomic64_t;
  
@@ -1174,7 +1205,7 @@ index 62d2cb5..09d45e3 100644
  #define ATOMIC64_INIT(i) { (i) }
  
  #ifdef CONFIG_ARM_LPAE
-@@ -237,6 +434,19 @@ static inline long long atomic64_read(const atomic64_t *v)
+@@ -267,6 +477,19 @@ static inline long long atomic64_read(const atomic64_t *v)
        return result;
  }
  
@@ -1194,7 +1225,7 @@ index 62d2cb5..09d45e3 100644
  static inline void atomic64_set(atomic64_t *v, long long i)
  {
        __asm__ __volatile__("@ atomic64_set\n"
-@@ -245,6 +455,15 @@ static inline void atomic64_set(atomic64_t *v, long long i)
+@@ -275,6 +498,15 @@ static inline void atomic64_set(atomic64_t *v, long long i)
        : "r" (&v->counter), "r" (i)
        );
  }
@@ -1210,7 +1241,7 @@ index 62d2cb5..09d45e3 100644
  #else
  static inline long long atomic64_read(const atomic64_t *v)
  {
-@@ -259,6 +478,19 @@ static inline long long atomic64_read(const atomic64_t *v)
+@@ -289,6 +521,19 @@ static inline long long atomic64_read(const atomic64_t *v)
        return result;
  }
  
@@ -1230,7 +1261,7 @@ index 62d2cb5..09d45e3 100644
  static inline void atomic64_set(atomic64_t *v, long long i)
  {
        long long tmp;
-@@ -273,6 +505,21 @@ static inline void atomic64_set(atomic64_t *v, long long i)
+@@ -303,6 +548,21 @@ static inline void atomic64_set(atomic64_t *v, long long i)
        : "r" (&v->counter), "r" (i)
        : "cc");
  }
@@ -1252,7 +1283,7 @@ index 62d2cb5..09d45e3 100644
  #endif
  
  static inline void atomic64_add(long long i, atomic64_t *v)
-@@ -284,6 +531,37 @@ static inline void atomic64_add(long long i, atomic64_t *v)
+@@ -314,6 +574,37 @@ static inline void atomic64_add(long long i, atomic64_t *v)
        __asm__ __volatile__("@ atomic64_add\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
  "     adds    %Q0, %Q0, %Q4\n"
@@ -1290,7 +1321,7 @@ index 62d2cb5..09d45e3 100644
  "     adc     %R0, %R0, %R4\n"
  "     strexd  %1, %0, %H0, [%3]\n"
  "     teq     %1, #0\n"
-@@ -303,6 +581,44 @@ static inline long long atomic64_add_return(long long i, atomic64_t *v)
+@@ -334,6 +625,44 @@ static inline long long atomic64_add_return(long long i, atomic64_t *v)
        __asm__ __volatile__("@ atomic64_add_return\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
  "     adds    %Q0, %Q0, %Q4\n"
@@ -1335,7 +1366,7 @@ index 62d2cb5..09d45e3 100644
  "     adc     %R0, %R0, %R4\n"
  "     strexd  %1, %0, %H0, [%3]\n"
  "     teq     %1, #0\n"
-@@ -325,6 +641,37 @@ static inline void atomic64_sub(long long i, atomic64_t *v)
+@@ -356,6 +685,37 @@ static inline void atomic64_sub(long long i, atomic64_t *v)
        __asm__ __volatile__("@ atomic64_sub\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
  "     subs    %Q0, %Q0, %Q4\n"
@@ -1373,7 +1404,7 @@ index 62d2cb5..09d45e3 100644
  "     sbc     %R0, %R0, %R4\n"
  "     strexd  %1, %0, %H0, [%3]\n"
  "     teq     %1, #0\n"
-@@ -344,16 +691,29 @@ static inline long long atomic64_sub_return(long long i, atomic64_t *v)
+@@ -376,16 +736,29 @@ static inline long long atomic64_sub_return(long long i, atomic64_t *v)
        __asm__ __volatile__("@ atomic64_sub_return\n"
  "1:   ldrexd  %0, %H0, [%3]\n"
  "     subs    %Q0, %Q0, %Q4\n"
@@ -1406,7 +1437,7 @@ index 62d2cb5..09d45e3 100644
        return result;
  }
  
-@@ -382,6 +742,31 @@ static inline long long atomic64_cmpxchg(atomic64_t *ptr, long long old,
+@@ -415,6 +788,31 @@ static inline long long atomic64_cmpxchg(atomic64_t *ptr, long long old,
        return oldval;
  }
  
@@ -1438,7 +1469,7 @@ index 62d2cb5..09d45e3 100644
  static inline long long atomic64_xchg(atomic64_t *ptr, long long new)
  {
        long long result;
-@@ -406,20 +791,34 @@ static inline long long atomic64_xchg(atomic64_t *ptr, long long new)
+@@ -440,21 +838,35 @@ static inline long long atomic64_xchg(atomic64_t *ptr, long long new)
  static inline long long atomic64_dec_if_positive(atomic64_t *v)
  {
        long long result;
@@ -1446,6 +1477,7 @@ index 62d2cb5..09d45e3 100644
 +      u64 tmp;
  
        smp_mb();
+       prefetchw(&v->counter);
  
        __asm__ __volatile__("@ atomic64_dec_if_positive\n"
 -"1:   ldrexd  %0, %H0, [%3]\n"
@@ -1479,7 +1511,7 @@ index 62d2cb5..09d45e3 100644
        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
        : "r" (&v->counter)
        : "cc");
-@@ -442,13 +841,25 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u)
+@@ -478,13 +890,25 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u)
  "     teq     %0, %5\n"
  "     teqeq   %H0, %H5\n"
  "     moveq   %1, #0\n"
@@ -1508,7 +1540,7 @@ index 62d2cb5..09d45e3 100644
        : "=&r" (val), "+r" (ret), "=&r" (tmp), "+Qo" (v->counter)
        : "r" (&v->counter), "r" (u), "r" (a)
        : "cc");
-@@ -461,10 +872,13 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u)
+@@ -497,10 +921,13 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u)
  
  #define atomic64_add_negative(a, v)   (atomic64_add_return((a), (v)) < 0)
  #define atomic64_inc(v)                       atomic64_add(1LL, (v))
@@ -1522,6 +1554,19 @@ index 62d2cb5..09d45e3 100644
  #define atomic64_dec_return(v)                atomic64_sub_return(1LL, (v))
  #define atomic64_dec_and_test(v)      (atomic64_dec_return((v)) == 0)
  #define atomic64_inc_not_zero(v)      atomic64_add_unless((v), 1LL, 0LL)
+diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h
+index 2f59f74..1594659 100644
+--- a/arch/arm/include/asm/barrier.h
++++ b/arch/arm/include/asm/barrier.h
+@@ -63,7 +63,7 @@
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       smp_mb();                                                       \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/arm/include/asm/cache.h b/arch/arm/include/asm/cache.h
 index 75fe66b..ba3dee4 100644
 --- a/arch/arm/include/asm/cache.h
@@ -1584,10 +1629,10 @@ index 5233151..87a71fa 100644
  /*
   *    Fold a partial checksum without adding pseudo headers
 diff --git a/arch/arm/include/asm/cmpxchg.h b/arch/arm/include/asm/cmpxchg.h
-index df2fbba..63fe3e1 100644
+index abb2c37..96db950 100644
 --- a/arch/arm/include/asm/cmpxchg.h
 +++ b/arch/arm/include/asm/cmpxchg.h
-@@ -102,6 +102,8 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size
+@@ -104,6 +104,8 @@ static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size
  
  #define xchg(ptr,x) \
        ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
@@ -1703,19 +1748,19 @@ index de53547..52b9a28 100644
                (unsigned long)(dest_buf) + (size));                    \
                                                                        \
 diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h
-index e42cf59..7b94b8f 100644
+index 53e69da..3fdc896 100644
 --- a/arch/arm/include/asm/futex.h
 +++ b/arch/arm/include/asm/futex.h
-@@ -50,6 +50,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
+@@ -46,6 +46,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
                return -EFAULT;
  
 +      pax_open_userland();
 +
        smp_mb();
-       __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n"
-       "1:     ldrex   %1, [%4]\n"
-@@ -65,6 +67,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
+       /* Prefetching cannot fault */
+       prefetchw(uaddr);
+@@ -63,6 +65,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        : "cc", "memory");
        smp_mb();
  
@@ -1724,7 +1769,7 @@ index e42cf59..7b94b8f 100644
        *uval = val;
        return ret;
  }
-@@ -95,6 +99,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
+@@ -93,6 +97,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
                return -EFAULT;
  
@@ -1733,7 +1778,7 @@ index e42cf59..7b94b8f 100644
        __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n"
        "1:     " TUSER(ldr) "  %1, [%4]\n"
        "       teq     %1, %2\n"
-@@ -105,6 +111,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
+@@ -103,6 +109,8 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT)
        : "cc", "memory");
  
@@ -1742,7 +1787,7 @@ index e42cf59..7b94b8f 100644
        *uval = val;
        return ret;
  }
-@@ -127,6 +135,7 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)
+@@ -125,6 +133,7 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)
                return -EFAULT;
  
        pagefault_disable();    /* implies preempt_disable() */
@@ -1750,7 +1795,7 @@ index e42cf59..7b94b8f 100644
  
        switch (op) {
        case FUTEX_OP_SET:
-@@ -148,6 +157,7 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)
+@@ -146,6 +155,7 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)
                ret = -ENOSYS;
        }
  
@@ -1946,7 +1991,7 @@ index 5cfba15..f415e1a 100644
  #define PTE_EXT_AP0           (_AT(pteval_t, 1) << 4)
  #define PTE_EXT_AP1           (_AT(pteval_t, 2) << 4)
 diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h
-index dfff709..ed4c4e7 100644
+index 219ac88..73ec32a 100644
 --- a/arch/arm/include/asm/pgtable-2level.h
 +++ b/arch/arm/include/asm/pgtable-2level.h
 @@ -126,6 +126,9 @@
@@ -1992,7 +2037,7 @@ index 85c60ad..b0bbd7e 100644
  #define L_PTE_DIRTY_HIGH      (1 << (55 - 32))
  
 diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
-index 7d59b52..27a12f8 100644
+index 5478e5d..f5b5cb3 100644
 --- a/arch/arm/include/asm/pgtable.h
 +++ b/arch/arm/include/asm/pgtable.h
 @@ -33,6 +33,9 @@
@@ -2075,7 +2120,7 @@ index 7d59b52..27a12f8 100644
   */
  #define _L_PTE_DEFAULT        L_PTE_PRESENT | L_PTE_YOUNG
  
-@@ -262,7 +310,7 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
+@@ -265,7 +313,7 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
  static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
  {
        const pteval_t mask = L_PTE_XN | L_PTE_RDONLY | L_PTE_USER |
@@ -2098,20 +2143,20 @@ index c4ae171..ea0c0c2 100644
  extern struct psci_operations psci_ops;
  extern struct smp_operations psci_smp_ops;
 diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h
-index 22a3b9b..7f214ee 100644
+index 2ec765c..beb1fe16 100644
 --- a/arch/arm/include/asm/smp.h
 +++ b/arch/arm/include/asm/smp.h
-@@ -112,7 +112,7 @@ struct smp_operations {
+@@ -113,7 +113,7 @@ struct smp_operations {
        int  (*cpu_disable)(unsigned int cpu);
  #endif
  #endif
 -};
 +} __no_const;
  
- /*
-  * set platform specific SMP operations
+ struct of_cpu_method {
+       const char *method;
 diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
-index 71a06b2..8bb9ae1 100644
+index f989d7c..e8aa7f0 100644
 --- a/arch/arm/include/asm/thread_info.h
 +++ b/arch/arm/include/asm/thread_info.h
 @@ -88,9 +88,9 @@ struct thread_info {
@@ -2127,7 +2172,7 @@ index 71a06b2..8bb9ae1 100644
        .restart_block  = {                                             \
                .fn     = do_no_restart_syscall,                        \
        },                                                              \
-@@ -157,7 +157,11 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
+@@ -158,7 +158,11 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
  #define TIF_SYSCALL_AUDIT     9
  #define TIF_SYSCALL_TRACEPOINT        10
  #define TIF_SECCOMP           11      /* seccomp syscall filtering active */
@@ -2140,7 +2185,7 @@ index 71a06b2..8bb9ae1 100644
  #define TIF_USING_IWMMXT      17
  #define TIF_MEMDIE            18      /* is terminating due to OOM killer */
  #define TIF_RESTORE_SIGMASK   20
-@@ -170,10 +174,11 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
+@@ -172,10 +176,11 @@ extern int vfp_restore_user_hwstate(struct user_vfp __user *,
  #define _TIF_SYSCALL_TRACEPOINT       (1 << TIF_SYSCALL_TRACEPOINT)
  #define _TIF_SECCOMP          (1 << TIF_SECCOMP)
  #define _TIF_USING_IWMMXT     (1 << TIF_USING_IWMMXT)
@@ -2154,7 +2199,7 @@ index 71a06b2..8bb9ae1 100644
  /*
   * Change these and you break ASM code in entry-common.S
 diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
-index 72abdc5..35acac1 100644
+index 75d9579..b5b40e4 100644
 --- a/arch/arm/include/asm/uaccess.h
 +++ b/arch/arm/include/asm/uaccess.h
 @@ -18,6 +18,7 @@
@@ -2163,7 +2208,7 @@ index 72abdc5..35acac1 100644
  #include <asm/compiler.h>
 +#include <asm/pgtable.h>
  
- #if __LINUX_ARM_ARCH__ < 6
+ #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
  #include <asm-generic/uaccess-unaligned.h>
 @@ -70,11 +71,38 @@ extern int __put_user_bad(void);
  static inline void set_fs(mm_segment_t fs)
@@ -2219,7 +2264,7 @@ index 72abdc5..35acac1 100644
         })
  
  extern int __put_user_1(void *, unsigned int);
-@@ -195,8 +227,12 @@ extern int __put_user_8(void *, unsigned long long);
+@@ -196,8 +228,12 @@ extern int __put_user_8(void *, unsigned long long);
  
  #define put_user(x,p)                                                 \
        ({                                                              \
@@ -2233,7 +2278,7 @@ index 72abdc5..35acac1 100644
         })
  
  #else /* CONFIG_MMU */
-@@ -220,6 +256,7 @@ static inline void set_fs(mm_segment_t fs)
+@@ -221,6 +257,7 @@ static inline void set_fs(mm_segment_t fs)
  
  #endif /* CONFIG_MMU */
  
@@ -2241,7 +2286,7 @@ index 72abdc5..35acac1 100644
  #define access_ok(type,addr,size)     (__range_ok(addr,size) == 0)
  
  #define user_addr_max() \
-@@ -237,13 +274,17 @@ static inline void set_fs(mm_segment_t fs)
+@@ -238,13 +275,17 @@ static inline void set_fs(mm_segment_t fs)
  #define __get_user(x,ptr)                                             \
  ({                                                                    \
        long __gu_err = 0;                                              \
@@ -2259,7 +2304,7 @@ index 72abdc5..35acac1 100644
        (void) 0;                                                       \
  })
  
-@@ -319,13 +360,17 @@ do {                                                                     \
+@@ -320,13 +361,17 @@ do {                                                                     \
  #define __put_user(x,ptr)                                             \
  ({                                                                    \
        long __pu_err = 0;                                              \
@@ -2277,7 +2322,7 @@ index 72abdc5..35acac1 100644
        (void) 0;                                                       \
  })
  
-@@ -425,11 +470,44 @@ do {                                                                     \
+@@ -426,11 +471,44 @@ do {                                                                     \
  
  
  #ifdef CONFIG_MMU
@@ -2325,7 +2370,7 @@ index 72abdc5..35acac1 100644
  #else
  #define __copy_from_user(to,from,n)   (memcpy(to, (void __force *)from, n), 0)
  #define __copy_to_user(to,from,n)     (memcpy((void __force *)to, from, n), 0)
-@@ -438,6 +516,9 @@ extern unsigned long __must_check __clear_user_std(void __user *addr, unsigned l
+@@ -439,6 +517,9 @@ extern unsigned long __must_check __clear_user_std(void __user *addr, unsigned l
  
  static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n)
  {
@@ -2335,7 +2380,7 @@ index 72abdc5..35acac1 100644
        if (access_ok(VERIFY_READ, from, n))
                n = __copy_from_user(to, from, n);
        else /* security hole - plug it */
-@@ -447,6 +528,9 @@ static inline unsigned long __must_check copy_from_user(void *to, const void __u
+@@ -448,6 +529,9 @@ static inline unsigned long __must_check copy_from_user(void *to, const void __u
  
  static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n)
  {
@@ -2359,7 +2404,7 @@ index 5af0ed1..cea83883 100644
  #define PSR_ENDIAN_MASK       0x00000200      /* Endianness state mask */
  
 diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c
-index 85e664b..419a1cd 100644
+index f7b450f..f5364c5 100644
 --- a/arch/arm/kernel/armksyms.c
 +++ b/arch/arm/kernel/armksyms.c
 @@ -55,7 +55,7 @@ EXPORT_SYMBOL(arm_delay_ops);
@@ -2385,7 +2430,7 @@ index 85e664b..419a1cd 100644
  EXPORT_SYMBOL(__get_user_1);
  EXPORT_SYMBOL(__get_user_2);
 diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
-index 1879e8d..b2207fc 100644
+index 1879e8d..5602dd4 100644
 --- a/arch/arm/kernel/entry-armv.S
 +++ b/arch/arm/kernel/entry-armv.S
 @@ -47,6 +47,87 @@
@@ -2404,7 +2449,7 @@ index 1879e8d..b2207fc 100644
 +      bic     r2, r2, #(0x1fc0)
 +      bic     r2, r2, #(0x3f)
 +      ldr     r1, [r2, #TI_CPU_DOMAIN]
-+      @ store old DACR on stack 
++      @ store old DACR on stack
 +      str     r1, [sp, #8]
 +#ifdef CONFIG_PAX_KERNEXEC
 +      @ set type of DOMAIN_KERNEL to DOMAIN_KERNELCLIENT
@@ -2649,10 +2694,10 @@ index a2dcafd..1048b5a 100644
  
  #if defined(CONFIG_OABI_COMPAT)
 diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S
-index 39f89fb..d612bd9 100644
+index efb208d..d34bd02 100644
 --- a/arch/arm/kernel/entry-header.S
 +++ b/arch/arm/kernel/entry-header.S
-@@ -184,6 +184,60 @@
+@@ -188,6 +188,60 @@
        msr     cpsr_c, \rtemp                  @ switch back to the SVC mode
        .endm
  
@@ -2713,7 +2758,7 @@ index 39f89fb..d612bd9 100644
  #ifndef CONFIG_THUMB2_KERNEL
        .macro  svc_exit, rpsr, irq = 0
        .if     \irq != 0
-@@ -203,6 +257,9 @@
+@@ -207,6 +261,9 @@
        blne    trace_hardirqs_off
  #endif
        .endif
@@ -2723,7 +2768,7 @@ index 39f89fb..d612bd9 100644
        msr     spsr_cxsf, \rpsr
  #if defined(CONFIG_CPU_V6)
        ldr     r0, [sp]
-@@ -266,6 +323,9 @@
+@@ -265,6 +322,9 @@
        blne    trace_hardirqs_off
  #endif
        .endif
@@ -2749,7 +2794,7 @@ index 918875d..cd5fa27 100644
                flush_icache_range((unsigned long)base + offset, offset +
                                   length);
 diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
-index f5f381d..a6f36a1 100644
+index 591d6e4..8322a26 100644
 --- a/arch/arm/kernel/head.S
 +++ b/arch/arm/kernel/head.S
 @@ -437,7 +437,7 @@ __enable_mmu:
@@ -2828,10 +2873,10 @@ index 07314af..c46655c 100644
        flush_icache_range((uintptr_t)(addr),
                           (uintptr_t)(addr) + size);
 diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
-index 92f7b15..7048500 100644
+index 81ef686..f4130b8 100644
 --- a/arch/arm/kernel/process.c
 +++ b/arch/arm/kernel/process.c
-@@ -217,6 +217,7 @@ void machine_power_off(void)
+@@ -212,6 +212,7 @@ void machine_power_off(void)
  
        if (pm_power_off)
                pm_power_off();
@@ -2839,7 +2884,7 @@ index 92f7b15..7048500 100644
  }
  
  /*
-@@ -230,7 +231,7 @@ void machine_power_off(void)
+@@ -225,7 +226,7 @@ void machine_power_off(void)
   * executing pre-reset code, and using RAM that the primary CPU's code wishes
   * to use. Implementing such co-ordination would be essentially impossible.
   */
@@ -2848,7 +2893,7 @@ index 92f7b15..7048500 100644
  {
        local_irq_disable();
        smp_send_stop();
-@@ -253,8 +254,8 @@ void __show_regs(struct pt_regs *regs)
+@@ -248,8 +249,8 @@ void __show_regs(struct pt_regs *regs)
  
        show_regs_print_info(KERN_DEFAULT);
  
@@ -2940,11 +2985,23 @@ index 4693188..4596c5e 100644
  static int (*invoke_psci_fn)(u32, u32, u32, u32);
  
 diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
-index 0dd3b79..e018f64 100644
+index 0dd3b79..b67388e 100644
 --- a/arch/arm/kernel/ptrace.c
 +++ b/arch/arm/kernel/ptrace.c
-@@ -929,10 +929,19 @@ static int tracehook_report_syscall(struct pt_regs *regs,
-       return current_thread_info()->syscall;
+@@ -908,7 +908,7 @@ enum ptrace_syscall_dir {
+       PTRACE_SYSCALL_EXIT,
+ };
+-static int tracehook_report_syscall(struct pt_regs *regs,
++static void tracehook_report_syscall(struct pt_regs *regs,
+                                   enum ptrace_syscall_dir dir)
+ {
+       unsigned long ip;
+@@ -926,19 +926,29 @@ static int tracehook_report_syscall(struct pt_regs *regs,
+               current_thread_info()->syscall = -1;
+       regs->ARM_ip = ip;
+-      return current_thread_info()->syscall;
  }
  
 +#ifdef CONFIG_GRKERNSEC_SETXID
@@ -2963,13 +3020,22 @@ index 0dd3b79..e018f64 100644
        /* Do the secure computing check first; failures should be fast. */
        if (secure_computing(scno) == -1)
                return -1;
+       if (test_thread_flag(TIF_SYSCALL_TRACE))
+-              scno = tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
++              tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
++
++      scno = current_thread_info()->syscall;
+       if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
+               trace_sys_enter(regs, scno);
 diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
-index 1e8b030..37c3022 100644
+index 50e198c..a8b5f49 100644
 --- a/arch/arm/kernel/setup.c
 +++ b/arch/arm/kernel/setup.c
-@@ -100,21 +100,23 @@ EXPORT_SYMBOL(system_serial_high);
- unsigned int elf_hwcap __read_mostly;
- EXPORT_SYMBOL(elf_hwcap);
+@@ -103,21 +103,23 @@ EXPORT_SYMBOL(elf_hwcap);
+ unsigned int elf_hwcap2 __read_mostly;
+ EXPORT_SYMBOL(elf_hwcap2);
  
 +pteval_t __supported_pte_mask __read_only;
 +pmdval_t __supported_pmd_mask __read_only;
@@ -2996,7 +3062,7 @@ index 1e8b030..37c3022 100644
  EXPORT_SYMBOL(outer_cache);
  #endif
  
-@@ -247,9 +249,13 @@ static int __get_cpu_architecture(void)
+@@ -250,9 +252,13 @@ static int __get_cpu_architecture(void)
                asm("mrc        p15, 0, %0, c0, c1, 4"
                    : "=r" (mmfr0));
                if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
@@ -3013,10 +3079,10 @@ index 1e8b030..37c3022 100644
                        cpu_arch = CPU_ARCH_ARMv6;
                else
 diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
-index 04d6388..5115238 100644
+index bd19834..e4d8c66 100644
 --- a/arch/arm/kernel/signal.c
 +++ b/arch/arm/kernel/signal.c
-@@ -23,8 +23,6 @@
+@@ -24,8 +24,6 @@
  
  extern const unsigned long sigreturn_codes[7];
  
@@ -3025,7 +3091,7 @@ index 04d6388..5115238 100644
  #ifdef CONFIG_CRUNCH
  static int preserve_crunch_context(struct crunch_sigframe __user *frame)
  {
-@@ -395,8 +393,7 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
+@@ -396,8 +394,7 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
                         * except when the MPU has protected the vectors
                         * page from PL0
                         */
@@ -3035,7 +3101,7 @@ index 04d6388..5115238 100644
                } else
  #endif
                {
-@@ -600,33 +597,3 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
+@@ -604,33 +601,3 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
        } while (thread_flags & _TIF_WORK_MASK);
        return 0;
  }
@@ -3070,7 +3136,7 @@ index 04d6388..5115238 100644
 -      return page;
 -}
 diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
-index b7b4c86..47c4f77 100644
+index 7c4fada..8581286 100644
 --- a/arch/arm/kernel/smp.c
 +++ b/arch/arm/kernel/smp.c
 @@ -73,7 +73,7 @@ enum ipi_msg_type {
@@ -3106,7 +3172,7 @@ index 7a3be1d..b00c7de 100644
                         start, end);
                itcm_present = true;
 diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
-index 172ee18..ce4ec3d 100644
+index abd2fc0..895dbb6 100644
 --- a/arch/arm/kernel/traps.c
 +++ b/arch/arm/kernel/traps.c
 @@ -62,7 +62,7 @@ static void dump_mem(const char *, const char *, unsigned long, unsigned long);
@@ -3137,7 +3203,7 @@ index 172ee18..ce4ec3d 100644
        if (signr)
                do_exit(signr);
  }
-@@ -642,7 +647,9 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
+@@ -643,7 +648,9 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
                         * The user helper at 0xffff0fe0 must be used instead.
                         * (see entry-armv.S for details)
                         */
@@ -3147,7 +3213,7 @@ index 172ee18..ce4ec3d 100644
                }
                return 0;
  
-@@ -899,7 +906,11 @@ void __init early_trap_init(void *vectors_base)
+@@ -900,7 +907,11 @@ void __init early_trap_init(void *vectors_base)
        kuser_init(vectors_base);
  
        flush_icache_range(vectors, vectors + PAGE_SIZE * 2);
@@ -3231,7 +3297,7 @@ index 7bcee5c..e2f3249 100644
        __data_loc = .;
  #endif
 diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
-index bd18bb8..87ede26 100644
+index f0e50a0..8d5d36c 100644
 --- a/arch/arm/kvm/arm.c
 +++ b/arch/arm/kvm/arm.c
 @@ -57,7 +57,7 @@ static unsigned long hyp_default_vectors;
@@ -3417,7 +3483,7 @@ index 3e58d71..029817c 100644
        /* See rational for this in __copy_to_user() above. */
        if (n < 64)
 diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c
-index f7ca97b..3d7e719 100644
+index f7a07a5..258e1f7 100644
 --- a/arch/arm/mach-at91/setup.c
 +++ b/arch/arm/mach-at91/setup.c
 @@ -81,7 +81,7 @@ void __init at91_init_sram(int bank, unsigned long base, unsigned int length)
@@ -3430,10 +3496,10 @@ index f7ca97b..3d7e719 100644
        pr_info("AT91: sram at 0x%lx of 0x%x mapped at 0x%lx\n",
                base, length, desc->virtual);
 diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
-index f3407a5..bd4256f 100644
+index 255f33a..507b157 100644
 --- a/arch/arm/mach-kirkwood/common.c
 +++ b/arch/arm/mach-kirkwood/common.c
-@@ -156,7 +156,16 @@ static void clk_gate_fn_disable(struct clk_hw *hw)
+@@ -157,7 +157,16 @@ static void clk_gate_fn_disable(struct clk_hw *hw)
        clk_gate_ops.disable(hw);
  }
  
@@ -3451,7 +3517,7 @@ index f3407a5..bd4256f 100644
  
  static struct clk __init *clk_register_gate_fn(struct device *dev,
                const char *name,
-@@ -190,14 +199,6 @@ static struct clk __init *clk_register_gate_fn(struct device *dev,
+@@ -191,14 +200,6 @@ static struct clk __init *clk_register_gate_fn(struct device *dev,
        gate_fn->fn_en = fn_en;
        gate_fn->fn_dis = fn_dis;
  
@@ -3480,7 +3546,7 @@ index aead77a..a2253fa 100644
  };
  
 diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c
-index ab43755..ccfa231 100644
+index 9fe8c94..c014a4d 100644
 --- a/arch/arm/mach-omap2/gpmc.c
 +++ b/arch/arm/mach-omap2/gpmc.c
 @@ -148,7 +148,6 @@ struct omap3_gpmc_regs {
@@ -3491,7 +3557,7 @@ index ab43755..ccfa231 100644
  static int gpmc_irq_start;
  
  static struct resource        gpmc_mem_root;
-@@ -716,6 +715,18 @@ static void gpmc_irq_noop(struct irq_data *data) { }
+@@ -727,6 +726,18 @@ static void gpmc_irq_noop(struct irq_data *data) { }
  
  static unsigned int gpmc_irq_noop_ret(struct irq_data *data) { return 0; }
  
@@ -3510,7 +3576,7 @@ index ab43755..ccfa231 100644
  static int gpmc_setup_irq(void)
  {
        int i;
-@@ -730,15 +741,6 @@ static int gpmc_setup_irq(void)
+@@ -741,15 +752,6 @@ static int gpmc_setup_irq(void)
                return gpmc_irq_start;
        }
  
@@ -3549,7 +3615,7 @@ index 667915d..2ee1219 100644
        .resume                 = dummy_cpu_resume,
        .scu_prepare            = dummy_scu_prepare,
 diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c
-index 3664562..72f85c6 100644
+index 693fe48..c15ea73 100644
 --- a/arch/arm/mach-omap2/omap-wakeupgen.c
 +++ b/arch/arm/mach-omap2/omap-wakeupgen.c
 @@ -343,7 +343,7 @@ static int irq_cpu_hotplug_notify(struct notifier_block *self,
@@ -3603,7 +3669,7 @@ index 78c02b3..c94109a 100644
  struct omap_device *omap_device_alloc(struct platform_device *pdev,
                                      struct omap_hwmod **ohs, int oh_cnt);
 diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
-index 1f33f5d..b29fa75 100644
+index 66c60fe..c78950d 100644
 --- a/arch/arm/mach-omap2/omap_hwmod.c
 +++ b/arch/arm/mach-omap2/omap_hwmod.c
 @@ -194,10 +194,10 @@ struct omap_hwmod_soc_ops {
@@ -3698,19 +3764,18 @@ index 2dea8b5..6499da2 100644
  extern void ux500_cpu_die(unsigned int cpu);
  
 diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig
-index 1f8fed9..14d7823 100644
+index 5bf7c3c..571e67e 100644
 --- a/arch/arm/mm/Kconfig
 +++ b/arch/arm/mm/Kconfig
-@@ -446,7 +446,7 @@ config CPU_32v5
+@@ -446,6 +446,7 @@ config CPU_32v5
  
  config CPU_32v6
        bool
--      select CPU_USE_DOMAINS if CPU_V6 && MMU
 +      select CPU_USE_DOMAINS if CPU_V6 && MMU && !PAX_KERNEXEC && !PAX_MEMORY_UDEREF
        select TLS_REG_EMUL if !CPU_32v6K && !MMU
  
  config CPU_32v6K
-@@ -601,6 +601,7 @@ config CPU_CP15_MPU
+@@ -600,6 +601,7 @@ config CPU_CP15_MPU
  
  config CPU_USE_DOMAINS
        bool
@@ -3718,7 +3783,7 @@ index 1f8fed9..14d7823 100644
        help
          This option enables or disables the use of domain switching
          via the set_fs() function.
-@@ -800,6 +801,7 @@ config NEED_KUSER_HELPERS
+@@ -799,6 +801,7 @@ config NEED_KUSER_HELPERS
  config KUSER_HELPERS
        bool "Enable kuser helpers in vector page" if !NEED_KUSER_HELPERS
        default y
@@ -3726,7 +3791,7 @@ index 1f8fed9..14d7823 100644
        help
          Warning: disabling this option may break user programs.
  
-@@ -812,7 +814,7 @@ config KUSER_HELPERS
+@@ -811,7 +814,7 @@ config KUSER_HELPERS
          See Documentation/arm/kernel_user_helpers.txt for details.
  
          However, the fixed address nature of these helpers can be used
@@ -4106,7 +4171,7 @@ index cf08bdf..772656c 100644
  unsigned long search_exception_table(unsigned long addr);
  
 diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
-index 804d615..fcec50a 100644
+index 2a77ba8..68e6a7a 100644
 --- a/arch/arm/mm/init.c
 +++ b/arch/arm/mm/init.c
 @@ -30,6 +30,8 @@
@@ -4118,7 +4183,7 @@ index 804d615..fcec50a 100644
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
-@@ -625,7 +627,46 @@ void free_initmem(void)
+@@ -627,7 +629,46 @@ void free_initmem(void)
  {
  #ifdef CONFIG_HAVE_TCM
        extern char __tcm_start, __tcm_end;
@@ -4293,7 +4358,7 @@ index 5e85ed3..b10a7ed 100644
        }
  }
 diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
-index a623cb3..a896d84 100644
+index b68c6b2..f66c492 100644
 --- a/arch/arm/mm/mmu.c
 +++ b/arch/arm/mm/mmu.c
 @@ -39,6 +39,22 @@
@@ -4427,7 +4492,7 @@ index a623cb3..a896d84 100644
                .domain    = DOMAIN_KERNEL,
        },
        [MT_MEMORY_RW_SO] = {
-@@ -524,9 +562,14 @@ static void __init build_mem_type_table(void)
+@@ -534,9 +572,14 @@ static void __init build_mem_type_table(void)
                 * Mark cache clean areas and XIP ROM read only
                 * from SVC mode and no access from userspace.
                 */
@@ -4445,7 +4510,7 @@ index a623cb3..a896d84 100644
  #endif
  
                if (is_smp()) {
-@@ -542,13 +585,17 @@ static void __init build_mem_type_table(void)
+@@ -552,13 +595,17 @@ static void __init build_mem_type_table(void)
                        mem_types[MT_DEVICE_WC].prot_pte |= L_PTE_SHARED;
                        mem_types[MT_DEVICE_CACHED].prot_sect |= PMD_SECT_S;
                        mem_types[MT_DEVICE_CACHED].prot_pte |= L_PTE_SHARED;
@@ -4467,7 +4532,7 @@ index a623cb3..a896d84 100644
                }
        }
  
-@@ -559,15 +606,20 @@ static void __init build_mem_type_table(void)
+@@ -569,15 +616,20 @@ static void __init build_mem_type_table(void)
        if (cpu_arch >= CPU_ARCH_ARMv6) {
                if (cpu_arch >= CPU_ARCH_ARMv7 && (cr & CR_TRE)) {
                        /* Non-cacheable Normal is XCB = 001 */
@@ -4491,7 +4556,7 @@ index a623cb3..a896d84 100644
        }
  
  #ifdef CONFIG_ARM_LPAE
-@@ -583,6 +635,8 @@ static void __init build_mem_type_table(void)
+@@ -593,6 +645,8 @@ static void __init build_mem_type_table(void)
        vecs_pgprot |= PTE_EXT_AF;
  #endif
  
@@ -4500,7 +4565,7 @@ index a623cb3..a896d84 100644
        for (i = 0; i < 16; i++) {
                pteval_t v = pgprot_val(protection_map[i]);
                protection_map[i] = __pgprot(v | user_pgprot);
-@@ -600,21 +654,24 @@ static void __init build_mem_type_table(void)
+@@ -610,21 +664,24 @@ static void __init build_mem_type_table(void)
  
        mem_types[MT_LOW_VECTORS].prot_l1 |= ecc_mask;
        mem_types[MT_HIGH_VECTORS].prot_l1 |= ecc_mask;
@@ -4531,7 +4596,7 @@ index a623cb3..a896d84 100644
                break;
        }
        pr_info("Memory policy: %sData cache %s\n",
-@@ -832,7 +889,7 @@ static void __init create_mapping(struct map_desc *md)
+@@ -842,7 +899,7 @@ static void __init create_mapping(struct map_desc *md)
                return;
        }
  
@@ -4540,7 +4605,7 @@ index a623cb3..a896d84 100644
            md->virtual >= PAGE_OFFSET &&
            (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) {
                printk(KERN_WARNING "BUG: mapping for 0x%08llx"
-@@ -1247,18 +1304,15 @@ void __init arm_mm_memblock_reserve(void)
+@@ -1257,18 +1314,15 @@ void __init arm_mm_memblock_reserve(void)
   * called function.  This means you can't use any function or debugging
   * method which may touch any device, otherwise the kernel _will_ crash.
   */
@@ -4563,7 +4628,7 @@ index a623cb3..a896d84 100644
  
        for (addr = VMALLOC_START; addr; addr += PMD_SIZE)
                pmd_clear(pmd_off_k(addr));
-@@ -1271,7 +1325,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc)
+@@ -1281,7 +1335,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc)
        map.pfn = __phys_to_pfn(CONFIG_XIP_PHYS_ADDR & SECTION_MASK);
        map.virtual = MODULES_VADDR;
        map.length = ((unsigned long)_etext - map.virtual + ~SECTION_MASK) & SECTION_MASK;
@@ -4572,7 +4637,7 @@ index a623cb3..a896d84 100644
        create_mapping(&map);
  #endif
  
-@@ -1282,14 +1336,14 @@ static void __init devicemaps_init(const struct machine_desc *mdesc)
+@@ -1292,14 +1346,14 @@ static void __init devicemaps_init(const struct machine_desc *mdesc)
        map.pfn = __phys_to_pfn(FLUSH_BASE_PHYS);
        map.virtual = FLUSH_BASE;
        map.length = SZ_1M;
@@ -4589,7 +4654,7 @@ index a623cb3..a896d84 100644
        create_mapping(&map);
  #endif
  
-@@ -1298,7 +1352,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc)
+@@ -1308,7 +1362,7 @@ static void __init devicemaps_init(const struct machine_desc *mdesc)
         * location (0xffff0000).  If we aren't using high-vectors, also
         * create a mapping at the low-vectors virtual address.
         */
@@ -4598,7 +4663,7 @@ index a623cb3..a896d84 100644
        map.virtual = 0xffff0000;
        map.length = PAGE_SIZE;
  #ifdef CONFIG_KUSER_HELPERS
-@@ -1355,8 +1409,10 @@ static void __init kmap_init(void)
+@@ -1365,8 +1419,10 @@ static void __init kmap_init(void)
  static void __init map_lowmem(void)
  {
        struct memblock_region *reg;
@@ -4609,7 +4674,7 @@ index a623cb3..a896d84 100644
  
        /* Map all the lowmem memory banks. */
        for_each_memblock(memory, reg) {
-@@ -1369,11 +1425,48 @@ static void __init map_lowmem(void)
+@@ -1379,11 +1435,48 @@ static void __init map_lowmem(void)
                if (start >= end)
                        break;
  
@@ -4659,7 +4724,7 @@ index a623cb3..a896d84 100644
  
                        create_mapping(&map);
                } else {
-@@ -1390,7 +1483,7 @@ static void __init map_lowmem(void)
+@@ -1400,7 +1493,7 @@ static void __init map_lowmem(void)
                        map.pfn = __phys_to_pfn(kernel_x_start);
                        map.virtual = __phys_to_virt(kernel_x_start);
                        map.length = kernel_x_end - kernel_x_start;
@@ -4668,7 +4733,7 @@ index a623cb3..a896d84 100644
  
                        create_mapping(&map);
  
-@@ -1403,6 +1496,7 @@ static void __init map_lowmem(void)
+@@ -1413,6 +1506,7 @@ static void __init map_lowmem(void)
                                create_mapping(&map);
                        }
                }
@@ -4715,8 +4780,21 @@ index ce6d763..cfea917 100644
  
  extern void *samsung_dmadev_get_ops(void);
  extern void *s3c_dma_get_ops(void);
+diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h
+index 66eb764..b529b84 100644
+--- a/arch/arm64/include/asm/barrier.h
++++ b/arch/arm64/include/asm/barrier.h
+@@ -41,7 +41,7 @@
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       smp_mb();                                                       \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h
-index 6c0f684..5faea9d 100644
+index 3bf8f4e..5dd5491 100644
 --- a/arch/arm64/include/asm/uaccess.h
 +++ b/arch/arm64/include/asm/uaccess.h
 @@ -99,6 +99,7 @@ static inline void set_fs(mm_segment_t fs)
@@ -4977,10 +5055,10 @@ index f4ca594..adc72fd6 100644
  #define __cacheline_aligned   __aligned(L1_CACHE_BYTES)
  #define ____cacheline_aligned __aligned(L1_CACHE_BYTES)
 diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
-index 0c8e553..112d734 100644
+index 12c3afe..b1abab2 100644
 --- a/arch/ia64/Kconfig
 +++ b/arch/ia64/Kconfig
-@@ -544,6 +544,7 @@ source "drivers/sn/Kconfig"
+@@ -546,6 +546,7 @@ source "drivers/sn/Kconfig"
  config KEXEC
        bool "kexec system call"
        depends on !IA64_HP_SIM && (!SMP || HOTPLUG_CPU)
@@ -5009,6 +5087,19 @@ index 6e6fe18..a6ae668 100644
  /* Atomic operations are already serializing */
  #define smp_mb__before_atomic_dec()   barrier()
  #define smp_mb__after_atomic_dec()    barrier()
+diff --git a/arch/ia64/include/asm/barrier.h b/arch/ia64/include/asm/barrier.h
+index d0a69aa..142f878 100644
+--- a/arch/ia64/include/asm/barrier.h
++++ b/arch/ia64/include/asm/barrier.h
+@@ -64,7 +64,7 @@
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       barrier();                                                      \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/ia64/include/asm/cache.h b/arch/ia64/include/asm/cache.h
 index 988254a..e1ee885 100644
 --- a/arch/ia64/include/asm/cache.h
@@ -5285,7 +5376,7 @@ index 24603be..948052d 100644
                DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp);
        }
 diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c
-index ab33328..f39506c 100644
+index c39c3cd..3c77738 100644
 --- a/arch/ia64/kernel/palinfo.c
 +++ b/arch/ia64/kernel/palinfo.c
 @@ -980,7 +980,7 @@ static int palinfo_cpu_callback(struct notifier_block *nfb,
@@ -5396,10 +5487,10 @@ index 7225dad..2a7c8256 100644
        /*
         * If for any reason at all we couldn't handle the fault, make
 diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c
-index 68232db..6ca80af 100644
+index 76069c1..c2aa816 100644
 --- a/arch/ia64/mm/hugetlbpage.c
 +++ b/arch/ia64/mm/hugetlbpage.c
-@@ -154,6 +154,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u
+@@ -149,6 +149,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u
                unsigned long pgoff, unsigned long flags)
  {
        struct vm_unmapped_area_info info;
@@ -5407,7 +5498,7 @@ index 68232db..6ca80af 100644
  
        if (len > RGN_MAP_LIMIT)
                return -ENOMEM;
-@@ -177,6 +178,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u
+@@ -172,6 +173,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u
        info.high_limit = HPAGE_REGION_BASE + RGN_MAP_LIMIT;
        info.align_mask = PAGE_MASK & (HPAGE_SIZE - 1);
        info.align_offset = 0;
@@ -5496,11 +5587,24 @@ index 0395c51..5f26031 100644
  
  #define ARCH_DMA_MINALIGN     L1_CACHE_BYTES
  
+diff --git a/arch/metag/include/asm/barrier.h b/arch/metag/include/asm/barrier.h
+index 2d6f0de..de5f5ac 100644
+--- a/arch/metag/include/asm/barrier.h
++++ b/arch/metag/include/asm/barrier.h
+@@ -89,7 +89,7 @@ static inline void fence(void)
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       smp_mb();                                                       \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/metag/mm/hugetlbpage.c b/arch/metag/mm/hugetlbpage.c
-index 0424315..defcca9 100644
+index 3c52fa6..11b2ad8 100644
 --- a/arch/metag/mm/hugetlbpage.c
 +++ b/arch/metag/mm/hugetlbpage.c
-@@ -205,6 +205,7 @@ hugetlb_get_unmapped_area_new_pmd(unsigned long len)
+@@ -200,6 +200,7 @@ hugetlb_get_unmapped_area_new_pmd(unsigned long len)
        info.high_limit = TASK_SIZE;
        info.align_mask = PAGE_MASK & HUGEPT_MASK;
        info.align_offset = 0;
@@ -5527,10 +5631,10 @@ index 4efe96a..60e8699 100644
  #define SMP_CACHE_BYTES       L1_CACHE_BYTES
  
 diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
-index 95fa1f1..56a6fa2 100644
+index 5cd695f..9a24ad0 100644
 --- a/arch/mips/Kconfig
 +++ b/arch/mips/Kconfig
-@@ -2298,6 +2298,7 @@ source "kernel/Kconfig.preempt"
+@@ -2395,6 +2395,7 @@ source "kernel/Kconfig.preempt"
  
  config KEXEC
        bool "Kexec system call"
@@ -5552,7 +5656,7 @@ index 02f2444..506969c 100644
  
  static dma_addr_t octeon_unity_phys_to_dma(struct device *dev, phys_addr_t paddr)
 diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h
-index 7eed2f2..c4e385d 100644
+index e8eb3d5..2e665d1 100644
 --- a/arch/mips/include/asm/atomic.h
 +++ b/arch/mips/include/asm/atomic.h
 @@ -21,15 +21,39 @@
@@ -6458,6 +6562,19 @@ index 7eed2f2..c4e385d 100644
  
  /*
   * atomic64_add_negative - add and test if negative
+diff --git a/arch/mips/include/asm/barrier.h b/arch/mips/include/asm/barrier.h
+index e1aa4e4..670b68b 100644
+--- a/arch/mips/include/asm/barrier.h
++++ b/arch/mips/include/asm/barrier.h
+@@ -184,7 +184,7 @@
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       smp_mb();                                                       \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/mips/include/asm/cache.h b/arch/mips/include/asm/cache.h
 index b4db69f..8f3b093 100644
 --- a/arch/mips/include/asm/cache.h
@@ -6526,7 +6643,7 @@ index 9e8ef59..1139d6b 100644
  /*
   * interrupt-retrigger: NOP for now. This may not be appropriate for all
 diff --git a/arch/mips/include/asm/local.h b/arch/mips/include/asm/local.h
-index d44622c..64990d2 100644
+index 46dfc3c..a16b13a 100644
 --- a/arch/mips/include/asm/local.h
 +++ b/arch/mips/include/asm/local.h
 @@ -12,15 +12,25 @@ typedef struct
@@ -6617,7 +6734,7 @@ index d44622c..64990d2 100644
  
  /**
 diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h
-index 5e08bcc..cfedefc 100644
+index 5699ec3..95def83 100644
 --- a/arch/mips/include/asm/page.h
 +++ b/arch/mips/include/asm/page.h
 @@ -120,7 +120,7 @@ extern void copy_user_highpage(struct page *to, struct page *from,
@@ -6672,27 +6789,30 @@ index 25da651..ae2a259 100644
  
  #endif /* __ASM_SMTC_PROC_H */
 diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h
-index 24846f9..61c49f0 100644
+index d2d961d..a674df0 100644
 --- a/arch/mips/include/asm/thread_info.h
 +++ b/arch/mips/include/asm/thread_info.h
-@@ -116,6 +116,8 @@ static inline struct thread_info *current_thread_info(void)
- #define TIF_LOAD_WATCH                25      /* If set, load watch registers */
- #define TIF_SYSCALL_TRACEPOINT        26      /* syscall tracepoint instrumentation */
- #define TIF_32BIT_FPREGS      27      /* 32-bit floating point registers */
+@@ -105,6 +105,9 @@ static inline struct thread_info *current_thread_info(void)
+ #define TIF_SECCOMP           4       /* secure computing */
+ #define TIF_NOTIFY_RESUME     5       /* callback before returning to user */
+ #define TIF_RESTORE_SIGMASK   9       /* restore signal mask in do_signal() */
 +/* li takes a 32bit immediate */
-+#define TIF_GRSEC_SETXID      29      /* update credentials on syscall entry/exit */
- #define TIF_SYSCALL_TRACE     31      /* syscall trace active */
- #define _TIF_SYSCALL_TRACE    (1<<TIF_SYSCALL_TRACE)
-@@ -134,13 +136,14 @@ static inline struct thread_info *current_thread_info(void)
- #define _TIF_LOAD_WATCH               (1<<TIF_LOAD_WATCH)
- #define _TIF_32BIT_FPREGS     (1<<TIF_32BIT_FPREGS)
++#define TIF_GRSEC_SETXID      10      /* update credentials on syscall entry/exit */
++
+ #define TIF_USEDFPU           16      /* FPU was used by this task this quantum (SMP) */
+ #define TIF_MEMDIE            18      /* is terminating due to OOM killer */
+ #define TIF_NOHZ              19      /* in adaptive nohz mode */
+@@ -138,14 +141,16 @@ static inline struct thread_info *current_thread_info(void)
+ #define _TIF_USEDMSA          (1<<TIF_USEDMSA)
+ #define _TIF_MSA_CTX_LIVE     (1<<TIF_MSA_CTX_LIVE)
  #define _TIF_SYSCALL_TRACEPOINT       (1<<TIF_SYSCALL_TRACEPOINT)
 +#define _TIF_GRSEC_SETXID     (1<<TIF_GRSEC_SETXID)
  
  #define _TIF_WORK_SYSCALL_ENTRY       (_TIF_NOHZ | _TIF_SYSCALL_TRACE |       \
--                               _TIF_SYSCALL_AUDIT | _TIF_SYSCALL_TRACEPOINT)
-+                               _TIF_SYSCALL_AUDIT | _TIF_SYSCALL_TRACEPOINT | _TIF_GRSEC_SETXID)
+                                _TIF_SYSCALL_AUDIT | \
+-                               _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP)
++                               _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \
++                               _TIF_GRSEC_SETXID)
  
  /* work to do in syscall_trace_leave() */
  #define _TIF_WORK_SYSCALL_EXIT        (_TIF_NOHZ | _TIF_SYSCALL_TRACE |       \
@@ -6701,7 +6821,7 @@ index 24846f9..61c49f0 100644
  
  /* work to do on interrupt/exception return */
  #define _TIF_WORK_MASK                \
-@@ -148,7 +151,7 @@ static inline struct thread_info *current_thread_info(void)
+@@ -153,7 +158,7 @@ static inline struct thread_info *current_thread_info(void)
  /* work to do on any return to u-space */
  #define _TIF_ALLWORK_MASK     (_TIF_NOHZ | _TIF_WORK_MASK |           \
                                 _TIF_WORK_SYSCALL_EXIT |               \
@@ -6711,10 +6831,10 @@ index 24846f9..61c49f0 100644
  /*
   * We stash processor id into a COP0 register to retrieve it fast
 diff --git a/arch/mips/include/asm/uaccess.h b/arch/mips/include/asm/uaccess.h
-index f3fa375..3af6637 100644
+index a109510..94ee3f6 100644
 --- a/arch/mips/include/asm/uaccess.h
 +++ b/arch/mips/include/asm/uaccess.h
-@@ -128,6 +128,7 @@ extern u64 __ua_limit;
+@@ -130,6 +130,7 @@ extern u64 __ua_limit;
        __ok == 0;                                                      \
  })
  
@@ -6785,7 +6905,7 @@ index 44a1f79..2bd6aa3 100644
  
  void __init gt641xx_irq_init(void)
 diff --git a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c
-index d1fea7a..45602ea 100644
+index d1fea7a..2e591b0 100644
 --- a/arch/mips/kernel/irq.c
 +++ b/arch/mips/kernel/irq.c
 @@ -77,17 +77,17 @@ void ack_bad_irq(unsigned int irq)
@@ -6809,11 +6929,30 @@ index d1fea7a..45602ea 100644
  }
  
  void __init init_IRQ(void)
+@@ -110,7 +110,10 @@ void __init init_IRQ(void)
+ #endif
+ }
++
+ #ifdef DEBUG_STACKOVERFLOW
++extern void gr_handle_kernel_exploit(void);
++
+ static inline void check_stack_overflow(void)
+ {
+       unsigned long sp;
+@@ -126,6 +129,7 @@ static inline void check_stack_overflow(void)
+               printk("do_IRQ: stack overflow: %ld\n",
+                      sp - sizeof(struct thread_info));
+               dump_stack();
++              gr_handle_kernel_exploit();
+       }
+ }
+ #else
 diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
-index 6ae540e..b7396dc 100644
+index 60e39dc..b4829bf 100644
 --- a/arch/mips/kernel/process.c
 +++ b/arch/mips/kernel/process.c
-@@ -562,15 +562,3 @@ unsigned long get_wchan(struct task_struct *task)
+@@ -579,15 +579,3 @@ unsigned long get_wchan(struct task_struct *task)
  out:
        return pc;
  }
@@ -6830,10 +6969,10 @@ index 6ae540e..b7396dc 100644
 -      return sp & ALMASK;
 -}
 diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c
-index 7da9b76..21578be 100644
+index f639ccd..e4b110d 100644
 --- a/arch/mips/kernel/ptrace.c
 +++ b/arch/mips/kernel/ptrace.c
-@@ -658,6 +658,10 @@ long arch_ptrace(struct task_struct *child, long request,
+@@ -630,6 +630,10 @@ long arch_ptrace(struct task_struct *child, long request,
        return ret;
  }
  
@@ -6844,7 +6983,7 @@ index 7da9b76..21578be 100644
  /*
   * Notification of system call entry/exit
   * - triggered by current->work.syscall_trace
-@@ -674,6 +678,11 @@ asmlinkage void syscall_trace_enter(struct pt_regs *regs)
+@@ -646,6 +650,11 @@ asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall)
            tracehook_report_syscall_entry(regs))
                ret = -1;
  
@@ -6889,7 +7028,7 @@ index 07fc524..b9d7f28 100644
 +      BUG();
  }
 diff --git a/arch/mips/kernel/smtc-proc.c b/arch/mips/kernel/smtc-proc.c
-index c10aa84..9ec2e60 100644
+index 38635a9..3fcd5e0 100644
 --- a/arch/mips/kernel/smtc-proc.c
 +++ b/arch/mips/kernel/smtc-proc.c
 @@ -31,7 +31,7 @@ unsigned long selfipis[NR_CPUS];
@@ -6920,7 +7059,7 @@ index c10aa84..9ec2e60 100644
        proc_create("smtc", 0444, NULL, &smtc_proc_fops);
  }
 diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c
-index dfc1b91..11a2c07 100644
+index c1681d6..9f881d1 100644
 --- a/arch/mips/kernel/smtc.c
 +++ b/arch/mips/kernel/smtc.c
 @@ -1359,7 +1359,7 @@ void smtc_soft_dump(void)
@@ -7002,10 +7141,10 @@ index c24ad5f..9983ab2 100644
        }
        /* Arrange for an interrupt in a short while */
 diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
-index e0b4996..6b43ce7 100644
+index 8119ac2..b229939 100644
 --- a/arch/mips/kernel/traps.c
 +++ b/arch/mips/kernel/traps.c
-@@ -691,7 +691,18 @@ asmlinkage void do_ov(struct pt_regs *regs)
+@@ -695,7 +695,18 @@ asmlinkage void do_ov(struct pt_regs *regs)
        siginfo_t info;
  
        prev_state = exception_enter();
@@ -7592,7 +7731,7 @@ index 50dfafc..b9fc230 100644
        DEBUGP("register_unwind_table(), sect = %d at 0x%p - 0x%p (gp=0x%lx)\n",
               me->arch.unwind_section, table, end, gp);
 diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c
-index b7cadc4..bf4a32d 100644
+index e1ffea2..46ed66e 100644
 --- a/arch/parisc/kernel/sys_parisc.c
 +++ b/arch/parisc/kernel/sys_parisc.c
 @@ -89,6 +89,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
@@ -7616,7 +7755,7 @@ index b7cadc4..bf4a32d 100644
                        addr = COLOR_ALIGN(addr, last_mmap, pgoff);
 @@ -124,6 +129,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
        info.high_limit = mmap_upper_limit();
-       info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0;
+       info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0;
        info.align_offset = shared_align_offset(last_mmap, pgoff);
 +      info.threadstack_offset = offset;
        addr = vm_unmapped_area(&info);
@@ -7643,7 +7782,7 @@ index b7cadc4..bf4a32d 100644
                        addr = COLOR_ALIGN(addr, last_mmap, pgoff);
 @@ -184,6 +195,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
        info.high_limit = mm->mmap_base;
-       info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0;
+       info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0;
        info.align_offset = shared_align_offset(last_mmap, pgoff);
 +      info.threadstack_offset = offset;
        addr = vm_unmapped_area(&info);
@@ -7664,10 +7803,10 @@ index b7cadc4..bf4a32d 100644
                mm->mmap_base = mm->mmap_legacy_base;
                mm->get_unmapped_area = arch_get_unmapped_area;
 diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
-index 1cd1d0c..44ec918 100644
+index 47ee620..1107387 100644
 --- a/arch/parisc/kernel/traps.c
 +++ b/arch/parisc/kernel/traps.c
-@@ -722,9 +722,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
+@@ -726,9 +726,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
  
                        down_read(&current->mm->mmap_sem);
                        vma = find_vma(current->mm,regs->iaoq[0]);
@@ -7679,7 +7818,7 @@ index 1cd1d0c..44ec918 100644
                                fault_space = regs->iasq[0];
  
 diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
-index 9d08c71..e2b4d20 100644
+index 3ca9c11..d163ef7 100644
 --- a/arch/parisc/mm/fault.c
 +++ b/arch/parisc/mm/fault.c
 @@ -15,6 +15,7 @@
@@ -7690,7 +7829,7 @@ index 9d08c71..e2b4d20 100644
  
  #include <asm/uaccess.h>
  #include <asm/traps.h>
-@@ -52,7 +53,7 @@ DEFINE_PER_CPU(struct exception_data, exception_data);
+@@ -50,7 +51,7 @@ int show_unhandled_signals = 1;
  static unsigned long
  parisc_acctyp(unsigned long code, unsigned int inst)
  {
@@ -7699,7 +7838,7 @@ index 9d08c71..e2b4d20 100644
            return VM_EXEC;
  
        switch (inst & 0xf0000000) {
-@@ -138,6 +139,116 @@ parisc_acctyp(unsigned long code, unsigned int inst)
+@@ -136,6 +137,116 @@ parisc_acctyp(unsigned long code, unsigned int inst)
                        }
  #endif
  
@@ -7816,7 +7955,7 @@ index 9d08c71..e2b4d20 100644
  int fixup_exception(struct pt_regs *regs)
  {
        const struct exception_table_entry *fix;
-@@ -210,8 +321,33 @@ retry:
+@@ -234,8 +345,33 @@ retry:
  
  good_area:
  
@@ -7852,10 +7991,10 @@ index 9d08c71..e2b4d20 100644
        /*
         * If for any reason at all we couldn't handle the fault, make
 diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
-index 957bf34..3430cc8 100644
+index c95c4b8..d831f81 100644
 --- a/arch/powerpc/Kconfig
 +++ b/arch/powerpc/Kconfig
-@@ -393,6 +393,7 @@ config PPC64_SUPPORTS_MEMORY_FAILURE
+@@ -397,6 +397,7 @@ config PPC64_SUPPORTS_MEMORY_FAILURE
  config KEXEC
        bool "kexec system call"
        depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP))
@@ -7884,6 +8023,19 @@ index e3b1d41..8e81edf 100644
  #endif /* __powerpc64__ */
  
  #endif /* __KERNEL__ */
+diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h
+index f89da80..7f5b05a 100644
+--- a/arch/powerpc/include/asm/barrier.h
++++ b/arch/powerpc/include/asm/barrier.h
+@@ -73,7 +73,7 @@
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       __lwsync();                                                     \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/powerpc/include/asm/cache.h b/arch/powerpc/include/asm/cache.h
 index ed0afc1..0332825 100644
 --- a/arch/powerpc/include/asm/cache.h
@@ -8144,10 +8296,10 @@ index 4aad413..85d86bf 100644
  #define _PAGE_NO_CACHE        0x020   /* I: cache inhibit */
  #define _PAGE_WRITETHRU       0x040   /* W: cache write-through */
 diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
-index 90c06ec..3517221 100644
+index e5d2e0b..9ac74b1 100644
 --- a/arch/powerpc/include/asm/reg.h
 +++ b/arch/powerpc/include/asm/reg.h
-@@ -248,6 +248,7 @@
+@@ -249,6 +249,7 @@
  #define SPRN_DBCR     0x136   /* e300 Data Breakpoint Control Reg */
  #define SPRN_DSISR    0x012   /* Data Storage Interrupt Status Register */
  #define   DSISR_NOHPTE                0x40000000      /* no translation found */
@@ -8156,7 +8308,7 @@ index 90c06ec..3517221 100644
  #define   DSISR_ISSTORE               0x02000000      /* access was a store */
  #define   DSISR_DABRMATCH     0x00400000      /* hit data breakpoint */
 diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
-index 084e080..9415a3d 100644
+index ff51046..b982dd4 100644
 --- a/arch/powerpc/include/asm/smp.h
 +++ b/arch/powerpc/include/asm/smp.h
 @@ -51,7 +51,7 @@ struct smp_ops_t {
@@ -8387,10 +8539,10 @@ index fcc9a89..07be2bb 100644
                                   irq.o align.o signal_32.o pmc.o vdso.o \
                                   process.o systbl.o idle.o \
 diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
-index 063b65d..7a26e9d 100644
+index c1bee3c..5b42583 100644
 --- a/arch/powerpc/kernel/exceptions-64e.S
 +++ b/arch/powerpc/kernel/exceptions-64e.S
-@@ -771,6 +771,7 @@ storage_fault_common:
+@@ -1010,6 +1010,7 @@ storage_fault_common:
        std     r14,_DAR(r1)
        std     r15,_DSISR(r1)
        addi    r3,r1,STACK_FRAME_OVERHEAD
@@ -8398,7 +8550,7 @@ index 063b65d..7a26e9d 100644
        mr      r4,r14
        mr      r5,r15
        ld      r14,PACA_EXGEN+EX_R14(r13)
-@@ -779,8 +780,7 @@ storage_fault_common:
+@@ -1018,8 +1019,7 @@ storage_fault_common:
        cmpdi   r3,0
        bne-    1f
        b       .ret_from_except_lite
@@ -8409,10 +8561,10 @@ index 063b65d..7a26e9d 100644
        ld      r4,_DAR(r1)
        bl      .bad_page_fault
 diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
-index 38d5073..f00af8d 100644
+index 3afd391..18f9e36 100644
 --- a/arch/powerpc/kernel/exceptions-64s.S
 +++ b/arch/powerpc/kernel/exceptions-64s.S
-@@ -1584,10 +1584,10 @@ handle_page_fault:
+@@ -1587,10 +1587,10 @@ handle_page_fault:
  11:   ld      r4,_DAR(r1)
        ld      r5,_DSISR(r1)
        addi    r3,r1,STACK_FRAME_OVERHEAD
@@ -8424,8 +8576,29 @@ index 38d5073..f00af8d 100644
        mr      r5,r3
        addi    r3,r1,STACK_FRAME_OVERHEAD
        lwz     r4,_DAR(r1)
+diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
+index ca1cd74..6f0241a 100644
+--- a/arch/powerpc/kernel/irq.c
++++ b/arch/powerpc/kernel/irq.c
+@@ -447,6 +447,8 @@ void migrate_irqs(void)
+ }
+ #endif
++extern void gr_handle_kernel_exploit(void);
++
+ static inline void check_stack_overflow(void)
+ {
+ #ifdef CONFIG_DEBUG_STACKOVERFLOW
+@@ -459,6 +461,7 @@ static inline void check_stack_overflow(void)
+               printk("do_IRQ: stack overflow: %ld\n",
+                       sp - sizeof(struct thread_info));
+               dump_stack();
++              gr_handle_kernel_exploit();
+       }
+ #endif
+ }
 diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c
-index 6cff040..74ac5d1 100644
+index 6cff040..74ac5d1b 100644
 --- a/arch/powerpc/kernel/module_32.c
 +++ b/arch/powerpc/kernel/module_32.c
 @@ -161,7 +161,7 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr,
@@ -8467,10 +8640,10 @@ index 6cff040..74ac5d1 100644
                            sechdrs, module);
  #endif
 diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
-index af064d2..ce56147 100644
+index 31d0215..206af70 100644
 --- a/arch/powerpc/kernel/process.c
 +++ b/arch/powerpc/kernel/process.c
-@@ -1009,8 +1009,8 @@ void show_regs(struct pt_regs * regs)
+@@ -1031,8 +1031,8 @@ void show_regs(struct pt_regs * regs)
         * Lookup NIP late so we have the best change of getting the
         * above info out without failing
         */
@@ -8481,7 +8654,7 @@ index af064d2..ce56147 100644
  #endif
        show_stack(current, (unsigned long *) regs->gpr[1]);
        if (!user_mode(regs))
-@@ -1532,10 +1532,10 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
+@@ -1554,10 +1554,10 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
                newsp = stack[0];
                ip = stack[STACK_FRAME_LR_SAVE];
                if (!firstframe || ip != lr) {
@@ -8494,7 +8667,7 @@ index af064d2..ce56147 100644
                                       (void *)current->ret_stack[curr_frame].ret);
                                curr_frame--;
                        }
-@@ -1555,7 +1555,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
+@@ -1577,7 +1577,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
                        struct pt_regs *regs = (struct pt_regs *)
                                (sp + STACK_FRAME_OVERHEAD);
                        lr = regs->link;
@@ -8503,7 +8676,7 @@ index af064d2..ce56147 100644
                               regs->trap, (void *)regs->nip, (void *)lr);
                        firstframe = 1;
                }
-@@ -1591,58 +1591,3 @@ void notrace __ppc64_runlatch_off(void)
+@@ -1613,58 +1613,3 @@ void notrace __ppc64_runlatch_off(void)
        mtspr(SPRN_CTRLT, ctrl);
  }
  #endif /* CONFIG_PPC64 */
@@ -8602,10 +8775,10 @@ index 2e3d2bf..35df241 100644
  
        if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
 diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
-index a67e00a..f71d8c7 100644
+index 4e47db6..6dcc96e 100644
 --- a/arch/powerpc/kernel/signal_32.c
 +++ b/arch/powerpc/kernel/signal_32.c
-@@ -1011,7 +1011,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
+@@ -1013,7 +1013,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
        /* Save user registers on the stack */
        frame = &rt_sf->uc.uc_mcontext;
        addr = frame;
@@ -8615,10 +8788,10 @@ index a67e00a..f71d8c7 100644
                tramp = current->mm->context.vdso_base + vdso32_rt_sigtramp;
        } else {
 diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
-index 8d253c2..405b337 100644
+index d501dc4..e5a0de0 100644
 --- a/arch/powerpc/kernel/signal_64.c
 +++ b/arch/powerpc/kernel/signal_64.c
-@@ -758,7 +758,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
+@@ -760,7 +760,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
        current->thread.fp_state.fpscr = 0;
  
        /* Set up to return from userspace. */
@@ -8628,7 +8801,7 @@ index 8d253c2..405b337 100644
        } else {
                err |= setup_trampoline(__NR_rt_sigreturn, &frame->tramp[0]);
 diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
-index 33cd7a0..d615344 100644
+index 1bd7ca2..9b78c2f 100644
 --- a/arch/powerpc/kernel/traps.c
 +++ b/arch/powerpc/kernel/traps.c
 @@ -142,6 +142,8 @@ static unsigned __kprobes long oops_begin(struct pt_regs *regs)
@@ -8651,7 +8824,7 @@ index 33cd7a0..d615344 100644
  }
  
 diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
-index 094e45c..d82b848 100644
+index ce74c33..0803371 100644
 --- a/arch/powerpc/kernel/vdso.c
 +++ b/arch/powerpc/kernel/vdso.c
 @@ -35,6 +35,7 @@
@@ -8959,10 +9132,10 @@ index 9098692..3d54cd1 100644
        struct spu_context *ctx = vma->vm_file->private_data;
        unsigned long offset = address - vma->vm_start;
 diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h
-index fa9aaf7..3f5d836 100644
+index 1d47061..0714963 100644
 --- a/arch/s390/include/asm/atomic.h
 +++ b/arch/s390/include/asm/atomic.h
-@@ -398,6 +398,16 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v)
+@@ -412,6 +412,16 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v)
  #define atomic64_dec_and_test(_v)     (atomic64_sub_return(1, _v) == 0)
  #define atomic64_inc_not_zero(v)      atomic64_add_unless((v), 1, 0)
  
@@ -8979,6 +9152,19 @@ index fa9aaf7..3f5d836 100644
  #define smp_mb__before_atomic_dec()   smp_mb()
  #define smp_mb__after_atomic_dec()    smp_mb()
  #define smp_mb__before_atomic_inc()   smp_mb()
+diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h
+index 578680f..0eb3b11 100644
+--- a/arch/s390/include/asm/barrier.h
++++ b/arch/s390/include/asm/barrier.h
+@@ -36,7 +36,7 @@
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       barrier();                                                      \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/s390/include/asm/cache.h b/arch/s390/include/asm/cache.h
 index 4d7ccac..d03d0ad 100644
 --- a/arch/s390/include/asm/cache.h
@@ -9039,7 +9225,7 @@ index c4a93d6..4d2a9b4 100644
  
  #endif /* __ASM_EXEC_H */
 diff --git a/arch/s390/include/asm/uaccess.h b/arch/s390/include/asm/uaccess.h
-index 79330af..254cf37 100644
+index 1be64a1..086839d1 100644
 --- a/arch/s390/include/asm/uaccess.h
 +++ b/arch/s390/include/asm/uaccess.h
 @@ -59,6 +59,7 @@ static inline int __range_ok(unsigned long addr, unsigned long size)
@@ -9061,17 +9247,7 @@ index 79330af..254cf37 100644
        return __copy_to_user(to, from, n);
  }
  
-@@ -268,6 +273,9 @@ copy_to_user(void __user *to, const void *from, unsigned long n)
- static inline unsigned long __must_check
- __copy_from_user(void *to, const void __user *from, unsigned long n)
- {
-+      if ((long)n < 0)
-+              return n;
-+
-       return uaccess.copy_from_user(n, from, to);
- }
-@@ -296,10 +304,14 @@ __compiletime_warning("copy_from_user() buffer size is not provably correct")
+@@ -273,10 +278,14 @@ __compiletime_warning("copy_from_user() buffer size is not provably correct")
  static inline unsigned long __must_check
  copy_from_user(void *to, const void __user *from, unsigned long n)
  {
@@ -9582,6 +9758,19 @@ index be56a24..443328f 100644
  }
  
  #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+diff --git a/arch/sparc/include/asm/barrier_64.h b/arch/sparc/include/asm/barrier_64.h
+index b5aad96..99d7465 100644
+--- a/arch/sparc/include/asm/barrier_64.h
++++ b/arch/sparc/include/asm/barrier_64.h
+@@ -57,7 +57,7 @@ do { __asm__ __volatile__("ba,pt     %%xcc, 1f\n\t" \
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       barrier();                                                      \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/sparc/include/asm/cache.h b/arch/sparc/include/asm/cache.h
 index 5bb6991..5c2132e 100644
 --- a/arch/sparc/include/asm/cache.h
@@ -10137,10 +10326,10 @@ index c13c9f2..d572c34 100644
  
        if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
 diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
-index b085311..6f885f7 100644
+index 745a363..b5566b1 100644
 --- a/arch/sparc/kernel/smp_64.c
 +++ b/arch/sparc/kernel/smp_64.c
-@@ -870,8 +870,8 @@ extern unsigned long xcall_flush_dcache_page_cheetah;
+@@ -868,8 +868,8 @@ extern unsigned long xcall_flush_dcache_page_cheetah;
  extern unsigned long xcall_flush_dcache_page_spitfire;
  
  #ifdef CONFIG_DEBUG_DCFLUSH
@@ -10151,7 +10340,7 @@ index b085311..6f885f7 100644
  #endif
  
  static inline void __local_flush_dcache_page(struct page *page)
-@@ -895,7 +895,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
+@@ -893,7 +893,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
                return;
  
  #ifdef CONFIG_DEBUG_DCFLUSH
@@ -10160,7 +10349,7 @@ index b085311..6f885f7 100644
  #endif
  
        this_cpu = get_cpu();
-@@ -919,7 +919,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
+@@ -917,7 +917,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
                        xcall_deliver(data0, __pa(pg_addr),
                                      (u64) pg_addr, cpumask_of(cpu));
  #ifdef CONFIG_DEBUG_DCFLUSH
@@ -10169,7 +10358,7 @@ index b085311..6f885f7 100644
  #endif
                }
        }
-@@ -938,7 +938,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
+@@ -936,7 +936,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
        preempt_disable();
  
  #ifdef CONFIG_DEBUG_DCFLUSH
@@ -10178,7 +10367,7 @@ index b085311..6f885f7 100644
  #endif
        data0 = 0;
        pg_addr = page_address(page);
-@@ -955,7 +955,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
+@@ -953,7 +953,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
                xcall_deliver(data0, __pa(pg_addr),
                              (u64) pg_addr, cpu_online_mask);
  #ifdef CONFIG_DEBUG_DCFLUSH
@@ -10637,10 +10826,10 @@ index 4ced92f..965eeed 100644
  }
  EXPORT_SYMBOL(die_if_kernel);
 diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c
-index 3c1a7cb..73e1923 100644
+index 35ab8b6..9046547 100644
 --- a/arch/sparc/kernel/unaligned_64.c
 +++ b/arch/sparc/kernel/unaligned_64.c
-@@ -289,7 +289,7 @@ static void log_unaligned(struct pt_regs *regs)
+@@ -295,7 +295,7 @@ static void log_unaligned(struct pt_regs *regs)
        static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5);
  
        if (__ratelimit(&ratelimit)) {
@@ -11230,7 +11419,7 @@ index 59dbd46..1dd7f5e 100644
                if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
                        goto bad_area;
 diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c
-index 69bb818..6ca35c8 100644
+index 4ced3fc..234f1e4 100644
 --- a/arch/sparc/mm/fault_64.c
 +++ b/arch/sparc/mm/fault_64.c
 @@ -22,6 +22,9 @@
@@ -11252,7 +11441,7 @@ index 69bb818..6ca35c8 100644
        printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr);
        dump_stack();
        unhandled_fault(regs->tpc, current, regs);
-@@ -271,6 +274,466 @@ static void noinline __kprobes bogus_32bit_fault_address(struct pt_regs *regs,
+@@ -281,6 +284,466 @@ static void noinline __kprobes bogus_32bit_fault_tpc(struct pt_regs *regs)
        show_regs(regs);
  }
  
@@ -11719,7 +11908,7 @@ index 69bb818..6ca35c8 100644
  asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
  {
        enum ctx_state prev_state = exception_enter();
-@@ -344,6 +807,29 @@ retry:
+@@ -352,6 +815,29 @@ retry:
        if (!vma)
                goto bad_area;
  
@@ -11750,7 +11939,7 @@ index 69bb818..6ca35c8 100644
         * load/store/atomic was a write or not, it only says that there
         * was no match.  So in such a case we (carefully) read the
 diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c
-index 9bd9ce8..dc84852 100644
+index d329537..2c3746a 100644
 --- a/arch/sparc/mm/hugetlbpage.c
 +++ b/arch/sparc/mm/hugetlbpage.c
 @@ -25,8 +25,10 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *filp,
@@ -11856,7 +12045,7 @@ index 9bd9ce8..dc84852 100644
  
  pte_t *huge_pte_alloc(struct mm_struct *mm,
 diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
-index eafbc65..5a8070d 100644
+index ed3c969..42fe48d 100644
 --- a/arch/sparc/mm/init_64.c
 +++ b/arch/sparc/mm/init_64.c
 @@ -188,9 +188,9 @@ unsigned long sparc64_kern_sec_context __read_mostly;
@@ -11894,10 +12083,10 @@ index eafbc65..5a8070d 100644
  #endif /* CONFIG_DEBUG_DCFLUSH */
  }
 diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig
-index b3692ce..e4517c9 100644
+index 85258ca..df97c79 100644
 --- a/arch/tile/Kconfig
 +++ b/arch/tile/Kconfig
-@@ -184,6 +184,7 @@ source "kernel/Kconfig.hz"
+@@ -190,6 +190,7 @@ source "kernel/Kconfig.hz"
  
  config KEXEC
        bool "kexec system call"
@@ -11961,10 +12150,10 @@ index b6cde32..c0cb736 100644
        else
                copy_from_user_overflow();
 diff --git a/arch/tile/mm/hugetlbpage.c b/arch/tile/mm/hugetlbpage.c
-index 0cb3bba..7338b2d 100644
+index e514899..f8743c4 100644
 --- a/arch/tile/mm/hugetlbpage.c
 +++ b/arch/tile/mm/hugetlbpage.c
-@@ -212,6 +212,7 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file,
+@@ -207,6 +207,7 @@ static unsigned long hugetlb_get_unmapped_area_bottomup(struct file *file,
        info.high_limit = TASK_SIZE;
        info.align_mask = PAGE_MASK & ~huge_page_mask(h);
        info.align_offset = 0;
@@ -11972,7 +12161,7 @@ index 0cb3bba..7338b2d 100644
        return vm_unmapped_area(&info);
  }
  
-@@ -229,6 +230,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
+@@ -224,6 +225,7 @@ static unsigned long hugetlb_get_unmapped_area_topdown(struct file *file,
        info.high_limit = current->mm->mmap_base;
        info.align_mask = PAGE_MASK & ~huge_page_mask(h);
        info.align_offset = 0;
@@ -12054,7 +12243,7 @@ index 0032f92..cd151e0 100644
  #ifdef CONFIG_64BIT
  #define set_pud(pudptr, pudval) set_64bit((u64 *) (pudptr), pud_val(pudval))
 diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
-index eecc414..48adb87 100644
+index f17bca8..48adb87 100644
 --- a/arch/um/kernel/process.c
 +++ b/arch/um/kernel/process.c
 @@ -356,22 +356,6 @@ int singlestepping(void * t)
@@ -12064,7 +12253,7 @@ index eecc414..48adb87 100644
 -/*
 - * Only x86 and x86_64 have an arch_align_stack().
 - * All other arches have "#define arch_align_stack(x) (x)"
-- * in their asm/system.h
+- * in their asm/exec.h
 - * As this is included in UML from asm-um/system-generic.h,
 - * we can use it to behave as the subarch does.
 - */
@@ -12098,18 +12287,18 @@ index ad8f795..2c7eec6 100644
  /*
   * Memory returned by kmalloc() may be used for DMA, so we must make
 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
-index 0af5250..59f9597 100644
+index 6b8b429..7b21fe4 100644
 --- a/arch/x86/Kconfig
 +++ b/arch/x86/Kconfig
-@@ -126,7 +126,7 @@ config X86
+@@ -127,7 +127,7 @@ config X86
        select RTC_LIB
        select HAVE_DEBUG_STACKOVERFLOW
        select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64
 -      select HAVE_CC_STACKPROTECTOR
 +      select HAVE_CC_STACKPROTECTOR if X86_64 || !PAX_MEMORY_UDEREF
+       select GENERIC_CPU_AUTOPROBE
+       select HAVE_ARCH_AUDITSYSCALL
  
- config INSTRUCTION_DECODER
-       def_bool y
 @@ -251,7 +251,7 @@ config X86_HT
  
  config X86_32_LAZY_GS
@@ -12119,7 +12308,7 @@ index 0af5250..59f9597 100644
  
  config ARCH_HWEIGHT_CFLAGS
        string
-@@ -589,6 +589,7 @@ config SCHED_OMIT_FRAME_POINTER
+@@ -545,6 +545,7 @@ config SCHED_OMIT_FRAME_POINTER
  
  menuconfig HYPERVISOR_GUEST
        bool "Linux guest support"
@@ -12127,25 +12316,23 @@ index 0af5250..59f9597 100644
        ---help---
          Say Y here to enable options for running Linux under various hyper-
          visors. This option enables basic hypervisor detection and platform
-@@ -1111,7 +1112,7 @@ choice
+@@ -1054,6 +1055,7 @@ choice
  
  config NOHIGHMEM
        bool "off"
--      depends on !X86_NUMAQ
-+      depends on !X86_NUMAQ && !(PAX_PAGEEXEC && PAX_ENABLE_PAE)
++      depends on !(PAX_PAGEEXEC && PAX_ENABLE_PAE)
        ---help---
          Linux can use up to 64 Gigabytes of physical memory on x86 systems.
          However, the address space of 32-bit x86 processors is only 4
-@@ -1148,7 +1149,7 @@ config NOHIGHMEM
+@@ -1090,6 +1092,7 @@ config NOHIGHMEM
  
  config HIGHMEM4G
        bool "4GB"
--      depends on !X86_NUMAQ
-+      depends on !X86_NUMAQ && !(PAX_PAGEEXEC && PAX_ENABLE_PAE)
++      depends on !(PAX_PAGEEXEC && PAX_ENABLE_PAE)
        ---help---
          Select this if you have a 32-bit processor and between 1 and 4
          gigabytes of physical RAM.
-@@ -1201,7 +1202,7 @@ config PAGE_OFFSET
+@@ -1142,7 +1145,7 @@ config PAGE_OFFSET
        hex
        default 0xB0000000 if VMSPLIT_3G_OPT
        default 0x80000000 if VMSPLIT_2G
@@ -12154,7 +12341,7 @@ index 0af5250..59f9597 100644
        default 0x40000000 if VMSPLIT_1G
        default 0xC0000000
        depends on X86_32
-@@ -1605,6 +1606,7 @@ source kernel/Kconfig.hz
+@@ -1555,6 +1558,7 @@ source kernel/Kconfig.hz
  
  config KEXEC
        bool "kexec system call"
@@ -12162,7 +12349,7 @@ index 0af5250..59f9597 100644
        ---help---
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
-@@ -1756,7 +1758,9 @@ config X86_NEED_RELOCS
+@@ -1706,7 +1710,9 @@ config X86_NEED_RELOCS
  
  config PHYSICAL_ALIGN
        hex "Alignment value to which kernel should be aligned"
@@ -12173,20 +12360,16 @@ index 0af5250..59f9597 100644
        range 0x2000 0x1000000 if X86_32
        range 0x200000 0x1000000 if X86_64
        ---help---
-@@ -1836,9 +1840,10 @@ config DEBUG_HOTPLUG_CPU0
-         If unsure, say N.
- config COMPAT_VDSO
--      def_bool y
-+      def_bool n
-       prompt "Compat VDSO support"
+@@ -1789,6 +1795,7 @@ config COMPAT_VDSO
+       def_bool n
+       prompt "Disable the 32-bit vDSO (needed for glibc 2.3.3)"
        depends on X86_32 || IA32_EMULATION
 +      depends on !PAX_PAGEEXEC && !PAX_SEGMEXEC && !PAX_KERNEXEC && !PAX_MEMORY_UDEREF
        ---help---
-         Map the 32-bit VDSO to the predictable old-style address too.
+         Certain buggy versions of glibc will crash if they are
+         presented with a 32-bit vDSO that is not mapped at the address
 diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu
-index f3aaf23..a1d3c49 100644
+index 6983314..54ad7e8 100644
 --- a/arch/x86/Kconfig.cpu
 +++ b/arch/x86/Kconfig.cpu
 @@ -319,7 +319,7 @@ config X86_PPRO_FENCE
@@ -12217,10 +12400,10 @@ index f3aaf23..a1d3c49 100644
  config X86_MINIMUM_CPU_FAMILY
        int
 diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
-index 321a52c..3d51a5e 100644
+index 61bd2ad..50b625d 100644
 --- a/arch/x86/Kconfig.debug
 +++ b/arch/x86/Kconfig.debug
-@@ -84,7 +84,7 @@ config X86_PTDUMP
+@@ -93,7 +93,7 @@ config EFI_PGT_DUMP
  config DEBUG_RODATA
        bool "Write protect kernel read-only data structures"
        default y
@@ -12229,7 +12412,7 @@ index 321a52c..3d51a5e 100644
        ---help---
          Mark the kernel read-only data as write-protected in the pagetables,
          in order to catch accidental (and incorrect) writes to such const
-@@ -102,7 +102,7 @@ config DEBUG_RODATA_TEST
+@@ -111,7 +111,7 @@ config DEBUG_RODATA_TEST
  
  config DEBUG_SET_MODULE_RONX
        bool "Set loadable kernel module data as NX and text as RO"
@@ -12239,10 +12422,10 @@ index 321a52c..3d51a5e 100644
          This option helps catch unintended modifications to loadable
          kernel module's text and read-only data. It also prevents execution
 diff --git a/arch/x86/Makefile b/arch/x86/Makefile
-index eeda43a..5a238be 100644
+index 33f71b0..c2cefa2 100644
 --- a/arch/x86/Makefile
 +++ b/arch/x86/Makefile
-@@ -71,14 +71,12 @@ ifeq ($(CONFIG_X86_32),y)
+@@ -71,9 +71,6 @@ ifeq ($(CONFIG_X86_32),y)
          # CPU-specific tuning. Anything which can be shared with UML should go here.
          include $(srctree)/arch/x86/Makefile_32.cpu
          KBUILD_CFLAGS += $(cflags-y)
@@ -12252,14 +12435,8 @@ index eeda43a..5a238be 100644
  else
          BITS := 64
          UTS_MACHINE := x86_64
-         CHECKFLAGS += -D__x86_64__ -m64
-+        biarch := $(call cc-option,-m64)
-         KBUILD_AFLAGS += -m64
-         KBUILD_CFLAGS += -m64
-@@ -111,6 +109,9 @@ else
-         KBUILD_CFLAGS += -maccumulate-outgoing-args
+@@ -114,6 +111,9 @@ else
+         KBUILD_CFLAGS += $(call cc-option,-maccumulate-outgoing-args)
  endif
  
 +# temporary until string.h is fixed
@@ -12268,7 +12445,7 @@ index eeda43a..5a238be 100644
  # Make sure compiler does not have buggy stack-protector support.
  ifdef CONFIG_CC_STACKPROTECTOR
        cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh
-@@ -267,3 +268,12 @@ define archhelp
+@@ -271,3 +271,12 @@ define archhelp
    echo  '                  FDINITRD=file initrd for the booted kernel'
    echo  '  kvmconfig  - Enable additional options for guest kernel support'
  endef
@@ -12282,7 +12459,7 @@ index eeda43a..5a238be 100644
 +archprepare:
 +      $(if $(LDFLAGS_BUILD_ID),,$(error $(OLD_LD)))
 diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
-index 878df7e..a803913 100644
+index dbe8dd2..2f0a98f 100644
 --- a/arch/x86/boot/Makefile
 +++ b/arch/x86/boot/Makefile
 @@ -52,6 +52,9 @@ $(obj)/cpustr.h: $(obj)/mkcpustr FORCE
@@ -12318,7 +12495,7 @@ index 878e4b9..20537ab 100644
  
  #endif /* BOOT_BITOPS_H */
 diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h
-index 50f8c5e..4f84fff 100644
+index bd49ec6..94c7f58 100644
 --- a/arch/x86/boot/boot.h
 +++ b/arch/x86/boot/boot.h
 @@ -84,7 +84,7 @@ static inline void io_delay(void)
@@ -12330,15 +12507,6 @@ index 50f8c5e..4f84fff 100644
        return seg;
  }
  
-@@ -180,7 +180,7 @@ static inline void wrgs32(u32 v, addr_t addr)
- static inline int memcmp(const void *s1, const void *s2, size_t len)
- {
-       u8 diff;
--      asm("repe; cmpsb; setnz %0"
-+      asm volatile("repe; cmpsb; setnz %0"
-           : "=qm" (diff), "+D" (s1), "+S" (s2), "+c" (len));
-       return diff;
- }
 diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
 index 0fcd913..3bb5c42 100644
 --- a/arch/x86/boot/compressed/Makefile
@@ -12396,10 +12564,10 @@ index a53440e..c3dbf1e 100644
  .previous
  
 diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
-index 9116aac..abbcdb1 100644
+index cbed140..5f2ca57 100644
 --- a/arch/x86/boot/compressed/head_32.S
 +++ b/arch/x86/boot/compressed/head_32.S
-@@ -117,10 +117,10 @@ preferred_addr:
+@@ -140,10 +140,10 @@ preferred_addr:
        addl    %eax, %ebx
        notl    %eax
        andl    %eax, %ebx
@@ -12413,7 +12581,7 @@ index 9116aac..abbcdb1 100644
  
        /* Target address to relocate to for decompression */
 diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
-index c5c1ae0..2e76d0e 100644
+index 0d558ee..58f257e 100644
 --- a/arch/x86/boot/compressed/head_64.S
 +++ b/arch/x86/boot/compressed/head_64.S
 @@ -94,10 +94,10 @@ ENTRY(startup_32)
@@ -12429,7 +12597,7 @@ index c5c1ae0..2e76d0e 100644
  1:
  
        /* Target address to relocate to for decompression */
-@@ -271,10 +271,10 @@ preferred_addr:
+@@ -322,10 +322,10 @@ preferred_addr:
        addq    %rax, %rbp
        notq    %rax
        andq    %rax, %rbp
@@ -12442,7 +12610,7 @@ index c5c1ae0..2e76d0e 100644
  1:
  
        /* Target address to relocate to for decompression */
-@@ -366,8 +366,8 @@ gdt:
+@@ -431,8 +431,8 @@ gdt:
        .long   gdt
        .word   0
        .quad   0x0000000000000000      /* NULL descriptor */
@@ -12454,19 +12622,10 @@ index c5c1ae0..2e76d0e 100644
        .quad   0x0000000000000000      /* TS continued */
  gdt_end:
 diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
-index 196eaf3..c96716d 100644
+index 57ab74d..7c52182 100644
 --- a/arch/x86/boot/compressed/misc.c
 +++ b/arch/x86/boot/compressed/misc.c
-@@ -218,7 +218,7 @@ void __putstr(const char *s)
- void *memset(void *s, int c, size_t n)
- {
--      int i;
-+      size_t i;
-       char *ss = s;
-       for (i = 0; i < n; i++)
-@@ -277,7 +277,7 @@ static void handle_relocations(void *output, unsigned long output_len)
+@@ -242,7 +242,7 @@ static void handle_relocations(void *output, unsigned long output_len)
         * Calculate the delta between where vmlinux was linked to load
         * and where it was actually loaded.
         */
@@ -12475,7 +12634,7 @@ index 196eaf3..c96716d 100644
        if (!delta) {
                debug_putstr("No relocation needed... ");
                return;
-@@ -347,7 +347,7 @@ static void parse_elf(void *output)
+@@ -312,7 +312,7 @@ static void parse_elf(void *output)
        Elf32_Ehdr ehdr;
        Elf32_Phdr *phdrs, *phdr;
  #endif
@@ -12484,7 +12643,7 @@ index 196eaf3..c96716d 100644
        int i;
  
        memcpy(&ehdr, output, sizeof(ehdr));
-@@ -374,13 +374,16 @@ static void parse_elf(void *output)
+@@ -339,13 +339,16 @@ static void parse_elf(void *output)
                case PT_LOAD:
  #ifdef CONFIG_RELOCATABLE
                        dest = output;
@@ -12502,7 +12661,7 @@ index 196eaf3..c96716d 100644
                        break;
                default: /* Ignore other PT_* */ break;
                }
-@@ -430,7 +433,7 @@ asmlinkage void *decompress_kernel(void *rmode, memptr heap,
+@@ -395,7 +398,7 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap,
                error("Destination address too large");
  #endif
  #ifndef CONFIG_RELOCATABLE
@@ -12512,10 +12671,10 @@ index 196eaf3..c96716d 100644
  #endif
  
 diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c
-index 100a9a1..bb3bdb0 100644
+index 1fd7d57..0f7d096 100644
 --- a/arch/x86/boot/cpucheck.c
 +++ b/arch/x86/boot/cpucheck.c
-@@ -117,9 +117,9 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
+@@ -125,9 +125,9 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
                u32 ecx = MSR_K7_HWCR;
                u32 eax, edx;
  
@@ -12527,7 +12686,7 @@ index 100a9a1..bb3bdb0 100644
  
                get_cpuflags(); /* Make sure it really did something */
                err = check_cpuflags();
-@@ -132,9 +132,9 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
+@@ -140,9 +140,9 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
                u32 ecx = MSR_VIA_FCR;
                u32 eax, edx;
  
@@ -12539,7 +12698,7 @@ index 100a9a1..bb3bdb0 100644
  
                set_bit(X86_FEATURE_CX8, cpu.flags);
                err = check_cpuflags();
-@@ -145,12 +145,12 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
+@@ -153,12 +153,12 @@ int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr)
                u32 eax, edx;
                u32 level = 1;
  
@@ -12555,12 +12714,12 @@ index 100a9a1..bb3bdb0 100644
 +              asm volatile("wrmsr" : : "a" (eax), "d" (edx), "c" (ecx));
  
                err = check_cpuflags();
-       }
+       } else if (err == 0x01 &&
 diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
-index ec3b8ba..6a0db1f 100644
+index 84c2234..3ef6360 100644
 --- a/arch/x86/boot/header.S
 +++ b/arch/x86/boot/header.S
-@@ -416,10 +416,14 @@ setup_data:              .quad 0                 # 64-bit physical pointer to
+@@ -420,10 +420,14 @@ setup_data:              .quad 0                 # 64-bit physical pointer to
                                                # single linked list of
                                                # struct setup_data
  
@@ -12590,10 +12749,10 @@ index db75d07..8e6d0af 100644
        struct e820entry *desc = boot_params.e820_map;
        static struct e820entry buf; /* static so it is zeroed */
 diff --git a/arch/x86/boot/video-vesa.c b/arch/x86/boot/video-vesa.c
-index 11e8c6e..fdbb1ed 100644
+index ba3e100..6501b8f 100644
 --- a/arch/x86/boot/video-vesa.c
 +++ b/arch/x86/boot/video-vesa.c
-@@ -200,6 +200,7 @@ static void vesa_store_pm_info(void)
+@@ -201,6 +201,7 @@ static void vesa_store_pm_info(void)
  
        boot_params.screen_info.vesapm_seg = oreg.es;
        boot_params.screen_info.vesapm_off = oreg.di;
@@ -14255,7 +14414,7 @@ index 2206757..85cbcfa 100644
  
        err |= copy_siginfo_to_user32(&frame->info, &ksig->info);
 diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
-index 4299eb0..c0687a7 100644
+index 4299eb0..fefe70e 100644
 --- a/arch/x86/ia32/ia32entry.S
 +++ b/arch/x86/ia32/ia32entry.S
 @@ -15,8 +15,10 @@
@@ -14406,7 +14565,7 @@ index 4299eb0..c0687a7 100644
        /* clear IF, that popfq doesn't enable interrupts early */
 -      andl  $~0x200,EFLAGS-R11(%rsp) 
 -      movl    RIP-R11(%rsp),%edx              /* User %eip */
-+      andl  $~X86_EFLAGS_IF,EFLAGS(%rsp) 
++      andl  $~X86_EFLAGS_IF,EFLAGS(%rsp)
 +      movl    RIP(%rsp),%edx          /* User %eip */
        CFI_REGISTER rip,rdx
        RESTORE_ARGS 0,24,0,0,0,0
@@ -14700,7 +14859,7 @@ index 0a3f9c9..c9d081d 100644
        ALTINSTR_REPLACEMENT(newinstr2, feature2, 2)                    \
        ".popsection"
 diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
-index 1d2091a..f5074c1 100644
+index 19b0eba..12254cd 100644
 --- a/arch/x86/include/asm/apic.h
 +++ b/arch/x86/include/asm/apic.h
 @@ -45,7 +45,7 @@ static inline void generic_apic_probe(void)
@@ -15574,8 +15733,30 @@ index 46e9052..ae45136 100644
  }
  
  #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h
+index 69bbb48..32517fe 100644
+--- a/arch/x86/include/asm/barrier.h
++++ b/arch/x86/include/asm/barrier.h
+@@ -107,7 +107,7 @@
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       smp_mb();                                                       \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
+@@ -124,7 +124,7 @@ do {                                                                       \
+ do {                                                                  \
+       compiletime_assert_atomic_type(*p);                             \
+       barrier();                                                      \
+-      ACCESS_ONCE(*p) = (v);                                          \
++      ACCESS_ONCE_RW(*p) = (v);                                       \
+ } while (0)
+ #define smp_load_acquire(p)                                           \
 diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h
-index 9fc1af7..fc71228 100644
+index 9fc1af7..776d75a 100644
 --- a/arch/x86/include/asm/bitops.h
 +++ b/arch/x86/include/asm/bitops.h
 @@ -49,7 +49,7 @@
@@ -15655,7 +15836,7 @@ index 9fc1af7..fc71228 100644
   */
  #ifdef CONFIG_X86_64
 -static __always_inline int fls64(__u64 x)
-+static __always_inline long fls64(__u64 x)
++static __always_inline __intentional_overflow(-1) int fls64(__u64 x)
  {
        int bitpos = -1;
        /*
@@ -16002,7 +16183,7 @@ index 59c6c40..5e0b22c 100644
  struct compat_timespec {
        compat_time_t   tv_sec;
 diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
-index e099f95..5aa0fb2 100644
+index e265ff9..72c253b 100644
 --- a/arch/x86/include/asm/cpufeature.h
 +++ b/arch/x86/include/asm/cpufeature.h
 @@ -203,7 +203,7 @@
@@ -16023,7 +16204,7 @@ index e099f95..5aa0fb2 100644
  #define X86_FEATURE_BMI2      (9*32+ 8) /* 2nd group bit manipulation extensions */
  #define X86_FEATURE_ERMS      (9*32+ 9) /* Enhanced REP MOVSB/STOSB */
  #define X86_FEATURE_INVPCID   (9*32+10) /* Invalidate Processor Context ID */
-@@ -354,6 +354,7 @@ extern const char * const x86_power_flags[32];
+@@ -359,6 +359,7 @@ extern const char * const x86_power_flags[32];
  #undef  cpu_has_centaur_mcr
  #define cpu_has_centaur_mcr   0
  
@@ -16031,7 +16212,7 @@ index e099f95..5aa0fb2 100644
  #endif /* CONFIG_X86_64 */
  
  #if __GNUC__ >= 4
-@@ -406,7 +407,8 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
+@@ -411,7 +412,8 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
  
  #ifdef CONFIG_X86_DEBUG_STATIC_CPU_HAS
        t_warn:
@@ -16041,7 +16222,7 @@ index e099f95..5aa0fb2 100644
                return false;
  #endif
  
-@@ -426,7 +428,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
+@@ -431,7 +433,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
                             ".section .discard,\"aw\",@progbits\n"
                             " .byte 0xff + (4f-3f) - (2b-1b)\n" /* size check */
                             ".previous\n"
@@ -16050,7 +16231,7 @@ index e099f95..5aa0fb2 100644
                             "3: movb $1,%0\n"
                             "4:\n"
                             ".previous\n"
-@@ -463,7 +465,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
+@@ -468,7 +470,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
                         " .byte 2b - 1b\n"             /* src len */
                         " .byte 4f - 3f\n"             /* repl len */
                         ".previous\n"
@@ -16059,7 +16240,7 @@ index e099f95..5aa0fb2 100644
                         "3: .byte 0xe9\n .long %l[t_no] - 2b\n"
                         "4:\n"
                         ".previous\n"
-@@ -496,7 +498,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
+@@ -501,7 +503,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
                             ".section .discard,\"aw\",@progbits\n"
                             " .byte 0xff + (4f-3f) - (2b-1b)\n" /* size check */
                             ".previous\n"
@@ -16068,7 +16249,7 @@ index e099f95..5aa0fb2 100644
                             "3: movb $0,%0\n"
                             "4:\n"
                             ".previous\n"
-@@ -510,7 +512,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
+@@ -515,7 +517,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
                             ".section .discard,\"aw\",@progbits\n"
                             " .byte 0xff + (6f-5f) - (4b-3b)\n" /* size check */
                             ".previous\n"
@@ -16336,7 +16517,7 @@ index ced283a..ffe04cc 100644
        union {
                u64 v64;
 diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
-index 9c999c1..3860cb8 100644
+index 2c71182..731124d 100644
 --- a/arch/x86/include/asm/elf.h
 +++ b/arch/x86/include/asm/elf.h
 @@ -243,7 +243,25 @@ extern int force_personality32;
@@ -16365,7 +16546,7 @@ index 9c999c1..3860cb8 100644
  
  /* This yields a mask that user programs can use to figure out what
     instruction set this CPU supports.  This could be done in user space,
-@@ -296,16 +314,12 @@ do {                                                                     \
+@@ -292,16 +310,12 @@ do {                                                                     \
  
  #define ARCH_DLINFO                                                   \
  do {                                                                  \
@@ -16384,7 +16565,7 @@ index 9c999c1..3860cb8 100644
  } while (0)
  
  #define AT_SYSINFO            32
-@@ -320,7 +334,7 @@ else                                                                       \
+@@ -316,7 +330,7 @@ else                                                                       \
  
  #endif /* !CONFIG_X86_32 */
  
@@ -16393,7 +16574,7 @@ index 9c999c1..3860cb8 100644
  
  #define VDSO_ENTRY                                                    \
        ((unsigned long)VDSO32_SYMBOL(VDSO_CURRENT_BASE, vsyscall))
-@@ -336,9 +350,6 @@ extern int x32_setup_additional_pages(struct linux_binprm *bprm,
+@@ -332,9 +346,6 @@ extern int x32_setup_additional_pages(struct linux_binprm *bprm,
  extern int syscall32_setup_pages(struct linux_binprm *, int exstack);
  #define compat_arch_setup_additional_pages    syscall32_setup_pages
  
@@ -16416,7 +16597,7 @@ index 77a99ac..39ff7f5 100644
  
  #endif /* _ASM_X86_EMERGENCY_RESTART_H */
 diff --git a/arch/x86/include/asm/floppy.h b/arch/x86/include/asm/floppy.h
-index d3d7469..677ef72 100644
+index 1c7eefe..d0e4702 100644
 --- a/arch/x86/include/asm/floppy.h
 +++ b/arch/x86/include/asm/floppy.h
 @@ -229,18 +229,18 @@ static struct fd_routine_l {
@@ -16547,10 +16728,10 @@ index b4c1f54..e290c08 100644
        pagefault_enable();
  
 diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
-index 67d69b8..50e4b77 100644
+index a307b75..ec74ca2 100644
 --- a/arch/x86/include/asm/hw_irq.h
 +++ b/arch/x86/include/asm/hw_irq.h
-@@ -165,8 +165,8 @@ extern void setup_ioapic_dest(void);
+@@ -164,8 +164,8 @@ extern void setup_ioapic_dest(void);
  extern void enable_IO_APIC(void);
  
  /* Statistics */
@@ -16575,10 +16756,10 @@ index a203659..9889f1c 100644
  extern struct legacy_pic *legacy_pic;
  extern struct legacy_pic null_legacy_pic;
 diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
-index 91d9c69..dfae7d0 100644
+index b8237d8..3e8864e 100644
 --- a/arch/x86/include/asm/io.h
 +++ b/arch/x86/include/asm/io.h
-@@ -51,12 +51,12 @@ static inline void name(type val, volatile void __iomem *addr) \
+@@ -52,12 +52,12 @@ static inline void name(type val, volatile void __iomem *addr) \
  "m" (*(volatile type __force *)addr) barrier); }
  
  build_mmio_read(readb, "b", unsigned char, "=q", :"memory")
@@ -16595,7 +16776,16 @@ index 91d9c69..dfae7d0 100644
  
  build_mmio_write(writeb, "b", unsigned char, "q", :"memory")
  build_mmio_write(writew, "w", unsigned short, "r", :"memory")
-@@ -184,7 +184,7 @@ static inline void __iomem *ioremap(resource_size_t offset, unsigned long size)
+@@ -109,7 +109,7 @@ build_mmio_write(writeq, "q", unsigned long, "r", :"memory")
+  *    this function
+  */
+-static inline phys_addr_t virt_to_phys(volatile void *address)
++static inline phys_addr_t __intentional_overflow(-1) virt_to_phys(volatile void *address)
+ {
+       return __pa(address);
+ }
+@@ -185,7 +185,7 @@ static inline void __iomem *ioremap(resource_size_t offset, unsigned long size)
        return ioremap_nocache(offset, size);
  }
  
@@ -16604,7 +16794,7 @@ index 91d9c69..dfae7d0 100644
  
  extern void set_iounmap_nonlazy(void);
  
-@@ -194,6 +194,17 @@ extern void set_iounmap_nonlazy(void);
+@@ -195,6 +195,17 @@ extern void set_iounmap_nonlazy(void);
  
  #include <linux/vmalloc.h>
  
@@ -17115,24 +17305,42 @@ index e3b7819..b257c64 100644
 +
  #endif /* _ASM_X86_MODULE_H */
 diff --git a/arch/x86/include/asm/nmi.h b/arch/x86/include/asm/nmi.h
-index 86f9301..b365cda 100644
+index 5f2fc44..106caa6 100644
 --- a/arch/x86/include/asm/nmi.h
 +++ b/arch/x86/include/asm/nmi.h
-@@ -40,11 +40,11 @@ struct nmiaction {
+@@ -36,26 +36,35 @@ enum {
+ typedef int (*nmi_handler_t)(unsigned int, struct pt_regs *);
++struct nmiaction;
++
++struct nmiwork {
++      const struct nmiaction  *action;
++      u64                     max_duration;
++      struct irq_work         irq_work;
++};
++
+ struct nmiaction {
+       struct list_head        list;
        nmi_handler_t           handler;
+-      u64                     max_duration;
+-      struct irq_work         irq_work;
        unsigned long           flags;
        const char              *name;
 -};
++      struct nmiwork          *work;
 +} __do_const;
  
  #define register_nmi_handler(t, fn, fg, n, init...)   \
  ({                                                    \
 -      static struct nmiaction init fn##_na = {        \
++      static struct nmiwork fn##_nw;                  \
 +      static const struct nmiaction init fn##_na = {  \
                .handler = (fn),                        \
                .name = (n),                            \
                .flags = (fg),                          \
-@@ -52,7 +52,7 @@ struct nmiaction {
++              .work = &fn##_nw,                       \
+       };                                              \
        __register_nmi_handler((t), &fn##_na);          \
  })
  
@@ -17142,7 +17350,7 @@ index 86f9301..b365cda 100644
  void unregister_nmi_handler(unsigned int, const char *);
  
 diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h
-index 775873d..de5f0304 100644
+index 775873d..04cd306 100644
 --- a/arch/x86/include/asm/page.h
 +++ b/arch/x86/include/asm/page.h
 @@ -52,6 +52,7 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
@@ -17153,6 +17361,29 @@ index 775873d..de5f0304 100644
  
  #define __boot_va(x)          __va(x)
  #define __boot_pa(x)          __pa(x)
+@@ -60,11 +61,21 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
+  * virt_to_page(kaddr) returns a valid pointer if and only if
+  * virt_addr_valid(kaddr) returns true.
+  */
+-#define virt_to_page(kaddr)   pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
+ #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
+ extern bool __virt_addr_valid(unsigned long kaddr);
+ #define virt_addr_valid(kaddr)        __virt_addr_valid((unsigned long) (kaddr))
++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW
++#define virt_to_page(kaddr)   \
++      ({ \
++              const void *__kaddr = (const void *)(kaddr); \
++              BUG_ON(!virt_addr_valid(__kaddr)); \
++              pfn_to_page(__pa(__kaddr) >> PAGE_SHIFT); \
++      })
++#else
++#define virt_to_page(kaddr)   pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
++#endif
++
+ #endif        /* __ASSEMBLY__ */
+ #include <asm-generic/memory_model.h>
 diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
 index 0f1ddee..e2fc3d1 100644
 --- a/arch/x86/include/asm/page_64.h
@@ -17449,10 +17680,10 @@ index 81bb91b..9392125 100644
  
  /*
 diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
-index bbc8b12..f228861 100644
+index b459ddf..b44081b 100644
 --- a/arch/x86/include/asm/pgtable.h
 +++ b/arch/x86/include/asm/pgtable.h
-@@ -45,6 +45,7 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
+@@ -46,6 +46,7 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
  
  #ifndef __PAGETABLE_PUD_FOLDED
  #define set_pgd(pgdp, pgd)            native_set_pgd(pgdp, pgd)
@@ -17460,7 +17691,7 @@ index bbc8b12..f228861 100644
  #define pgd_clear(pgd)                        native_pgd_clear(pgd)
  #endif
  
-@@ -82,12 +83,51 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
+@@ -83,12 +84,51 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
  
  #define arch_end_context_switch(prev) do {} while(0)
  
@@ -17512,7 +17743,7 @@ index bbc8b12..f228861 100644
  static inline int pte_dirty(pte_t pte)
  {
        return pte_flags(pte) & _PAGE_DIRTY;
-@@ -148,6 +188,11 @@ static inline unsigned long pud_pfn(pud_t pud)
+@@ -149,6 +189,11 @@ static inline unsigned long pud_pfn(pud_t pud)
        return (pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT;
  }
  
@@ -17524,7 +17755,7 @@ index bbc8b12..f228861 100644
  #define pte_page(pte) pfn_to_page(pte_pfn(pte))
  
  static inline int pmd_large(pmd_t pte)
-@@ -201,9 +246,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
+@@ -202,9 +247,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
        return pte_clear_flags(pte, _PAGE_RW);
  }
  
@@ -17555,7 +17786,7 @@ index bbc8b12..f228861 100644
  }
  
  static inline pte_t pte_mkdirty(pte_t pte)
-@@ -430,6 +495,16 @@ pte_t *populate_extra_pte(unsigned long vaddr);
+@@ -431,6 +496,16 @@ pte_t *populate_extra_pte(unsigned long vaddr);
  #endif
  
  #ifndef __ASSEMBLY__
@@ -17572,7 +17803,7 @@ index bbc8b12..f228861 100644
  #include <linux/mm_types.h>
  #include <linux/mmdebug.h>
  #include <linux/log2.h>
-@@ -570,7 +645,7 @@ static inline unsigned long pud_page_vaddr(pud_t pud)
+@@ -571,7 +646,7 @@ static inline unsigned long pud_page_vaddr(pud_t pud)
   * Currently stuck as a macro due to indirect forward reference to
   * linux/mmzone.h's __section_mem_map_addr() definition:
   */
@@ -17581,7 +17812,7 @@ index bbc8b12..f228861 100644
  
  /* Find an entry in the second-level page table.. */
  static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address)
-@@ -610,7 +685,7 @@ static inline unsigned long pgd_page_vaddr(pgd_t pgd)
+@@ -611,7 +686,7 @@ static inline unsigned long pgd_page_vaddr(pgd_t pgd)
   * Currently stuck as a macro due to indirect forward reference to
   * linux/mmzone.h's __section_mem_map_addr() definition:
   */
@@ -17590,7 +17821,7 @@ index bbc8b12..f228861 100644
  
  /* to find an entry in a page-table-directory. */
  static inline unsigned long pud_index(unsigned long address)
-@@ -625,7 +700,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
+@@ -626,7 +701,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
  
  static inline int pgd_bad(pgd_t pgd)
  {
@@ -17599,7 +17830,7 @@ index bbc8b12..f228861 100644
  }
  
  static inline int pgd_none(pgd_t pgd)
-@@ -648,7 +723,12 @@ static inline int pgd_none(pgd_t pgd)
+@@ -649,7 +724,12 @@ static inline int pgd_none(pgd_t pgd)
   * pgd_offset() returns a (pgd_t *)
   * pgd_index() is used get the offset into the pgd page's array of pgd_t's;
   */
@@ -17613,7 +17844,7 @@ index bbc8b12..f228861 100644
  /*
   * a shortcut which implies the use of the kernel's pgd, instead
   * of a process's
-@@ -659,6 +739,23 @@ static inline int pgd_none(pgd_t pgd)
+@@ -660,6 +740,23 @@ static inline int pgd_none(pgd_t pgd)
  #define KERNEL_PGD_BOUNDARY   pgd_index(PAGE_OFFSET)
  #define KERNEL_PGD_PTRS               (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY)
  
@@ -17637,7 +17868,7 @@ index bbc8b12..f228861 100644
  #ifndef __ASSEMBLY__
  
  extern int direct_gbpages;
-@@ -825,11 +922,24 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm,
+@@ -826,11 +923,24 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm,
   * dst and src can be on the same page, but the range must not overlap,
   * and must not cross a page boundary.
   */
@@ -17814,7 +18045,7 @@ index c883bf7..19970b3 100644
  #define EARLY_DYNAMIC_PAGE_TABLES     64
  
 diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
-index 94e40f1..ebd03e4 100644
+index eb3d449..8d95316 100644
 --- a/arch/x86/include/asm/pgtable_types.h
 +++ b/arch/x86/include/asm/pgtable_types.h
 @@ -16,13 +16,12 @@
@@ -17873,18 +18104,16 @@ index 94e40f1..ebd03e4 100644
  #define __PAGE_KERNEL_VVAR            (__PAGE_KERNEL_RO | _PAGE_USER)
  #define __PAGE_KERNEL_VVAR_NOCACHE    (__PAGE_KERNEL_VVAR | _PAGE_PCD | _PAGE_PWT)
  #define __PAGE_KERNEL_LARGE           (__PAGE_KERNEL | _PAGE_PSE)
-@@ -219,8 +222,8 @@
-  * bits are combined, this will alow user to access the high address mapped
-  * VDSO in the presence of CONFIG_COMPAT_VDSO
-  */
+@@ -214,7 +217,7 @@
+ #ifdef CONFIG_X86_64
+ #define __PAGE_KERNEL_IDENT_LARGE_EXEC        __PAGE_KERNEL_LARGE_EXEC
+ #else
 -#define PTE_IDENT_ATTR         0x003          /* PRESENT+RW */
--#define PDE_IDENT_ATTR         0x067          /* PRESENT+RW+USER+DIRTY+ACCESSED */
 +#define PTE_IDENT_ATTR         0x063          /* PRESENT+RW+DIRTY+ACCESSED */
-+#define PDE_IDENT_ATTR         0x063          /* PRESENT+RW+DIRTY+ACCESSED */
+ #define PDE_IDENT_ATTR         0x063          /* PRESENT+RW+DIRTY+ACCESSED */
  #define PGD_IDENT_ATTR         0x001          /* PRESENT (no other attributes) */
  #endif
-@@ -258,7 +261,17 @@ static inline pgdval_t pgd_flags(pgd_t pgd)
+@@ -253,7 +256,17 @@ static inline pgdval_t pgd_flags(pgd_t pgd)
  {
        return native_pgd_val(pgd) & PTE_FLAGS_MASK;
  }
@@ -17902,7 +18131,7 @@ index 94e40f1..ebd03e4 100644
  #if PAGETABLE_LEVELS > 3
  typedef struct { pudval_t pud; } pud_t;
  
-@@ -272,8 +285,6 @@ static inline pudval_t native_pud_val(pud_t pud)
+@@ -267,8 +280,6 @@ static inline pudval_t native_pud_val(pud_t pud)
        return pud.pud;
  }
  #else
@@ -17911,7 +18140,7 @@ index 94e40f1..ebd03e4 100644
  static inline pudval_t native_pud_val(pud_t pud)
  {
        return native_pgd_val(pud.pgd);
-@@ -293,8 +304,6 @@ static inline pmdval_t native_pmd_val(pmd_t pmd)
+@@ -288,8 +299,6 @@ static inline pmdval_t native_pmd_val(pmd_t pmd)
        return pmd.pmd;
  }
  #else
@@ -17920,7 +18149,7 @@ index 94e40f1..ebd03e4 100644
  static inline pmdval_t native_pmd_val(pmd_t pmd)
  {
        return native_pgd_val(pmd.pud.pgd);
-@@ -334,7 +343,6 @@ typedef struct page *pgtable_t;
+@@ -329,7 +338,6 @@ typedef struct page *pgtable_t;
  
  extern pteval_t __supported_pte_mask;
  extern void set_nx(void);
@@ -17929,7 +18158,7 @@ index 94e40f1..ebd03e4 100644
  #define pgprot_writecombine   pgprot_writecombine
  extern pgprot_t pgprot_writecombine(pgprot_t prot);
 diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h
-index c8b0519..fd29e73 100644
+index 7024c12..71c46b9 100644
 --- a/arch/x86/include/asm/preempt.h
 +++ b/arch/x86/include/asm/preempt.h
 @@ -87,7 +87,7 @@ static __always_inline void __preempt_count_sub(int val)
@@ -17942,7 +18171,7 @@ index c8b0519..fd29e73 100644
  
  /*
 diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
-index fdedd38..95c02c2 100644
+index a4ea023..33aa874 100644
 --- a/arch/x86/include/asm/processor.h
 +++ b/arch/x86/include/asm/processor.h
 @@ -128,7 +128,7 @@ struct cpuinfo_x86 {
@@ -17986,7 +18215,7 @@ index fdedd38..95c02c2 100644
  
  /*
   * Save the original ist values for checking stack pointers during debugging
-@@ -470,6 +482,7 @@ struct thread_struct {
+@@ -479,6 +491,7 @@ struct thread_struct {
        unsigned short          ds;
        unsigned short          fsindex;
        unsigned short          gsindex;
@@ -17994,7 +18223,7 @@ index fdedd38..95c02c2 100644
  #endif
  #ifdef CONFIG_X86_32
        unsigned long           ip;
-@@ -579,29 +592,8 @@ static inline void load_sp0(struct tss_struct *tss,
+@@ -588,29 +601,8 @@ static inline void load_sp0(struct tss_struct *tss,
  extern unsigned long mmu_cr4_features;
  extern u32 *trampoline_cr4_features;
  
@@ -18026,7 +18255,7 @@ index fdedd38..95c02c2 100644
  
  typedef struct {
        unsigned long           seg;
-@@ -827,11 +819,18 @@ static inline void spin_lock_prefetch(const void *x)
+@@ -836,11 +828,18 @@ static inline void spin_lock_prefetch(const void *x)
   */
  #define TASK_SIZE             PAGE_OFFSET
  #define TASK_SIZE_MAX         TASK_SIZE
@@ -18047,7 +18276,7 @@ index fdedd38..95c02c2 100644
        .vm86_info              = NULL,                                   \
        .sysenter_cs            = __KERNEL_CS,                            \
        .io_bitmap_ptr          = NULL,                                   \
-@@ -845,7 +844,7 @@ static inline void spin_lock_prefetch(const void *x)
+@@ -854,7 +853,7 @@ static inline void spin_lock_prefetch(const void *x)
   */
  #define INIT_TSS  {                                                     \
        .x86_tss = {                                                      \
@@ -18056,7 +18285,7 @@ index fdedd38..95c02c2 100644
                .ss0            = __KERNEL_DS,                            \
                .ss1            = __KERNEL_CS,                            \
                .io_bitmap_base = INVALID_IO_BITMAP_OFFSET,               \
-@@ -856,11 +855,7 @@ static inline void spin_lock_prefetch(const void *x)
+@@ -865,11 +864,7 @@ static inline void spin_lock_prefetch(const void *x)
  extern unsigned long thread_saved_pc(struct task_struct *tsk);
  
  #define THREAD_SIZE_LONGS      (THREAD_SIZE/sizeof(unsigned long))
@@ -18069,7 +18298,7 @@ index fdedd38..95c02c2 100644
  
  /*
   * The below -8 is to reserve 8 bytes on top of the ring0 stack.
-@@ -875,7 +870,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
+@@ -884,7 +879,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
  #define task_pt_regs(task)                                             \
  ({                                                                     \
         struct pt_regs *__regs__;                                       \
@@ -18078,7 +18307,7 @@ index fdedd38..95c02c2 100644
         __regs__ - 1;                                                   \
  })
  
-@@ -885,13 +880,13 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
+@@ -894,13 +889,13 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
  /*
   * User space process size. 47bits minus one guard page.
   */
@@ -18094,7 +18323,7 @@ index fdedd38..95c02c2 100644
  
  #define TASK_SIZE             (test_thread_flag(TIF_ADDR32) ? \
                                        IA32_PAGE_OFFSET : TASK_SIZE_MAX)
-@@ -902,11 +897,11 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
+@@ -911,11 +906,11 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
  #define STACK_TOP_MAX         TASK_SIZE_MAX
  
  #define INIT_THREAD  { \
@@ -18108,7 +18337,7 @@ index fdedd38..95c02c2 100644
  }
  
  /*
-@@ -934,6 +929,10 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
+@@ -943,6 +938,10 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
   */
  #define TASK_UNMAPPED_BASE    (PAGE_ALIGN(TASK_SIZE / 3))
  
@@ -18119,7 +18348,7 @@ index fdedd38..95c02c2 100644
  #define KSTK_EIP(task)                (task_pt_regs(task)->ip)
  
  /* Get/set a process' ability to use the timestamp counter instruction */
-@@ -960,7 +959,7 @@ static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves)
+@@ -969,7 +968,7 @@ static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves)
        return 0;
  }
  
@@ -18128,7 +18357,7 @@ index fdedd38..95c02c2 100644
  extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
  
  void default_idle(void);
-@@ -970,6 +969,6 @@ bool xen_set_default_idle(void);
+@@ -979,6 +978,6 @@ bool xen_set_default_idle(void);
  #define xen_set_default_idle 0
  #endif
  
@@ -18137,7 +18366,7 @@ index fdedd38..95c02c2 100644
  void df_debug(struct pt_regs *regs, long error_code);
  #endif /* _ASM_X86_PROCESSOR_H */
 diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
-index 14fd6fd..6740420 100644
+index 6205f0c..688a3a9 100644
 --- a/arch/x86/include/asm/ptrace.h
 +++ b/arch/x86/include/asm/ptrace.h
 @@ -84,28 +84,29 @@ static inline unsigned long regs_return_value(struct pt_regs *regs)
@@ -18204,7 +18433,7 @@ index 14fd6fd..6740420 100644
 -              return kernel_stack_pointer(regs);
 +      if (offset == offsetof(struct pt_regs, sp)) {
 +              unsigned long cs = regs->cs & 0xffff;
-+              if (cs == __KERNEL_CS || cs == __KERNEXEC_KERNEL_CS)
++              if (cs == __KERNEL_CS || cs == __KERNEXEC_KERNEL_CS)
 +                      return kernel_stack_pointer(regs);
 +      }
  #endif
@@ -18881,18 +19110,10 @@ index d7f3b3b..3cc39f1 100644
               __switch_canary_iparam                                     \
             : "memory", "cc" __EXTRA_CLOBBER)
 diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
-index e1940c0..ac50dd8 100644
+index 47e5de2..d3dda54 100644
 --- a/arch/x86/include/asm/thread_info.h
 +++ b/arch/x86/include/asm/thread_info.h
-@@ -10,6 +10,7 @@
- #include <linux/compiler.h>
- #include <asm/page.h>
- #include <asm/types.h>
-+#include <asm/percpu.h>
- /*
-  * low level task data that entry.S needs immediate access to
-@@ -23,7 +24,6 @@ struct exec_domain;
+@@ -24,7 +24,6 @@ struct exec_domain;
  #include <linux/atomic.h>
  
  struct thread_info {
@@ -18900,16 +19121,10 @@ index e1940c0..ac50dd8 100644
        struct exec_domain      *exec_domain;   /* execution domain */
        __u32                   flags;          /* low level flags */
        __u32                   status;         /* thread synchronous flags */
-@@ -32,19 +32,13 @@ struct thread_info {
+@@ -33,13 +32,13 @@ struct thread_info {
        mm_segment_t            addr_limit;
        struct restart_block    restart_block;
        void __user             *sysenter_return;
--#ifdef CONFIG_X86_32
--      unsigned long           previous_esp;   /* ESP of the previous stack in
--                                                 case of nested (IRQ) stacks
--                                              */
--      __u8                    supervisor_stack[0];
--#endif
 +      unsigned long           lowest_stack;
        unsigned int            sig_on_uaccess_error:1;
        unsigned int            uaccess_err:1;  /* uaccess failed */
@@ -18922,7 +19137,7 @@ index e1940c0..ac50dd8 100644
        .exec_domain    = &default_exec_domain, \
        .flags          = 0,                    \
        .cpu            = 0,                    \
-@@ -55,7 +49,7 @@ struct thread_info {
+@@ -50,7 +49,7 @@ struct thread_info {
        },                                      \
  }
  
@@ -18931,7 +19146,7 @@ index e1940c0..ac50dd8 100644
  #define init_stack            (init_thread_union.stack)
  
  #else /* !__ASSEMBLY__ */
-@@ -95,6 +89,7 @@ struct thread_info {
+@@ -90,6 +89,7 @@ struct thread_info {
  #define TIF_SYSCALL_TRACEPOINT        28      /* syscall tracepoint instrumentation */
  #define TIF_ADDR32            29      /* 32-bit address space on 64 bits */
  #define TIF_X32                       30      /* 32-bit native x86-64 binary */
@@ -18939,7 +19154,7 @@ index e1940c0..ac50dd8 100644
  
  #define _TIF_SYSCALL_TRACE    (1 << TIF_SYSCALL_TRACE)
  #define _TIF_NOTIFY_RESUME    (1 << TIF_NOTIFY_RESUME)
-@@ -118,17 +113,18 @@ struct thread_info {
+@@ -113,17 +113,18 @@ struct thread_info {
  #define _TIF_SYSCALL_TRACEPOINT       (1 << TIF_SYSCALL_TRACEPOINT)
  #define _TIF_ADDR32           (1 << TIF_ADDR32)
  #define _TIF_X32              (1 << TIF_X32)
@@ -18960,7 +19175,7 @@ index e1940c0..ac50dd8 100644
  
  /* work to do on interrupt/exception return */
  #define _TIF_WORK_MASK                                                        \
-@@ -139,7 +135,7 @@ struct thread_info {
+@@ -134,7 +135,7 @@ struct thread_info {
  /* work to do on any return to user space */
  #define _TIF_ALLWORK_MASK                                             \
        ((0x0000FFFF & ~_TIF_SECCOMP) | _TIF_SYSCALL_TRACEPOINT |       \
@@ -18969,93 +19184,46 @@ index e1940c0..ac50dd8 100644
  
  /* Only used for 64 bit */
  #define _TIF_DO_NOTIFY_MASK                                           \
-@@ -153,6 +149,23 @@ struct thread_info {
- #define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)
+@@ -149,7 +150,6 @@ struct thread_info {
  #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW)
  
-+#ifdef __ASSEMBLY__
-+/* how to get the thread information struct from ASM */
-+#define GET_THREAD_INFO(reg)   \
-+      mov PER_CPU_VAR(current_tinfo), reg
-+
-+/* use this one if reg already contains %esp */
-+#define GET_THREAD_INFO_WITH_ESP(reg) GET_THREAD_INFO(reg)
-+#else
-+/* how to get the thread information struct from C */
-+DECLARE_PER_CPU(struct thread_info *, current_tinfo);
-+
-+static __always_inline struct thread_info *current_thread_info(void)
-+{
-+      return this_cpu_read_stable(current_tinfo);
-+}
-+#endif
-+
- #ifdef CONFIG_X86_32
- #define STACK_WARN    (THREAD_SIZE/8)
-@@ -169,31 +182,10 @@ struct thread_info {
-       sp;                                     \
- })
--/* how to get the thread information struct from C */
--static inline struct thread_info *current_thread_info(void)
--{
--      return (struct thread_info *)
--              (current_stack_pointer & ~(THREAD_SIZE - 1));
--}
--
--#else /* !__ASSEMBLY__ */
--
--/* how to get the thread information struct from ASM */
--#define GET_THREAD_INFO(reg)   \
--      movl $-THREAD_SIZE, reg; \
--      andl %esp, reg
--
--/* use this one if reg already contains %esp */
--#define GET_THREAD_INFO_WITH_ESP(reg) \
--      andl $-THREAD_SIZE, reg
--
- #endif
- #else /* X86_32 */
+ #define STACK_WARN            (THREAD_SIZE/8)
+-#define KERNEL_STACK_OFFSET   (5*(BITS_PER_LONG/8))
  
--#include <asm/percpu.h>
--#define KERNEL_STACK_OFFSET (5*8)
--
  /*
   * macros/functions for gaining access to the thread information structure
-  * preempt_count needs to be 1 initially, until the scheduler is functional.
-@@ -201,27 +193,8 @@ static inline struct thread_info *current_thread_info(void)
- #ifndef __ASSEMBLY__
+@@ -160,26 +160,18 @@ struct thread_info {
  DECLARE_PER_CPU(unsigned long, kernel_stack);
  
--static inline struct thread_info *current_thread_info(void)
--{
++DECLARE_PER_CPU(struct thread_info *, current_tinfo);
++
+ static inline struct thread_info *current_thread_info(void)
+ {
 -      struct thread_info *ti;
 -      ti = (void *)(this_cpu_read_stable(kernel_stack) +
 -                    KERNEL_STACK_OFFSET - THREAD_SIZE);
 -      return ti;
--}
--
--#else /* !__ASSEMBLY__ */
--
--/* how to get the thread information struct from ASM */
--#define GET_THREAD_INFO(reg) \
--      movq PER_CPU_VAR(kernel_stack),reg ; \
--      subq $(THREAD_SIZE-KERNEL_STACK_OFFSET),reg
++      return this_cpu_read_stable(current_tinfo);
+ }
+ #else /* !__ASSEMBLY__ */
+ /* how to get the thread information struct from ASM */
+ #define GET_THREAD_INFO(reg) \
+-      _ASM_MOV PER_CPU_VAR(kernel_stack),reg ; \
+-      _ASM_SUB $(THREAD_SIZE-KERNEL_STACK_OFFSET),reg ;
 -
 -/*
 - * Same if PER_CPU_VAR(kernel_stack) is, perhaps with some offset, already in
 - * a certain register (to be used in assembler memory operands).
 - */
 -#define THREAD_INFO(reg, off) KERNEL_STACK_OFFSET+(off)-THREAD_SIZE(reg)
--
-+/* how to get the current stack pointer from C */
-+register unsigned long current_stack_pointer asm("rsp") __used;
++      _ASM_MOV PER_CPU_VAR(current_tinfo),reg ;
  #endif
  
- #endif /* !X86_32 */
-@@ -280,5 +253,12 @@ static inline bool is_ia32_task(void)
+@@ -237,5 +229,12 @@ static inline bool is_ia32_task(void)
  extern void arch_task_cache_init(void);
  extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);
  extern void arch_release_task_struct(struct task_struct *tsk);
@@ -19166,7 +19334,7 @@ index 04905bf..49203ca 100644
  }
  
 diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
-index 0d592e0..f58a222 100644
+index 0d592e0..7437fcc 100644
 --- a/arch/x86/include/asm/uaccess.h
 +++ b/arch/x86/include/asm/uaccess.h
 @@ -7,6 +7,7 @@
@@ -19190,7 +19358,7 @@ index 0d592e0..f58a222 100644
  
  #define segment_eq(a, b)      ((a).seg == (b).seg)
  
-@@ -85,8 +91,34 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un
+@@ -85,8 +91,36 @@ static inline bool __chk_range_not_ok(unsigned long addr, unsigned long size, un
   * checks that the pointer is in the user space range - after calling
   * this function, memory access functions may still return -EFAULT.
   */
@@ -19200,26 +19368,28 @@ index 0d592e0..f58a222 100644
 +#define access_ok_noprefault(type, addr, size) (likely(!__range_not_ok(addr, size, user_addr_max())))
 +#define access_ok(type, addr, size)                                   \
 +({                                                                    \
-+      long __size = size;                                             \
++      unsigned long __size = size;                                    \
 +      unsigned long __addr = (unsigned long)addr;                     \
-+      unsigned long __addr_ao = __addr & PAGE_MASK;                   \
-+      unsigned long __end_ao = __addr + __size - 1;                   \
 +      bool __ret_ao = __range_not_ok(__addr, __size, user_addr_max()) == 0;\
-+      if (__ret_ao && unlikely((__end_ao ^ __addr_ao) & PAGE_MASK)) { \
-+              while(__addr_ao <= __end_ao) {                          \
-+                      char __c_ao;                                    \
-+                      __addr_ao += PAGE_SIZE;                         \
-+                      if (__size > PAGE_SIZE)                         \
-+                              _cond_resched();                        \
-+                      if (__get_user(__c_ao, (char __user *)__addr))  \
-+                              break;                                  \
-+                      if (type != VERIFY_WRITE) {                     \
++      if (__ret_ao && __size) {                                       \
++              unsigned long __addr_ao = __addr & PAGE_MASK;           \
++              unsigned long __end_ao = __addr + __size - 1;           \
++              if (unlikely((__end_ao ^ __addr_ao) & PAGE_MASK)) {     \
++                      while (__addr_ao <= __end_ao) {                 \
++                              char __c_ao;                            \
++                              __addr_ao += PAGE_SIZE;                 \
++                              if (__size > PAGE_SIZE)                 \
++                                      _cond_resched();                \
++                              if (__get_user(__c_ao, (char __user *)__addr))  \
++                                      break;                          \
++                              if (type != VERIFY_WRITE) {             \
++                                      __addr = __addr_ao;             \
++                                      continue;                       \
++                              }                                       \
++                              if (__put_user(__c_ao, (char __user *)__addr))  \
++                                      break;                          \
 +                              __addr = __addr_ao;                     \
-+                              continue;                               \
 +                      }                                               \
-+                      if (__put_user(__c_ao, (char __user *)__addr))  \
-+                              break;                                  \
-+                      __addr = __addr_ao;                             \
 +              }                                                       \
 +      }                                                               \
 +      __ret_ao;                                                       \
@@ -19227,7 +19397,7 @@ index 0d592e0..f58a222 100644
  
  /*
   * The exception table consists of pairs of addresses relative to the
-@@ -176,10 +208,12 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
+@@ -176,10 +210,12 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
        register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX);            \
        __chk_user_ptr(ptr);                                            \
        might_fault();                                                  \
@@ -19240,7 +19410,7 @@ index 0d592e0..f58a222 100644
        __ret_gu;                                                       \
  })
  
-@@ -187,13 +221,21 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
+@@ -187,13 +223,21 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
        asm volatile("call __put_user_" #size : "=a" (__ret_pu) \
                     : "0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx")
  
@@ -19265,7 +19435,7 @@ index 0d592e0..f58a222 100644
                     "3: " ASM_CLAC "\n"                                \
                     ".section .fixup,\"ax\"\n"                         \
                     "4:        movl %3,%0\n"                           \
-@@ -206,8 +248,8 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
+@@ -206,8 +250,8 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
  
  #define __put_user_asm_ex_u64(x, addr)                                        \
        asm volatile(ASM_STAC "\n"                                      \
@@ -19276,7 +19446,7 @@ index 0d592e0..f58a222 100644
                     "3: " ASM_CLAC "\n"                                \
                     _ASM_EXTABLE_EX(1b, 2b)                            \
                     _ASM_EXTABLE_EX(2b, 3b)                            \
-@@ -257,7 +299,8 @@ extern void __put_user_8(void);
+@@ -257,7 +301,8 @@ extern void __put_user_8(void);
        __typeof__(*(ptr)) __pu_val;                            \
        __chk_user_ptr(ptr);                                    \
        might_fault();                                          \
@@ -19286,7 +19456,7 @@ index 0d592e0..f58a222 100644
        switch (sizeof(*(ptr))) {                               \
        case 1:                                                 \
                __put_user_x(1, __pu_val, ptr, __ret_pu);       \
-@@ -275,6 +318,7 @@ extern void __put_user_8(void);
+@@ -275,6 +320,7 @@ extern void __put_user_8(void);
                __put_user_x(X, __pu_val, ptr, __ret_pu);       \
                break;                                          \
        }                                                       \
@@ -19294,7 +19464,7 @@ index 0d592e0..f58a222 100644
        __ret_pu;                                               \
  })
  
-@@ -355,8 +399,10 @@ do {                                                                      \
+@@ -355,8 +401,10 @@ do {                                                                      \
  } while (0)
  
  #define __get_user_asm(x, addr, err, itype, rtype, ltype, errret)     \
@@ -19306,7 +19476,7 @@ index 0d592e0..f58a222 100644
                     "2: " ASM_CLAC "\n"                                \
                     ".section .fixup,\"ax\"\n"                         \
                     "3:        mov %3,%0\n"                            \
-@@ -364,8 +410,10 @@ do {                                                                      \
+@@ -364,8 +412,10 @@ do {                                                                      \
                     "  jmp 2b\n"                                       \
                     ".previous\n"                                      \
                     _ASM_EXTABLE(1b, 3b)                               \
@@ -19319,7 +19489,7 @@ index 0d592e0..f58a222 100644
  
  #define __get_user_size_ex(x, ptr, size)                              \
  do {                                                                  \
-@@ -389,7 +437,7 @@ do {                                                                       \
+@@ -389,7 +439,7 @@ do {                                                                       \
  } while (0)
  
  #define __get_user_asm_ex(x, addr, itype, rtype, ltype)                       \
@@ -19328,7 +19498,7 @@ index 0d592e0..f58a222 100644
                     "2:\n"                                             \
                     _ASM_EXTABLE_EX(1b, 2b)                            \
                     : ltype(x) : "m" (__m(addr)))
-@@ -406,13 +454,24 @@ do {                                                                     \
+@@ -406,13 +456,24 @@ do {                                                                     \
        int __gu_err;                                                   \
        unsigned long __gu_val;                                         \
        __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT);    \
@@ -19355,7 +19525,7 @@ index 0d592e0..f58a222 100644
  
  /*
   * Tell gcc we read from memory instead of writing: this is because
-@@ -420,8 +479,10 @@ struct __large_struct { unsigned long buf[100]; };
+@@ -420,8 +481,10 @@ struct __large_struct { unsigned long buf[100]; };
   * aliasing issues.
   */
  #define __put_user_asm(x, addr, err, itype, rtype, ltype, errret)     \
@@ -19367,7 +19537,7 @@ index 0d592e0..f58a222 100644
                     "2: " ASM_CLAC "\n"                                \
                     ".section .fixup,\"ax\"\n"                         \
                     "3:        mov %3,%0\n"                            \
-@@ -429,10 +490,12 @@ struct __large_struct { unsigned long buf[100]; };
+@@ -429,10 +492,12 @@ struct __large_struct { unsigned long buf[100]; };
                     ".previous\n"                                      \
                     _ASM_EXTABLE(1b, 3b)                               \
                     : "=r"(err)                                        \
@@ -19382,7 +19552,7 @@ index 0d592e0..f58a222 100644
                     "2:\n"                                             \
                     _ASM_EXTABLE_EX(1b, 2b)                            \
                     : : ltype(x), "m" (__m(addr)))
-@@ -442,11 +505,13 @@ struct __large_struct { unsigned long buf[100]; };
+@@ -442,11 +507,13 @@ struct __large_struct { unsigned long buf[100]; };
   */
  #define uaccess_try   do {                                            \
        current_thread_info()->uaccess_err = 0;                         \
@@ -19396,7 +19566,7 @@ index 0d592e0..f58a222 100644
        (err) |= (current_thread_info()->uaccess_err ? -EFAULT : 0);    \
  } while (0)
  
-@@ -471,8 +536,12 @@ struct __large_struct { unsigned long buf[100]; };
+@@ -471,8 +538,12 @@ struct __large_struct { unsigned long buf[100]; };
   * On error, the variable @x is set to zero.
   */
  
@@ -19409,7 +19579,7 @@ index 0d592e0..f58a222 100644
  
  /**
   * __put_user: - Write a simple value into user space, with less checking.
-@@ -494,8 +563,12 @@ struct __large_struct { unsigned long buf[100]; };
+@@ -494,8 +565,12 @@ struct __large_struct { unsigned long buf[100]; };
   * Returns zero on success, or -EFAULT on error.
   */
  
@@ -19422,7 +19592,7 @@ index 0d592e0..f58a222 100644
  
  #define __get_user_unaligned __get_user
  #define __put_user_unaligned __put_user
-@@ -513,7 +586,7 @@ struct __large_struct { unsigned long buf[100]; };
+@@ -513,7 +588,7 @@ struct __large_struct { unsigned long buf[100]; };
  #define get_user_ex(x, ptr)   do {                                    \
        unsigned long __gue_val;                                        \
        __get_user_size_ex((__gue_val), (ptr), (sizeof(*(ptr))));       \
@@ -19431,7 +19601,7 @@ index 0d592e0..f58a222 100644
  } while (0)
  
  #define put_user_try          uaccess_try
-@@ -542,18 +615,19 @@ extern void __cmpxchg_wrong_size(void)
+@@ -542,18 +617,19 @@ extern void __cmpxchg_wrong_size(void)
        __typeof__(ptr) __uval = (uval);                                \
        __typeof__(*(ptr)) __old = (old);                               \
        __typeof__(*(ptr)) __new = (new);                               \
@@ -19453,7 +19623,7 @@ index 0d592e0..f58a222 100644
                        : "i" (-EFAULT), "q" (__new), "1" (__old)       \
                        : "memory"                                      \
                );                                                      \
-@@ -562,14 +636,14 @@ extern void __cmpxchg_wrong_size(void)
+@@ -562,14 +638,14 @@ extern void __cmpxchg_wrong_size(void)
        case 2:                                                         \
        {                                                               \
                asm volatile("\t" ASM_STAC "\n"                         \
@@ -19470,7 +19640,7 @@ index 0d592e0..f58a222 100644
                        : "i" (-EFAULT), "r" (__new), "1" (__old)       \
                        : "memory"                                      \
                );                                                      \
-@@ -578,14 +652,14 @@ extern void __cmpxchg_wrong_size(void)
+@@ -578,14 +654,14 @@ extern void __cmpxchg_wrong_size(void)
        case 4:                                                         \
        {                                                               \
                asm volatile("\t" ASM_STAC "\n"                         \
@@ -19487,7 +19657,7 @@ index 0d592e0..f58a222 100644
                        : "i" (-EFAULT), "r" (__new), "1" (__old)       \
                        : "memory"                                      \
                );                                                      \
-@@ -597,14 +671,14 @@ extern void __cmpxchg_wrong_size(void)
+@@ -597,14 +673,14 @@ extern void __cmpxchg_wrong_size(void)
                        __cmpxchg_wrong_size();                         \
                                                                        \
                asm volatile("\t" ASM_STAC "\n"                         \
@@ -19504,7 +19674,7 @@ index 0d592e0..f58a222 100644
                        : "i" (-EFAULT), "r" (__new), "1" (__old)       \
                        : "memory"                                      \
                );                                                      \
-@@ -613,6 +687,7 @@ extern void __cmpxchg_wrong_size(void)
+@@ -613,6 +689,7 @@ extern void __cmpxchg_wrong_size(void)
        default:                                                        \
                __cmpxchg_wrong_size();                                 \
        }                                                               \
@@ -19512,7 +19682,7 @@ index 0d592e0..f58a222 100644
        *__uval = __old;                                                \
        __ret;                                                          \
  })
-@@ -636,17 +711,6 @@ extern struct movsl_mask {
+@@ -636,17 +713,6 @@ extern struct movsl_mask {
  
  #define ARCH_HAS_NOCACHE_UACCESS 1
  
@@ -19530,7 +19700,7 @@ index 0d592e0..f58a222 100644
  #ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
  # define copy_user_diag __compiletime_error
  #else
-@@ -656,7 +720,7 @@ unsigned long __must_check _copy_to_user(void __user *to, const void *from,
+@@ -656,7 +722,7 @@ unsigned long __must_check _copy_to_user(void __user *to, const void *from,
  extern void copy_user_diag("copy_from_user() buffer size is too small")
  copy_from_user_overflow(void);
  extern void copy_user_diag("copy_to_user() buffer size is too small")
@@ -19539,7 +19709,7 @@ index 0d592e0..f58a222 100644
  
  #undef copy_user_diag
  
-@@ -669,7 +733,7 @@ __copy_from_user_overflow(void) __asm__("copy_from_user_overflow");
+@@ -669,7 +735,7 @@ __copy_from_user_overflow(void) __asm__("copy_from_user_overflow");
  
  extern void
  __compiletime_warning("copy_to_user() buffer size is not provably correct")
@@ -19548,7 +19718,7 @@ index 0d592e0..f58a222 100644
  #define __copy_to_user_overflow(size, count) __copy_to_user_overflow()
  
  #else
-@@ -684,10 +748,16 @@ __copy_from_user_overflow(int size, unsigned long count)
+@@ -684,10 +750,16 @@ __copy_from_user_overflow(int size, unsigned long count)
  
  #endif
  
@@ -19566,7 +19736,7 @@ index 0d592e0..f58a222 100644
  
        might_fault();
  
-@@ -709,12 +779,15 @@ copy_from_user(void *to, const void __user *from, unsigned long n)
+@@ -709,12 +781,15 @@ copy_from_user(void *to, const void __user *from, unsigned long n)
         * case, and do only runtime checking for non-constant sizes.
         */
  
@@ -19588,7 +19758,7 @@ index 0d592e0..f58a222 100644
  
        return n;
  }
-@@ -722,17 +795,18 @@ copy_from_user(void *to, const void __user *from, unsigned long n)
+@@ -722,17 +797,18 @@ copy_from_user(void *to, const void __user *from, unsigned long n)
  static inline unsigned long __must_check
  copy_to_user(void __user *to, const void *from, unsigned long n)
  {
@@ -20081,10 +20251,10 @@ index e45e4da..44e8572 100644
  extern struct x86_init_ops x86_init;
  extern struct x86_cpuinit_ops x86_cpuinit;
 diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
-index 3e276eb..2eb3c30 100644
+index c949923..c22bfa4 100644
 --- a/arch/x86/include/asm/xen/page.h
 +++ b/arch/x86/include/asm/xen/page.h
-@@ -56,7 +56,7 @@ extern int m2p_remove_override(struct page *page,
+@@ -63,7 +63,7 @@ extern int m2p_remove_override(struct page *page,
  extern struct page *m2p_find_override(unsigned long mfn);
  extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn);
  
@@ -20094,10 +20264,10 @@ index 3e276eb..2eb3c30 100644
        unsigned long mfn;
  
 diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h
-index 5547389..da68716 100644
+index d949ef2..479b9d1 100644
 --- a/arch/x86/include/asm/xsave.h
 +++ b/arch/x86/include/asm/xsave.h
-@@ -76,8 +76,11 @@ static inline int xsave_user(struct xsave_struct __user *buf)
+@@ -82,8 +82,11 @@ static inline int xsave_user(struct xsave_struct __user *buf)
        if (unlikely(err))
                return -EFAULT;
  
@@ -20110,7 +20280,7 @@ index 5547389..da68716 100644
                             "2: " ASM_CLAC "\n"
                             ".section .fixup,\"ax\"\n"
                             "3:  movl $-1,%[err]\n"
-@@ -87,18 +90,22 @@ static inline int xsave_user(struct xsave_struct __user *buf)
+@@ -93,18 +96,22 @@ static inline int xsave_user(struct xsave_struct __user *buf)
                             : [err] "=r" (err)
                             : "D" (buf), "a" (-1), "d" (-1), "0" (0)
                             : "memory");
@@ -20135,7 +20305,7 @@ index 5547389..da68716 100644
                             "2: " ASM_CLAC "\n"
                             ".section .fixup,\"ax\"\n"
                             "3:  movl $-1,%[err]\n"
-@@ -108,6 +115,7 @@ static inline int xrestore_user(struct xsave_struct __user *buf, u64 mask)
+@@ -114,6 +121,7 @@ static inline int xrestore_user(struct xsave_struct __user *buf, u64 mask)
                             : [err] "=r" (err)
                             : "D" (xstate), "a" (lmask), "d" (hmask), "0" (0)
                             : "memory");       /* memory required? */
@@ -20169,7 +20339,7 @@ index 7b0a55a..ad115bf 100644
  
  /* top of stack page */
 diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
-index cb648c8..91cb07e 100644
+index f4d9600..b45af01 100644
 --- a/arch/x86/kernel/Makefile
 +++ b/arch/x86/kernel/Makefile
 @@ -24,7 +24,7 @@ obj-y                        += time.o ioport.o ldt.o dumpstack.o nmi.o
@@ -20179,13 +20349,13 @@ index cb648c8..91cb07e 100644
 -obj-$(CONFIG_X86_32)  += i386_ksyms_32.o
 +obj-$(CONFIG_X86_32)  += sys_i386_32.o i386_ksyms_32.o
  obj-$(CONFIG_X86_64)  += sys_x86_64.o x8664_ksyms_64.o
- obj-y                 += syscall_$(BITS).o
+ obj-y                 += syscall_$(BITS).o vsyscall_gtod.o
  obj-$(CONFIG_X86_64)  += vsyscall_64.o
 diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
-index 1dac942..19c8b0c 100644
+index 86281ff..e046fc2 100644
 --- a/arch/x86/kernel/acpi/boot.c
 +++ b/arch/x86/kernel/acpi/boot.c
-@@ -1312,7 +1312,7 @@ static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
+@@ -1296,7 +1296,7 @@ static int __init dmi_ignore_irq0_timer_override(const struct dmi_system_id *d)
   * If your system is blacklisted here, but you find that acpi=force
   * works for you, please contact linux-acpi@vger.kernel.org
   */
@@ -20194,7 +20364,7 @@ index 1dac942..19c8b0c 100644
        /*
         * Boxes that need ACPI disabled
         */
-@@ -1387,7 +1387,7 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
+@@ -1371,7 +1371,7 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
  };
  
  /* second table for DMI checks that should run after early-quirks */
@@ -20204,7 +20374,7 @@ index 1dac942..19c8b0c 100644
         * HP laptops which use a DSDT reporting as HP/SB400/10000,
         * which includes some code which overrides all temperature
 diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
-index 3a2ae4c..9db31d6 100644
+index 3136820..e2c6577 100644
 --- a/arch/x86/kernel/acpi/sleep.c
 +++ b/arch/x86/kernel/acpi/sleep.c
 @@ -99,8 +99,12 @@ int x86_acpi_suspend_lowlevel(void)
@@ -20241,7 +20411,7 @@ index 665c6b7..eae4d56 100644
  bogus_magic:
        jmp     bogus_magic
 diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
-index df94598..f3b29bf 100644
+index df94598..b7162f9 100644
 --- a/arch/x86/kernel/alternative.c
 +++ b/arch/x86/kernel/alternative.c
 @@ -269,6 +269,13 @@ void __init_or_module apply_alternatives(struct alt_instr *start,
@@ -20258,7 +20428,19 @@ index df94598..f3b29bf 100644
                replacement = (u8 *)&a->repl_offset + a->repl_offset;
                BUG_ON(a->replacementlen > a->instrlen);
                BUG_ON(a->instrlen > sizeof(insnbuf));
-@@ -300,10 +307,16 @@ static void alternatives_smp_lock(const s32 *start, const s32 *end,
+@@ -285,6 +292,11 @@ void __init_or_module apply_alternatives(struct alt_instr *start,
+               add_nops(insnbuf + a->replacementlen,
+                        a->instrlen - a->replacementlen);
++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC)
++              if (instr < (u8 *)_text || (u8 *)_einittext <= instr)
++                      instr = ktva_ktla(instr);
++#endif
++
+               text_poke_early(instr, insnbuf, a->instrlen);
+       }
+ }
+@@ -300,10 +312,16 @@ static void alternatives_smp_lock(const s32 *start, const s32 *end,
        for (poff = start; poff < end; poff++) {
                u8 *ptr = (u8 *)poff + *poff;
  
@@ -20276,7 +20458,7 @@ index df94598..f3b29bf 100644
                        text_poke(ptr, ((unsigned char []){0xf0}), 1);
        }
        mutex_unlock(&text_mutex);
-@@ -318,10 +331,16 @@ static void alternatives_smp_unlock(const s32 *start, const s32 *end,
+@@ -318,10 +336,16 @@ static void alternatives_smp_unlock(const s32 *start, const s32 *end,
        for (poff = start; poff < end; poff++) {
                u8 *ptr = (u8 *)poff + *poff;
  
@@ -20294,7 +20476,7 @@ index df94598..f3b29bf 100644
                        text_poke(ptr, ((unsigned char []){0x3E}), 1);
        }
        mutex_unlock(&text_mutex);
-@@ -458,7 +477,7 @@ void __init_or_module apply_paravirt(struct paravirt_patch_site *start,
+@@ -458,7 +482,7 @@ void __init_or_module apply_paravirt(struct paravirt_patch_site *start,
  
                BUG_ON(p->len > MAX_PATCH_LEN);
                /* prep the buffer with the original instructions */
@@ -20303,7 +20485,7 @@ index df94598..f3b29bf 100644
                used = pv_init_ops.patch(p->instrtype, p->clobbers, insnbuf,
                                         (unsigned long)p->instr, p->len);
  
-@@ -505,7 +524,7 @@ void __init alternative_instructions(void)
+@@ -505,7 +529,7 @@ void __init alternative_instructions(void)
        if (!uniproc_patched || num_possible_cpus() == 1)
                free_init_pages("SMP alternatives",
                                (unsigned long)__smp_locks,
@@ -20312,7 +20494,7 @@ index df94598..f3b29bf 100644
  #endif
  
        apply_paravirt(__parainstructions, __parainstructions_end);
-@@ -525,13 +544,17 @@ void __init alternative_instructions(void)
+@@ -525,13 +549,17 @@ void __init alternative_instructions(void)
   * instructions. And on the local CPU you need to be protected again NMI or MCE
   * handlers seeing an inconsistent instruction while you patch.
   */
@@ -20332,7 +20514,7 @@ index df94598..f3b29bf 100644
        local_irq_restore(flags);
        /* Could also do a CLFLUSH here to speed up CPU recovery; but
           that causes hangs on some VIA CPUs. */
-@@ -553,36 +576,22 @@ void *__init_or_module text_poke_early(void *addr, const void *opcode,
+@@ -553,36 +581,22 @@ void *__init_or_module text_poke_early(void *addr, const void *opcode,
   */
  void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
  {
@@ -20377,7 +20559,7 @@ index df94598..f3b29bf 100644
        return addr;
  }
  
-@@ -602,7 +611,7 @@ int poke_int3_handler(struct pt_regs *regs)
+@@ -602,7 +616,7 @@ int poke_int3_handler(struct pt_regs *regs)
        if (likely(!bp_patching_in_progress))
                return 0;
  
@@ -20386,7 +20568,7 @@ index df94598..f3b29bf 100644
                return 0;
  
        /* set up the specified breakpoint handler */
-@@ -636,7 +645,7 @@ int poke_int3_handler(struct pt_regs *regs)
+@@ -636,7 +650,7 @@ int poke_int3_handler(struct pt_regs *regs)
   */
  void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler)
  {
@@ -20396,10 +20578,10 @@ index df94598..f3b29bf 100644
        bp_int3_handler = handler;
        bp_int3_addr = (u8 *)addr + sizeof(int3);
 diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
-index 7f26c9a..694544e 100644
+index ad28db7..c538b2c 100644
 --- a/arch/x86/kernel/apic/apic.c
 +++ b/arch/x86/kernel/apic/apic.c
-@@ -198,7 +198,7 @@ int first_system_vector = 0xfe;
+@@ -201,7 +201,7 @@ int first_system_vector = 0xfe;
  /*
   * Debug level, exported for io_apic.c
   */
@@ -20408,8 +20590,8 @@ index 7f26c9a..694544e 100644
  
  int pic_mode;
  
-@@ -1992,7 +1992,7 @@ static inline void __smp_error_interrupt(struct pt_regs *regs)
-       apic_write(APIC_ESR, 0);
+@@ -2000,7 +2000,7 @@ static inline void __smp_error_interrupt(struct pt_regs *regs)
+               apic_write(APIC_ESR, 0);
        v = apic_read(APIC_ESR);
        ack_APIC_irq();
 -      atomic_inc(&irq_err_count);
@@ -20418,7 +20600,7 @@ index 7f26c9a..694544e 100644
        apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x",
                    smp_processor_id(), v);
 diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c
-index 2c621a6..fa2b1ae 100644
+index 7c1b294..e71d27f 100644
 --- a/arch/x86/kernel/apic/apic_flat_64.c
 +++ b/arch/x86/kernel/apic/apic_flat_64.c
 @@ -154,7 +154,7 @@ static int flat_probe(void)
@@ -20440,7 +20622,7 @@ index 2c621a6..fa2b1ae 100644
        .name                           = "physical flat",
        .probe                          = physflat_probe,
 diff --git a/arch/x86/kernel/apic/apic_noop.c b/arch/x86/kernel/apic/apic_noop.c
-index 191ce75..2db6d63 100644
+index 8c7c982..a225910 100644
 --- a/arch/x86/kernel/apic/apic_noop.c
 +++ b/arch/x86/kernel/apic/apic_noop.c
 @@ -118,7 +118,7 @@ static void noop_apic_write(u32 reg, u32 v)
@@ -20453,7 +20635,7 @@ index 191ce75..2db6d63 100644
        .probe                          = noop_probe,
        .acpi_madt_oem_check            = NULL,
 diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c
-index d50e364..543bee3 100644
+index e4840aa..e7d9dac 100644
 --- a/arch/x86/kernel/apic/bigsmp_32.c
 +++ b/arch/x86/kernel/apic/bigsmp_32.c
 @@ -152,7 +152,7 @@ static int probe_bigsmp(void)
@@ -20465,31 +20647,8 @@ index d50e364..543bee3 100644
  
        .name                           = "bigsmp",
        .probe                          = probe_bigsmp,
-diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c
-index c552247..587a316 100644
---- a/arch/x86/kernel/apic/es7000_32.c
-+++ b/arch/x86/kernel/apic/es7000_32.c
-@@ -608,8 +608,7 @@ static int es7000_mps_oem_check_cluster(struct mpc_table *mpc, char *oem,
-       return ret && es7000_apic_is_cluster();
- }
--/* We've been warned by a false positive warning.Use __refdata to keep calm. */
--static struct apic __refdata apic_es7000_cluster = {
-+static struct apic apic_es7000_cluster __read_only = {
-       .name                           = "es7000",
-       .probe                          = probe_es7000,
-@@ -675,7 +674,7 @@ static struct apic __refdata apic_es7000_cluster = {
-       .x86_32_early_logical_apicid    = es7000_early_logical_apicid,
- };
--static struct apic __refdata apic_es7000 = {
-+static struct apic apic_es7000 __read_only = {
-       .name                           = "es7000",
-       .probe                          = probe_es7000,
 diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
-index 6ad4658..38a7b5c 100644
+index 992060e..ecdc3b3 100644
 --- a/arch/x86/kernel/apic/io_apic.c
 +++ b/arch/x86/kernel/apic/io_apic.c
 @@ -1057,7 +1057,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
@@ -20528,22 +20687,8 @@ index 6ad4658..38a7b5c 100644
  
                eoi_ioapic_irq(irq, cfg);
        }
-diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c
-index 1e42e8f..daacf44 100644
---- a/arch/x86/kernel/apic/numaq_32.c
-+++ b/arch/x86/kernel/apic/numaq_32.c
-@@ -455,8 +455,7 @@ static void numaq_setup_portio_remap(void)
-               (u_long) xquad_portio, (u_long) num_quads*XQUAD_PORTIO_QUAD);
- }
--/* Use __refdata to keep false positive warning calm.  */
--static struct apic __refdata apic_numaq = {
-+static struct apic apic_numaq __read_only = {
-       .name                           = "NUMAQ",
-       .probe                          = probe_numaq,
 diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c
-index eb35ef9..f184a21 100644
+index cceb352..a635fd8 100644
 --- a/arch/x86/kernel/apic/probe_32.c
 +++ b/arch/x86/kernel/apic/probe_32.c
 @@ -72,7 +72,7 @@ static int probe_default(void)
@@ -20555,21 +20700,8 @@ index eb35ef9..f184a21 100644
  
        .name                           = "default",
        .probe                          = probe_default,
-diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c
-index 00146f9..5e299b8 100644
---- a/arch/x86/kernel/apic/summit_32.c
-+++ b/arch/x86/kernel/apic/summit_32.c
-@@ -485,7 +485,7 @@ void setup_summit(void)
- }
- #endif
--static struct apic apic_summit = {
-+static struct apic apic_summit __read_only = {
-       .name                           = "summit",
-       .probe                          = probe_summit,
 diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c
-index cac85ee..01fa741 100644
+index e66766b..1c008ba 100644
 --- a/arch/x86/kernel/apic/x2apic_cluster.c
 +++ b/arch/x86/kernel/apic/x2apic_cluster.c
 @@ -182,7 +182,7 @@ update_clusterinfo(struct notifier_block *nfb, unsigned long action, void *hcpu)
@@ -20591,7 +20723,7 @@ index cac85ee..01fa741 100644
        .name                           = "cluster x2apic",
        .probe                          = x2apic_cluster_probe,
 diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c
-index de231e3..1d1b2ee 100644
+index 6d600eb..0300c00 100644
 --- a/arch/x86/kernel/apic/x2apic_phys.c
 +++ b/arch/x86/kernel/apic/x2apic_phys.c
 @@ -88,7 +88,7 @@ static int x2apic_phys_probe(void)
@@ -20604,7 +20736,7 @@ index de231e3..1d1b2ee 100644
        .name                           = "physical x2apic",
        .probe                          = x2apic_phys_probe,
 diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
-index d263b13..963258b 100644
+index 7834389..4ffc9c8 100644
 --- a/arch/x86/kernel/apic/x2apic_uv_x.c
 +++ b/arch/x86/kernel/apic/x2apic_uv_x.c
 @@ -350,7 +350,7 @@ static int uv_probe(void)
@@ -20759,10 +20891,10 @@ index 7fd54f0..0691410 100644
  obj-y                 += proc.o capflags.o powerflags.o common.o
  obj-y                 += rdrand.o
 diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
-index c67ffa6..f41fbbf 100644
+index ce8b8ff..d7d8851 100644
 --- a/arch/x86/kernel/cpu/amd.c
 +++ b/arch/x86/kernel/cpu/amd.c
-@@ -752,7 +752,7 @@ static void init_amd(struct cpuinfo_x86 *c)
+@@ -728,7 +728,7 @@ static void init_amd(struct cpuinfo_x86 *c)
  static unsigned int amd_size_cache(struct cpuinfo_x86 *c, unsigned int size)
  {
        /* AMD errata T13 (order #21922) */
@@ -20772,7 +20904,7 @@ index c67ffa6..f41fbbf 100644
                if (c->x86_model == 3 && c->x86_mask == 0)
                        size = 64;
 diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
-index 8e28bf2..bf5c0d2 100644
+index a135239..41fb30a 100644
 --- a/arch/x86/kernel/cpu/common.c
 +++ b/arch/x86/kernel/cpu/common.c
 @@ -88,60 +88,6 @@ static const struct cpu_dev default_cpu = {
@@ -20927,13 +21059,18 @@ index 8e28bf2..bf5c0d2 100644
        /* If the model name is still unset, do table lookup. */
        if (!c->x86_model_id[0]) {
                const char *p;
-@@ -1078,10 +1085,12 @@ static __init int setup_disablecpuid(char *arg)
+@@ -1079,14 +1086,16 @@ static __init int setup_disablecpuid(char *arg)
  }
  __setup("clearcpuid=", setup_disablecpuid);
  
 +DEFINE_PER_CPU(struct thread_info *, current_tinfo) = &init_task.tinfo;
 +EXPORT_PER_CPU_SYMBOL(current_tinfo);
 +
+ DEFINE_PER_CPU(unsigned long, kernel_stack) =
+-      (unsigned long)&init_thread_union - KERNEL_STACK_OFFSET + THREAD_SIZE;
++      (unsigned long)&init_thread_union - 16 + THREAD_SIZE;
+ EXPORT_PER_CPU_SYMBOL(kernel_stack);
  #ifdef CONFIG_X86_64
 -struct desc_ptr idt_descr = { NR_VECTORS * 16 - 1, (unsigned long) idt_table };
 -struct desc_ptr debug_idt_descr = { NR_VECTORS * 16 - 1,
@@ -20943,16 +21080,7 @@ index 8e28bf2..bf5c0d2 100644
  
  DEFINE_PER_CPU_FIRST(union irq_stack_union,
                     irq_stack_union) __aligned(PAGE_SIZE) __visible;
-@@ -1095,7 +1104,7 @@ DEFINE_PER_CPU(struct task_struct *, current_task) ____cacheline_aligned =
- EXPORT_PER_CPU_SYMBOL(current_task);
- DEFINE_PER_CPU(unsigned long, kernel_stack) =
--      (unsigned long)&init_thread_union - KERNEL_STACK_OFFSET + THREAD_SIZE;
-+      (unsigned long)&init_thread_union - 16 + THREAD_SIZE;
- EXPORT_PER_CPU_SYMBOL(kernel_stack);
- DEFINE_PER_CPU(char *, irq_stack_ptr) =
-@@ -1245,7 +1254,7 @@ void cpu_init(void)
+@@ -1246,7 +1255,7 @@ void cpu_init(void)
        load_ucode_ap();
  
        cpu = stack_smp_processor_id();
@@ -20961,7 +21089,7 @@ index 8e28bf2..bf5c0d2 100644
        oist = &per_cpu(orig_ist, cpu);
  
  #ifdef CONFIG_NUMA
-@@ -1280,7 +1289,6 @@ void cpu_init(void)
+@@ -1281,7 +1290,6 @@ void cpu_init(void)
        wrmsrl(MSR_KERNEL_GS_BASE, 0);
        barrier();
  
@@ -20969,7 +21097,7 @@ index 8e28bf2..bf5c0d2 100644
        enable_x2apic();
  
        /*
-@@ -1332,7 +1340,7 @@ void cpu_init(void)
+@@ -1333,7 +1341,7 @@ void cpu_init(void)
  {
        int cpu = smp_processor_id();
        struct task_struct *curr = current;
@@ -20979,7 +21107,7 @@ index 8e28bf2..bf5c0d2 100644
  
        show_ucode_info_early();
 diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c
-index 0641113..06f5ba4 100644
+index a952e9c..58a4cbb 100644
 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c
 +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c
 @@ -1014,6 +1014,22 @@ static struct attribute *default_attrs[] = {
@@ -21070,7 +21198,7 @@ index 0641113..06f5ba4 100644
                                              "index%1lu", i);
                if (unlikely(retval)) {
 diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
-index 4d5419b..95f11bb 100644
+index 68317c8..c860d41 100644
 --- a/arch/x86/kernel/cpu/mcheck/mce.c
 +++ b/arch/x86/kernel/cpu/mcheck/mce.c
 @@ -45,6 +45,7 @@
@@ -21081,7 +21209,7 @@ index 4d5419b..95f11bb 100644
  
  #include "mce-internal.h"
  
-@@ -258,7 +259,7 @@ static void print_mce(struct mce *m)
+@@ -261,7 +262,7 @@ static void print_mce(struct mce *m)
                        !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "",
                                m->cs, m->ip);
  
@@ -21090,7 +21218,7 @@ index 4d5419b..95f11bb 100644
                        print_symbol("{%s}", m->ip);
                pr_cont("\n");
        }
-@@ -291,10 +292,10 @@ static void print_mce(struct mce *m)
+@@ -294,10 +295,10 @@ static void print_mce(struct mce *m)
  
  #define PANIC_TIMEOUT 5 /* 5 seconds */
  
@@ -21103,7 +21231,7 @@ index 4d5419b..95f11bb 100644
  
  /* Panic in progress. Enable interrupts and wait for final IPI */
  static void wait_for_panic(void)
-@@ -318,7 +319,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
+@@ -321,7 +322,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
                /*
                 * Make sure only one CPU runs in machine check panic
                 */
@@ -21112,7 +21240,7 @@ index 4d5419b..95f11bb 100644
                        wait_for_panic();
                barrier();
  
-@@ -326,7 +327,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
+@@ -329,7 +330,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
                console_verbose();
        } else {
                /* Don't log too much for fake panic */
@@ -21121,7 +21249,7 @@ index 4d5419b..95f11bb 100644
                        return;
        }
        /* First print corrected ones that are still unlogged */
-@@ -365,7 +366,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
+@@ -368,7 +369,7 @@ static void mce_panic(char *msg, struct mce *final, char *exp)
        if (!fake_panic) {
                if (panic_timeout == 0)
                        panic_timeout = mca_cfg.panic_timeout;
@@ -21130,7 +21258,7 @@ index 4d5419b..95f11bb 100644
        } else
                pr_emerg(HW_ERR "Fake kernel panic: %s\n", msg);
  }
-@@ -695,7 +696,7 @@ static int mce_timed_out(u64 *t)
+@@ -699,7 +700,7 @@ static int mce_timed_out(u64 *t)
         * might have been modified by someone else.
         */
        rmb();
@@ -21139,7 +21267,7 @@ index 4d5419b..95f11bb 100644
                wait_for_panic();
        if (!mca_cfg.monarch_timeout)
                goto out;
-@@ -1666,7 +1667,7 @@ static void unexpected_machine_check(struct pt_regs *regs, long error_code)
+@@ -1680,7 +1681,7 @@ static void unexpected_machine_check(struct pt_regs *regs, long error_code)
  }
  
  /* Call the installed machine check handler for this CPU setup. */
@@ -21148,7 +21276,7 @@ index 4d5419b..95f11bb 100644
                                                unexpected_machine_check;
  
  /*
-@@ -1689,7 +1690,9 @@ void mcheck_cpu_init(struct cpuinfo_x86 *c)
+@@ -1703,7 +1704,9 @@ void mcheck_cpu_init(struct cpuinfo_x86 *c)
                return;
        }
  
@@ -21158,7 +21286,7 @@ index 4d5419b..95f11bb 100644
  
        __mcheck_cpu_init_generic();
        __mcheck_cpu_init_vendor(c);
-@@ -1703,7 +1706,7 @@ void mcheck_cpu_init(struct cpuinfo_x86 *c)
+@@ -1717,7 +1720,7 @@ void mcheck_cpu_init(struct cpuinfo_x86 *c)
   */
  
  static DEFINE_SPINLOCK(mce_chrdev_state_lock);
@@ -21167,7 +21295,7 @@ index 4d5419b..95f11bb 100644
  static int mce_chrdev_open_exclu;     /* already open exclusive? */
  
  static int mce_chrdev_open(struct inode *inode, struct file *file)
-@@ -1711,7 +1714,7 @@ static int mce_chrdev_open(struct inode *inode, struct file *file)
+@@ -1725,7 +1728,7 @@ static int mce_chrdev_open(struct inode *inode, struct file *file)
        spin_lock(&mce_chrdev_state_lock);
  
        if (mce_chrdev_open_exclu ||
@@ -21176,7 +21304,7 @@ index 4d5419b..95f11bb 100644
                spin_unlock(&mce_chrdev_state_lock);
  
                return -EBUSY;
-@@ -1719,7 +1722,7 @@ static int mce_chrdev_open(struct inode *inode, struct file *file)
+@@ -1733,7 +1736,7 @@ static int mce_chrdev_open(struct inode *inode, struct file *file)
  
        if (file->f_flags & O_EXCL)
                mce_chrdev_open_exclu = 1;
@@ -21185,7 +21313,7 @@ index 4d5419b..95f11bb 100644
  
        spin_unlock(&mce_chrdev_state_lock);
  
-@@ -1730,7 +1733,7 @@ static int mce_chrdev_release(struct inode *inode, struct file *file)
+@@ -1744,7 +1747,7 @@ static int mce_chrdev_release(struct inode *inode, struct file *file)
  {
        spin_lock(&mce_chrdev_state_lock);
  
@@ -21194,7 +21322,7 @@ index 4d5419b..95f11bb 100644
        mce_chrdev_open_exclu = 0;
  
        spin_unlock(&mce_chrdev_state_lock);
-@@ -2406,7 +2409,7 @@ static __init void mce_init_banks(void)
+@@ -2420,7 +2423,7 @@ static __init void mce_init_banks(void)
  
        for (i = 0; i < mca_cfg.banks; i++) {
                struct mce_bank *b = &mce_banks[i];
@@ -21203,7 +21331,7 @@ index 4d5419b..95f11bb 100644
  
                sysfs_attr_init(&a->attr);
                a->attr.name    = b->attrname;
-@@ -2474,7 +2477,7 @@ struct dentry *mce_get_debugfs_dir(void)
+@@ -2492,7 +2495,7 @@ struct dentry *mce_get_debugfs_dir(void)
  static void mce_reset(void)
  {
        cpu_missing = 0;
@@ -21316,10 +21444,10 @@ index df5e41f..816c719 100644
  extern int generic_get_free_region(unsigned long base, unsigned long size,
                                   int replace_reg);
 diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
-index 79f9f84..38ace52 100644
+index ae407f7..39c5b00 100644
 --- a/arch/x86/kernel/cpu/perf_event.c
 +++ b/arch/x86/kernel/cpu/perf_event.c
-@@ -1351,7 +1351,7 @@ static void __init pmu_check_apic(void)
+@@ -1367,7 +1367,7 @@ static void __init pmu_check_apic(void)
        pr_info("no hardware sampling interrupt available.\n");
  }
  
@@ -21328,7 +21456,7 @@ index 79f9f84..38ace52 100644
        .name = "format",
        .attrs = NULL,
  };
-@@ -1450,7 +1450,7 @@ static struct attribute *events_attr[] = {
+@@ -1466,7 +1466,7 @@ static struct attribute *events_attr[] = {
        NULL,
  };
  
@@ -21337,7 +21465,7 @@ index 79f9f84..38ace52 100644
        .name = "events",
        .attrs = events_attr,
  };
-@@ -1971,7 +1971,7 @@ static unsigned long get_segment_base(unsigned int segment)
+@@ -1990,7 +1990,7 @@ static unsigned long get_segment_base(unsigned int segment)
                if (idx > GDT_ENTRIES)
                        return 0;
  
@@ -21346,7 +21474,7 @@ index 79f9f84..38ace52 100644
        }
  
        return get_desc_base(desc + idx);
-@@ -2061,7 +2061,7 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
+@@ -2080,7 +2080,7 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
                        break;
  
                perf_callchain_store(entry, frame.return_address);
@@ -21369,10 +21497,10 @@ index 639d128..e92d7e5 100644
  
        while (amd_iommu_v2_event_descs[i].attr.attr.name)
 diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
-index aa333d9..f9db700 100644
+index adb02aa..9688c02 100644
 --- a/arch/x86/kernel/cpu/perf_event_intel.c
 +++ b/arch/x86/kernel/cpu/perf_event_intel.c
-@@ -2309,10 +2309,10 @@ __init int intel_pmu_init(void)
+@@ -2308,10 +2308,10 @@ __init int intel_pmu_init(void)
                x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3);
  
        if (boot_cpu_has(X86_FEATURE_PDCM)) {
@@ -21387,10 +21515,10 @@ index aa333d9..f9db700 100644
  
        intel_ds_init();
 diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
-index 5ad35ad..e0a3960 100644
+index 619f769..d510008 100644
 --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c
 +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
-@@ -425,7 +425,7 @@ static struct attribute *rapl_events_cln_attr[] = {
+@@ -449,7 +449,7 @@ static struct attribute *rapl_events_hsw_attr[] = {
        NULL,
  };
  
@@ -21400,10 +21528,10 @@ index 5ad35ad..e0a3960 100644
        .attrs = NULL, /* patched at runtime */
  };
 diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
-index 047f540..afdeba0 100644
+index 65bbbea..1438d9e 100644
 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c
 +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
-@@ -3326,7 +3326,7 @@ static void __init uncore_types_exit(struct intel_uncore_type **types)
+@@ -3693,7 +3693,7 @@ static void __init uncore_types_exit(struct intel_uncore_type **types)
  static int __init uncore_type_init(struct intel_uncore_type *type)
  {
        struct intel_uncore_pmu *pmus;
@@ -21413,10 +21541,10 @@ index 047f540..afdeba0 100644
        int i, j;
  
 diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.h b/arch/x86/kernel/cpu/perf_event_intel_uncore.h
-index a80ab71..4089da5 100644
+index 90236f0..54cb20d 100644
 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.h
 +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.h
-@@ -498,7 +498,7 @@ struct intel_uncore_box {
+@@ -503,7 +503,7 @@ struct intel_uncore_box {
  struct uncore_event_desc {
        struct kobj_attribute attr;
        const char *config;
@@ -21426,7 +21554,7 @@ index a80ab71..4089da5 100644
  #define INTEL_UNCORE_EVENT_DESC(_name, _config)                       \
  {                                                             \
 diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c
-index 7d9481c..99c7e4b 100644
+index 3225ae6c..ee3c6db 100644
 --- a/arch/x86/kernel/cpuid.c
 +++ b/arch/x86/kernel/cpuid.c
 @@ -170,7 +170,7 @@ static int cpuid_class_cpu_callback(struct notifier_block *nfb,
@@ -21439,16 +21567,13 @@ index 7d9481c..99c7e4b 100644
        .notifier_call = cpuid_class_cpu_callback,
  };
 diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
-index a57902e..ebaae2a 100644
+index 507de80..ebaae2a 100644
 --- a/arch/x86/kernel/crash.c
 +++ b/arch/x86/kernel/crash.c
-@@ -57,10 +57,8 @@ static void kdump_nmi_callback(int cpu, struct pt_regs *regs)
- {
+@@ -58,7 +58,7 @@ static void kdump_nmi_callback(int cpu, struct pt_regs *regs)
  #ifdef CONFIG_X86_32
        struct pt_regs fixed_regs;
--#endif
  
--#ifdef CONFIG_X86_32
 -      if (!user_mode_vm(regs)) {
 +      if (!user_mode(regs)) {
                crash_fixup_ss_esp(&fixed_regs, regs);
@@ -21657,30 +21782,28 @@ index d9c12d3..7858b62 100644
  
        if (__die(str, regs, err))
 diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c
-index f2a1770..540657f 100644
+index 5abd4cd..c65733b 100644
 --- a/arch/x86/kernel/dumpstack_32.c
 +++ b/arch/x86/kernel/dumpstack_32.c
-@@ -38,15 +38,13 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+@@ -61,15 +61,14 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
                bp = stack_frame(task, regs);
  
        for (;;) {
 -              struct thread_info *context;
 +              void *stack_start = (void *)((unsigned long)stack & ~(THREAD_SIZE-1));
+               void *end_stack;
  
--              context = (struct thread_info *)
--                      ((unsigned long)stack & (~(THREAD_SIZE - 1)));
--              bp = ops->walk_stack(context, stack, bp, ops, data, NULL, &graph);
-+              bp = ops->walk_stack(task, stack_start, stack, bp, ops, data, NULL, &graph);
+               end_stack = is_hardirq_stack(stack, cpu);
+               if (!end_stack)
+                       end_stack = is_softirq_stack(stack, cpu);
  
--              stack = (unsigned long *)context->previous_esp;
--              if (!stack)
-+              if (stack_start == task_stack_page(task))
-                       break;
-+              stack = *(unsigned long **)stack_start;
-               if (ops->stack(data, "IRQ") < 0)
-                       break;
-               touch_nmi_watchdog();
-@@ -87,27 +85,28 @@ void show_regs(struct pt_regs *regs)
+-              context = task_thread_info(task);
+-              bp = ops->walk_stack(context, stack, bp, ops, data,
++              bp = ops->walk_stack(task, stack_start, stack, bp, ops, data,
+                                    end_stack, &graph);
+               /* Stop if not on irq stack */
+@@ -123,27 +122,28 @@ void show_regs(struct pt_regs *regs)
        int i;
  
        show_regs_print_info(KERN_EMERG);
@@ -21713,7 +21836,7 @@ index f2a1770..540657f 100644
                        code_len = code_len - code_prologue + 1;
                }
                for (i = 0; i < code_len; i++, ip++) {
-@@ -116,7 +115,7 @@ void show_regs(struct pt_regs *regs)
+@@ -152,7 +152,7 @@ void show_regs(struct pt_regs *regs)
                                pr_cont("  Bad EIP value.");
                                break;
                        }
@@ -21722,7 +21845,7 @@ index f2a1770..540657f 100644
                                pr_cont(" <%02x>", c);
                        else
                                pr_cont(" %02x", c);
-@@ -129,6 +128,7 @@ int is_valid_bugaddr(unsigned long ip)
+@@ -165,6 +165,7 @@ int is_valid_bugaddr(unsigned long ip)
  {
        unsigned short ud2;
  
@@ -21730,12 +21853,12 @@ index f2a1770..540657f 100644
        if (ip < PAGE_OFFSET)
                return 0;
        if (probe_kernel_address((unsigned short *)ip, ud2))
-@@ -136,3 +136,15 @@ int is_valid_bugaddr(unsigned long ip)
+@@ -172,3 +173,15 @@ int is_valid_bugaddr(unsigned long ip)
  
        return ud2 == 0x0b0f;
  }
 +
-+#ifdef CONFIG_PAX_MEMORY_STACKLEAK
++#if defined(CONFIG_PAX_MEMORY_STACKLEAK) || defined(CONFIG_PAX_USERCOPY)
 +void pax_check_alloca(unsigned long size)
 +{
 +      unsigned long sp = (unsigned long)&sp, stack_left;
@@ -21747,60 +21870,59 @@ index f2a1770..540657f 100644
 +EXPORT_SYMBOL(pax_check_alloca);
 +#endif
 diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
-index addb207..99635fa 100644
+index 1abcb50..6c8d702 100644
 --- a/arch/x86/kernel/dumpstack_64.c
 +++ b/arch/x86/kernel/dumpstack_64.c
-@@ -119,9 +119,9 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
-       unsigned long *irq_stack_end =
-               (unsigned long *)per_cpu(irq_stack_ptr, cpu);
-       unsigned used = 0;
+@@ -154,12 +154,12 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+               const struct stacktrace_ops *ops, void *data)
+ {
+       const unsigned cpu = get_cpu();
 -      struct thread_info *tinfo;
-       int graph = 0;
+       unsigned long *irq_stack = (unsigned long *)per_cpu(irq_stack_ptr, cpu);
        unsigned long dummy;
+       unsigned used = 0;
+       int graph = 0;
+       int done = 0;
 +      void *stack_start;
  
        if (!task)
                task = current;
-@@ -142,10 +142,10 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+@@ -180,7 +180,6 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
         * current stack address. If the stacks consist of nested
         * exceptions
         */
 -      tinfo = task_thread_info(task);
-       for (;;) {
-               char *id;
-               unsigned long *estack_end;
-+
-               estack_end = in_exception_stack(cpu, (unsigned long)stack,
-                                               &used, &id);
-@@ -153,7 +153,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+       while (!done) {
+               unsigned long *stack_end;
+               enum stack_type stype;
+@@ -203,7 +202,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
                        if (ops->stack(data, id) < 0)
                                break;
  
 -                      bp = ops->walk_stack(tinfo, stack, bp, ops,
-+                      bp = ops->walk_stack(task, estack_end - EXCEPTION_STKSZ, stack, bp, ops,
-                                            data, estack_end, &graph);
++                      bp = ops->walk_stack(task, stack_end - EXCEPTION_STKSZ, stack, bp, ops,
+                                            data, stack_end, &graph);
                        ops->stack(data, "<EOE>");
                        /*
-@@ -161,6 +161,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+@@ -211,6 +210,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
                         * second-to-last pointer (index -2 to end) in the
                         * exception stack:
                         */
-+                      if ((u16)estack_end[-1] != __KERNEL_DS)
++                      if ((u16)stack_end[-1] != __KERNEL_DS)
 +                              goto out;
-                       stack = (unsigned long *) estack_end[-2];
-                       continue;
-               }
-@@ -172,7 +174,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
-                       if (in_irq_stack(stack, irq_stack, irq_stack_end)) {
-                               if (ops->stack(data, "IRQ") < 0)
-                                       break;
--                              bp = ops->walk_stack(tinfo, stack, bp,
-+                              bp = ops->walk_stack(task, irq_stack, stack, bp,
-                                       ops, data, irq_stack_end, &graph);
-                               /*
-                                * We link to the next stack (which would be
-@@ -191,7 +193,9 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+                       stack = (unsigned long *) stack_end[-2];
+                       done = 0;
+                       break;
+@@ -219,7 +220,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
+                       if (ops->stack(data, "IRQ") < 0)
+                               break;
+-                      bp = ops->walk_stack(tinfo, stack, bp,
++                      bp = ops->walk_stack(task, irq_stack, stack, bp,
+                                    ops, data, stack_end, &graph);
+                       /*
+                        * We link to the next stack (which would be
+@@ -241,7 +242,9 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
        /*
         * This handles the process stack:
         */
@@ -21811,12 +21933,12 @@ index addb207..99635fa 100644
        put_cpu();
  }
  EXPORT_SYMBOL(dump_trace);
-@@ -300,3 +304,50 @@ int is_valid_bugaddr(unsigned long ip)
+@@ -350,3 +353,50 @@ int is_valid_bugaddr(unsigned long ip)
  
        return ud2 == 0x0b0f;
  }
 +
-+#ifdef CONFIG_PAX_MEMORY_STACKLEAK
++#if defined(CONFIG_PAX_MEMORY_STACKLEAK) || defined(CONFIG_PAX_USERCOPY)
 +void pax_check_alloca(unsigned long size)
 +{
 +      unsigned long sp = (unsigned long)&sp, stack_start, stack_end;
@@ -21890,7 +22012,7 @@ index 01d1c18..8073693 100644
  #include <asm/processor.h>
  #include <asm/fcntl.h>
 diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
-index a2a4f46..6cab058 100644
+index 6491353..a918952 100644
 --- a/arch/x86/kernel/entry_32.S
 +++ b/arch/x86/kernel/entry_32.S
 @@ -177,13 +177,153 @@
@@ -22167,7 +22289,7 @@ index a2a4f46..6cab058 100644
        testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
        jnz sysenter_audit
  sysenter_do_call:
-@@ -441,12 +613,24 @@ sysenter_do_call:
+@@ -442,12 +614,24 @@ sysenter_after_call:
        testl $_TIF_ALLWORK_MASK, %ecx
        jne sysexit_audit
  sysenter_exit:
@@ -22192,7 +22314,7 @@ index a2a4f46..6cab058 100644
        PTGS_TO_GS
        ENABLE_INTERRUPTS_SYSEXIT
  
-@@ -463,6 +647,9 @@ sysenter_audit:
+@@ -464,6 +648,9 @@ sysenter_audit:
        movl %eax,%edx                  /* 2nd arg: syscall number */
        movl $AUDIT_ARCH_I386,%eax      /* 1st arg: audit arch */
        call __audit_syscall_entry
@@ -22202,7 +22324,7 @@ index a2a4f46..6cab058 100644
        pushl_cfi %ebx
        movl PT_EAX(%esp),%eax          /* reload syscall number */
        jmp sysenter_do_call
-@@ -488,10 +675,16 @@ sysexit_audit:
+@@ -489,10 +676,16 @@ sysexit_audit:
  
        CFI_ENDPROC
  .pushsection .fixup,"ax"
@@ -22221,7 +22343,7 @@ index a2a4f46..6cab058 100644
        PTGS_TO_GS_EX
  ENDPROC(ia32_sysenter_target)
  
-@@ -506,6 +699,11 @@ ENTRY(system_call)
+@@ -507,6 +700,11 @@ ENTRY(system_call)
        pushl_cfi %eax                  # save orig_eax
        SAVE_ALL
        GET_THREAD_INFO(%ebp)
@@ -22233,7 +22355,7 @@ index a2a4f46..6cab058 100644
                                        # system call tracing in operation / emulation
        testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
        jnz syscall_trace_entry
-@@ -524,6 +722,15 @@ syscall_exit:
+@@ -525,6 +723,15 @@ syscall_exit:
        testl $_TIF_ALLWORK_MASK, %ecx  # current->work
        jne syscall_exit_work
  
@@ -22249,7 +22371,7 @@ index a2a4f46..6cab058 100644
  restore_all:
        TRACE_IRQS_IRET
  restore_all_notrace:
-@@ -580,14 +787,34 @@ ldt_ss:
+@@ -576,14 +783,34 @@ ldt_ss:
   * compensating for the offset by changing to the ESPFIX segment with
   * a base address that matches for the difference.
   */
@@ -22287,7 +22409,7 @@ index a2a4f46..6cab058 100644
        pushl_cfi $__ESPFIX_SS
        pushl_cfi %eax                  /* new kernel esp */
        /* Disable interrupts, but do not irqtrace this section: we
-@@ -616,20 +843,18 @@ work_resched:
+@@ -612,20 +839,18 @@ work_resched:
        movl TI_flags(%ebp), %ecx
        andl $_TIF_WORK_MASK, %ecx      # is there any work to be done other
                                        # than syscall tracing?
@@ -22310,7 +22432,7 @@ index a2a4f46..6cab058 100644
  #endif
        TRACE_IRQS_ON
        ENABLE_INTERRUPTS(CLBR_NONE)
-@@ -650,7 +875,7 @@ work_notifysig_v86:
+@@ -646,7 +871,7 @@ work_notifysig_v86:
        movl %eax, %esp
        jmp 1b
  #endif
@@ -22319,7 +22441,7 @@ index a2a4f46..6cab058 100644
  
        # perform syscall exit tracing
        ALIGN
-@@ -658,11 +883,14 @@ syscall_trace_entry:
+@@ -654,11 +879,14 @@ syscall_trace_entry:
        movl $-ENOSYS,PT_EAX(%esp)
        movl %esp, %eax
        call syscall_trace_enter
@@ -22335,7 +22457,7 @@ index a2a4f46..6cab058 100644
  
        # perform syscall exit tracing
        ALIGN
-@@ -675,21 +903,25 @@ syscall_exit_work:
+@@ -671,26 +899,30 @@ syscall_exit_work:
        movl %esp, %eax
        call syscall_trace_leave
        jmp resume_userspace
@@ -22358,13 +22480,19 @@ index a2a4f46..6cab058 100644
  
  syscall_badsys:
        movl $-ENOSYS,PT_EAX(%esp)
-       jmp resume_userspace
+       jmp syscall_exit
 -END(syscall_badsys)
 +ENDPROC(syscall_badsys)
+ sysenter_badsys:
+       movl $-ENOSYS,PT_EAX(%esp)
+       jmp sysenter_after_call
+-END(syscall_badsys)
++ENDPROC(sysenter_badsys)
        CFI_ENDPROC
  /*
   * End of kprobes section
-@@ -705,8 +937,15 @@ END(syscall_badsys)
+@@ -706,8 +938,15 @@ END(syscall_badsys)
   * normal stack and adjusts ESP with the matching offset.
   */
        /* fixup the stack */
@@ -22382,7 +22510,7 @@ index a2a4f46..6cab058 100644
        shl $16, %eax
        addl %esp, %eax                 /* the adjusted stack pointer */
        pushl_cfi $__KERNEL_DS
-@@ -759,7 +998,7 @@ vector=vector+1
+@@ -760,7 +999,7 @@ vector=vector+1
    .endr
  2:    jmp common_interrupt
  .endr
@@ -22391,7 +22519,7 @@ index a2a4f46..6cab058 100644
  
  .previous
  END(interrupt)
-@@ -820,7 +1059,7 @@ ENTRY(coprocessor_error)
+@@ -821,7 +1060,7 @@ ENTRY(coprocessor_error)
        pushl_cfi $do_coprocessor_error
        jmp error_code
        CFI_ENDPROC
@@ -22400,7 +22528,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(simd_coprocessor_error)
        RING0_INT_FRAME
-@@ -833,7 +1072,7 @@ ENTRY(simd_coprocessor_error)
+@@ -834,7 +1073,7 @@ ENTRY(simd_coprocessor_error)
  .section .altinstructions,"a"
        altinstruction_entry 661b, 663f, X86_FEATURE_XMM, 662b-661b, 664f-663f
  .previous
@@ -22409,7 +22537,7 @@ index a2a4f46..6cab058 100644
  663:  pushl $do_simd_coprocessor_error
  664:
  .previous
-@@ -842,7 +1081,7 @@ ENTRY(simd_coprocessor_error)
+@@ -843,7 +1082,7 @@ ENTRY(simd_coprocessor_error)
  #endif
        jmp error_code
        CFI_ENDPROC
@@ -22418,7 +22546,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(device_not_available)
        RING0_INT_FRAME
-@@ -851,18 +1090,18 @@ ENTRY(device_not_available)
+@@ -852,18 +1091,18 @@ ENTRY(device_not_available)
        pushl_cfi $do_device_not_available
        jmp error_code
        CFI_ENDPROC
@@ -22440,7 +22568,7 @@ index a2a4f46..6cab058 100644
  #endif
  
  ENTRY(overflow)
-@@ -872,7 +1111,7 @@ ENTRY(overflow)
+@@ -873,7 +1112,7 @@ ENTRY(overflow)
        pushl_cfi $do_overflow
        jmp error_code
        CFI_ENDPROC
@@ -22449,7 +22577,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(bounds)
        RING0_INT_FRAME
-@@ -881,7 +1120,7 @@ ENTRY(bounds)
+@@ -882,7 +1121,7 @@ ENTRY(bounds)
        pushl_cfi $do_bounds
        jmp error_code
        CFI_ENDPROC
@@ -22458,7 +22586,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(invalid_op)
        RING0_INT_FRAME
-@@ -890,7 +1129,7 @@ ENTRY(invalid_op)
+@@ -891,7 +1130,7 @@ ENTRY(invalid_op)
        pushl_cfi $do_invalid_op
        jmp error_code
        CFI_ENDPROC
@@ -22467,7 +22595,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(coprocessor_segment_overrun)
        RING0_INT_FRAME
-@@ -899,7 +1138,7 @@ ENTRY(coprocessor_segment_overrun)
+@@ -900,7 +1139,7 @@ ENTRY(coprocessor_segment_overrun)
        pushl_cfi $do_coprocessor_segment_overrun
        jmp error_code
        CFI_ENDPROC
@@ -22476,7 +22604,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(invalid_TSS)
        RING0_EC_FRAME
-@@ -907,7 +1146,7 @@ ENTRY(invalid_TSS)
+@@ -908,7 +1147,7 @@ ENTRY(invalid_TSS)
        pushl_cfi $do_invalid_TSS
        jmp error_code
        CFI_ENDPROC
@@ -22485,7 +22613,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(segment_not_present)
        RING0_EC_FRAME
-@@ -915,7 +1154,7 @@ ENTRY(segment_not_present)
+@@ -916,7 +1155,7 @@ ENTRY(segment_not_present)
        pushl_cfi $do_segment_not_present
        jmp error_code
        CFI_ENDPROC
@@ -22494,7 +22622,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(stack_segment)
        RING0_EC_FRAME
-@@ -923,7 +1162,7 @@ ENTRY(stack_segment)
+@@ -924,7 +1163,7 @@ ENTRY(stack_segment)
        pushl_cfi $do_stack_segment
        jmp error_code
        CFI_ENDPROC
@@ -22503,7 +22631,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(alignment_check)
        RING0_EC_FRAME
-@@ -931,7 +1170,7 @@ ENTRY(alignment_check)
+@@ -932,7 +1171,7 @@ ENTRY(alignment_check)
        pushl_cfi $do_alignment_check
        jmp error_code
        CFI_ENDPROC
@@ -22512,7 +22640,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(divide_error)
        RING0_INT_FRAME
-@@ -940,7 +1179,7 @@ ENTRY(divide_error)
+@@ -941,7 +1180,7 @@ ENTRY(divide_error)
        pushl_cfi $do_divide_error
        jmp error_code
        CFI_ENDPROC
@@ -22521,7 +22649,7 @@ index a2a4f46..6cab058 100644
  
  #ifdef CONFIG_X86_MCE
  ENTRY(machine_check)
-@@ -950,7 +1189,7 @@ ENTRY(machine_check)
+@@ -951,7 +1190,7 @@ ENTRY(machine_check)
        pushl_cfi machine_check_vector
        jmp error_code
        CFI_ENDPROC
@@ -22530,7 +22658,7 @@ index a2a4f46..6cab058 100644
  #endif
  
  ENTRY(spurious_interrupt_bug)
-@@ -960,7 +1199,7 @@ ENTRY(spurious_interrupt_bug)
+@@ -961,7 +1200,7 @@ ENTRY(spurious_interrupt_bug)
        pushl_cfi $do_spurious_interrupt_bug
        jmp error_code
        CFI_ENDPROC
@@ -22539,7 +22667,7 @@ index a2a4f46..6cab058 100644
  /*
   * End of kprobes section
   */
-@@ -1070,7 +1309,7 @@ BUILD_INTERRUPT3(hyperv_callback_vector, HYPERVISOR_CALLBACK_VECTOR,
+@@ -1071,7 +1310,7 @@ BUILD_INTERRUPT3(hyperv_callback_vector, HYPERVISOR_CALLBACK_VECTOR,
  
  ENTRY(mcount)
        ret
@@ -22548,7 +22676,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(ftrace_caller)
        cmpl $0, function_trace_stop
-@@ -1103,7 +1342,7 @@ ftrace_graph_call:
+@@ -1104,7 +1343,7 @@ ftrace_graph_call:
  .globl ftrace_stub
  ftrace_stub:
        ret
@@ -22557,7 +22685,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(ftrace_regs_caller)
        pushf   /* push flags before compare (in cs location) */
-@@ -1207,7 +1446,7 @@ trace:
+@@ -1208,7 +1447,7 @@ trace:
        popl %ecx
        popl %eax
        jmp ftrace_stub
@@ -22566,7 +22694,7 @@ index a2a4f46..6cab058 100644
  #endif /* CONFIG_DYNAMIC_FTRACE */
  #endif /* CONFIG_FUNCTION_TRACER */
  
-@@ -1225,7 +1464,7 @@ ENTRY(ftrace_graph_caller)
+@@ -1226,7 +1465,7 @@ ENTRY(ftrace_graph_caller)
        popl %ecx
        popl %eax
        ret
@@ -22575,7 +22703,7 @@ index a2a4f46..6cab058 100644
  
  .globl return_to_handler
  return_to_handler:
-@@ -1291,15 +1530,18 @@ error_code:
+@@ -1292,15 +1531,18 @@ error_code:
        movl $-1, PT_ORIG_EAX(%esp)     # no syscall to restart
        REG_TO_PTGS %ecx
        SET_KERNEL_GS %ecx
@@ -22596,7 +22724,7 @@ index a2a4f46..6cab058 100644
  
  /*
   * Debug traps and NMI can happen at the one SYSENTER instruction
-@@ -1342,7 +1584,7 @@ debug_stack_correct:
+@@ -1343,7 +1585,7 @@ debug_stack_correct:
        call do_debug
        jmp ret_from_exception
        CFI_ENDPROC
@@ -22605,7 +22733,7 @@ index a2a4f46..6cab058 100644
  
  /*
   * NMI is doubly nasty. It can happen _while_ we're handling
-@@ -1380,6 +1622,9 @@ nmi_stack_correct:
+@@ -1381,6 +1623,9 @@ nmi_stack_correct:
        xorl %edx,%edx          # zero error code
        movl %esp,%eax          # pt_regs pointer
        call do_nmi
@@ -22615,7 +22743,7 @@ index a2a4f46..6cab058 100644
        jmp restore_all_notrace
        CFI_ENDPROC
  
-@@ -1416,12 +1661,15 @@ nmi_espfix_stack:
+@@ -1417,12 +1662,15 @@ nmi_espfix_stack:
        FIXUP_ESPFIX_STACK              # %eax == %esp
        xorl %edx,%edx                  # zero error code
        call do_nmi
@@ -22632,7 +22760,7 @@ index a2a4f46..6cab058 100644
  
  ENTRY(int3)
        RING0_INT_FRAME
-@@ -1434,14 +1682,14 @@ ENTRY(int3)
+@@ -1435,14 +1683,14 @@ ENTRY(int3)
        call do_int3
        jmp ret_from_exception
        CFI_ENDPROC
@@ -22649,7 +22777,7 @@ index a2a4f46..6cab058 100644
  
  #ifdef CONFIG_KVM_GUEST
  ENTRY(async_page_fault)
-@@ -1450,7 +1698,7 @@ ENTRY(async_page_fault)
+@@ -1451,7 +1699,7 @@ ENTRY(async_page_fault)
        pushl_cfi $do_async_page_fault
        jmp error_code
        CFI_ENDPROC
@@ -23916,7 +24044,7 @@ index 1e96c36..3ff710a 100644
  /*
   * End of kprobes section
 diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
-index e625319..b9abb9d 100644
+index 52819e8..b6d1dbd 100644
 --- a/arch/x86/kernel/ftrace.c
 +++ b/arch/x86/kernel/ftrace.c
 @@ -104,6 +104,8 @@ ftrace_modify_code_direct(unsigned long ip, unsigned const char *old_code,
@@ -23944,9 +24072,9 @@ index e625319..b9abb9d 100644
 -              ip = (unsigned long)__va(__pa_symbol(ip));
 +              ip = (unsigned long)__va(__pa_symbol(ktla_ktva(ip)));
  
-       return probe_kernel_write((void *)ip, val, size);
- }
-@@ -316,7 +318,7 @@ static int add_break(unsigned long ip, const char *old)
+       if (probe_kernel_write((void *)ip, val, size))
+               return -EPERM;
+@@ -319,7 +321,7 @@ static int add_break(unsigned long ip, const char *old)
        unsigned char replaced[MCOUNT_INSN_SIZE];
        unsigned char brk = BREAKPOINT_INSTRUCTION;
  
@@ -23955,17 +24083,8 @@ index e625319..b9abb9d 100644
                return -EFAULT;
  
        /* Make sure it is what we expect it to be */
-@@ -664,7 +666,7 @@ ftrace_modify_code(unsigned long ip, unsigned const char *old_code,
-       return ret;
-  fail_update:
--      probe_kernel_write((void *)ip, &old_code[0], 1);
-+      probe_kernel_write((void *)ktla_ktva(ip), &old_code[0], 1);
-       goto out;
- }
 diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
-index 85126cc..1bbce17 100644
+index 068054f..c248bcd 100644
 --- a/arch/x86/kernel/head64.c
 +++ b/arch/x86/kernel/head64.c
 @@ -67,12 +67,12 @@ again:
@@ -24009,7 +24128,7 @@ index 85126cc..1bbce17 100644
        }
        pmd = (physaddr & PMD_MASK) + early_pmd_flags;
        pmd_p[pmd_index(address)] = pmd;
-@@ -175,7 +175,6 @@ asmlinkage void __init x86_64_start_kernel(char * real_mode_data)
+@@ -175,7 +175,6 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
        if (console_loglevel == 10)
                early_printk("Kernel alive\n");
  
@@ -24846,10 +24965,10 @@ index 4ddaf66..49d5c18 100644
        regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12);
        t->iopl = level << 12;
 diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
-index d99f31d..1c0f466 100644
+index 11ccfb0..ec1e46f 100644
 --- a/arch/x86/kernel/irq.c
 +++ b/arch/x86/kernel/irq.c
-@@ -21,7 +21,7 @@
+@@ -22,7 +22,7 @@
  #define CREATE_TRACE_POINTS
  #include <asm/trace/irq_vectors.h>
  
@@ -24858,9 +24977,9 @@ index d99f31d..1c0f466 100644
  
  /* Function pointer for generic interrupt vector handling */
  void (*x86_platform_ipi_callback)(void) = NULL;
-@@ -125,9 +125,9 @@ int arch_show_interrupts(struct seq_file *p, int prec)
-               seq_printf(p, "%10u ", per_cpu(mce_poll_count, j));
-       seq_printf(p, "  Machine check polls\n");
+@@ -132,9 +132,9 @@ int arch_show_interrupts(struct seq_file *p, int prec)
+               seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count);
+       seq_printf(p, "  Hypervisor callback interrupts\n");
  #endif
 -      seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count));
 +      seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read_unchecked(&irq_err_count));
@@ -24870,7 +24989,7 @@ index d99f31d..1c0f466 100644
  #endif
        return 0;
  }
-@@ -167,7 +167,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu)
+@@ -174,7 +174,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu)
  
  u64 arch_irq_stat(void)
  {
@@ -24880,10 +24999,19 @@ index d99f31d..1c0f466 100644
  }
  
 diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c
-index d7fcbed..1f747f7 100644
+index 63ce838..2ea3e06 100644
 --- a/arch/x86/kernel/irq_32.c
 +++ b/arch/x86/kernel/irq_32.c
-@@ -39,7 +39,7 @@ static int check_stack_overflow(void)
+@@ -29,6 +29,8 @@ EXPORT_PER_CPU_SYMBOL(irq_regs);
+ #ifdef CONFIG_DEBUG_STACKOVERFLOW
++extern void gr_handle_kernel_exploit(void);
++
+ int sysctl_panic_on_stackoverflow __read_mostly;
+ /* Debugging check for stack overflow: is there less than 1KB free? */
+@@ -39,13 +41,14 @@ static int check_stack_overflow(void)
        __asm__ __volatile__("andl %%esp,%0" :
                             "=r" (sp) : "0" (THREAD_SIZE - 1));
  
@@ -24892,51 +25020,48 @@ index d7fcbed..1f747f7 100644
  }
  
  static void print_stack_overflow(void)
-@@ -59,8 +59,8 @@ static inline void print_stack_overflow(void) { }
-  * per-CPU IRQ handling contexts (thread information and stack)
-  */
- union irq_ctx {
--      struct thread_info      tinfo;
--      u32                     stack[THREAD_SIZE/sizeof(u32)];
-+      unsigned long           previous_esp;
-+      u32                     stack[THREAD_SIZE/sizeof(u32)];
- } __attribute__((aligned(THREAD_SIZE)));
- static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx);
-@@ -80,10 +80,9 @@ static void call_on_stack(void *func, void *stack)
+ {
+       printk(KERN_WARNING "low stack detected by irq handler\n");
+       dump_stack();
++      gr_handle_kernel_exploit();
+       if (sysctl_panic_on_stackoverflow)
+               panic("low stack detected by irq handler - check messages\n");
+ }
+@@ -84,10 +87,9 @@ static inline void *current_stack(void)
  static inline int
  execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)
  {
--      union irq_ctx *curctx, *irqctx;
-+      union irq_ctx *irqctx;
-       u32 *isp, arg1, arg2;
+-      struct irq_stack *curstk, *irqstk;
++      struct irq_stack *irqstk;
+       u32 *isp, *prev_esp, arg1, arg2;
  
--      curctx = (union irq_ctx *) current_thread_info();
-       irqctx = __this_cpu_read(hardirq_ctx);
+-      curstk = (struct irq_stack *) current_stack();
+       irqstk = __this_cpu_read(hardirq_stack);
  
        /*
-@@ -92,13 +91,16 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)
+@@ -96,15 +98,19 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)
         * handler) we can't do that and just have to keep using the
         * current stack (which is the irq stack already after all)
         */
--      if (unlikely(curctx == irqctx))
-+      if (unlikely((void *)current_stack_pointer - (void *)irqctx < THREAD_SIZE))
+-      if (unlikely(curstk == irqstk))
++      if (unlikely((void *)current_stack_pointer - (void *)irqstk < THREAD_SIZE))
                return 0;
  
-       /* build the stack frame on the IRQ stack */
--      isp = (u32 *) ((char *)irqctx + sizeof(*irqctx));
--      irqctx->tinfo.task = curctx->tinfo.task;
--      irqctx->tinfo.previous_esp = current_stack_pointer;
-+      isp = (u32 *) ((char *)irqctx + sizeof(*irqctx) - 8);
-+      irqctx->previous_esp = current_stack_pointer;
-+
+-      isp = (u32 *) ((char *)irqstk + sizeof(*irqstk));
++      isp = (u32 *) ((char *)irqstk + sizeof(*irqstk) - 8);
+       /* Save the next esp at the bottom of the stack */
+       prev_esp = (u32 *)irqstk;
+       *prev_esp = current_stack_pointer;
 +#ifdef CONFIG_PAX_MEMORY_UDEREF
 +      __set_fs(MAKE_MM_SEG(0));
 +#endif
++
        if (unlikely(overflow))
                call_on_stack(print_stack_overflow, isp);
-@@ -110,6 +112,11 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)
+@@ -115,6 +121,11 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)
                     :  "0" (irq),   "1" (desc),  "2" (isp),
                        "D" (desc->handle_irq)
                     : "memory", "cc", "ecx");
@@ -24948,59 +25073,49 @@ index d7fcbed..1f747f7 100644
        return 1;
  }
  
-@@ -118,48 +125,34 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)
+@@ -123,32 +134,18 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq)
   */
  void irq_ctx_init(int cpu)
  {
--      union irq_ctx *irqctx;
+-      struct irq_stack *irqstk;
 -
-       if (per_cpu(hardirq_ctx, cpu))
+       if (per_cpu(hardirq_stack, cpu))
                return;
  
--      irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
+-      irqstk = page_address(alloc_pages_node(cpu_to_node(cpu),
 -                                             THREADINFO_GFP,
 -                                             THREAD_SIZE_ORDER));
--      memset(&irqctx->tinfo, 0, sizeof(struct thread_info));
--      irqctx->tinfo.cpu               = cpu;
--      irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
--
--      per_cpu(hardirq_ctx, cpu) = irqctx;
+-      per_cpu(hardirq_stack, cpu) = irqstk;
 -
--      irqctx = page_address(alloc_pages_node(cpu_to_node(cpu),
+-      irqstk = page_address(alloc_pages_node(cpu_to_node(cpu),
 -                                             THREADINFO_GFP,
 -                                             THREAD_SIZE_ORDER));
--      memset(&irqctx->tinfo, 0, sizeof(struct thread_info));
--      irqctx->tinfo.cpu               = cpu;
--      irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
--
--      per_cpu(softirq_ctx, cpu) = irqctx;
+-      per_cpu(softirq_stack, cpu) = irqstk;
 -
 -      printk(KERN_DEBUG "CPU %u irqstacks, hard=%p soft=%p\n",
--             cpu, per_cpu(hardirq_ctx, cpu),  per_cpu(softirq_ctx, cpu));
-+      per_cpu(hardirq_ctx, cpu) = page_address(alloc_pages_node(cpu_to_node(cpu), THREADINFO_GFP, THREAD_SIZE_ORDER));
-+      per_cpu(softirq_ctx, cpu) = page_address(alloc_pages_node(cpu_to_node(cpu), THREADINFO_GFP, THREAD_SIZE_ORDER));
+-             cpu, per_cpu(hardirq_stack, cpu),  per_cpu(softirq_stack, cpu));
++      per_cpu(hardirq_stack, cpu) = page_address(alloc_pages_node(cpu_to_node(cpu), THREADINFO_GFP, THREAD_SIZE_ORDER));
++      per_cpu(softirq_stack, cpu) = page_address(alloc_pages_node(cpu_to_node(cpu), THREADINFO_GFP, THREAD_SIZE_ORDER));
  }
  
  void do_softirq_own_stack(void)
  {
--      struct thread_info *curctx;
-       union irq_ctx *irqctx;
-       u32 *isp;
+-      struct thread_info *curstk;
+       struct irq_stack *irqstk;
+       u32 *isp, *prev_esp;
  
--      curctx = current_thread_info();
-       irqctx = __this_cpu_read(softirq_ctx);
--      irqctx->tinfo.task = curctx->task;
--      irqctx->tinfo.previous_esp = current_stack_pointer;
-+      irqctx->previous_esp = current_stack_pointer;
+-      curstk = current_stack();
+       irqstk = __this_cpu_read(softirq_stack);
  
        /* build the stack frame on the softirq stack */
--      isp = (u32 *) ((char *)irqctx + sizeof(*irqctx));
-+      isp = (u32 *) ((char *)irqctx + sizeof(*irqctx) - 8);
-+
+@@ -158,7 +155,16 @@ void do_softirq_own_stack(void)
+       prev_esp = (u32 *)irqstk;
+       *prev_esp = current_stack_pointer;
 +#ifdef CONFIG_PAX_MEMORY_UDEREF
 +      __set_fs(MAKE_MM_SEG(0));
 +#endif
++
        call_on_stack(__do_softirq, isp);
 +
 +#ifdef CONFIG_PAX_MEMORY_UDEREF
@@ -25010,7 +25125,7 @@ index d7fcbed..1f747f7 100644
  }
  
  bool handle_irq(unsigned irq, struct pt_regs *regs)
-@@ -173,7 +166,7 @@ bool handle_irq(unsigned irq, struct pt_regs *regs)
+@@ -172,7 +178,7 @@ bool handle_irq(unsigned irq, struct pt_regs *regs)
        if (unlikely(!desc))
                return false;
  
@@ -25020,10 +25135,19 @@ index d7fcbed..1f747f7 100644
                        print_stack_overflow();
                desc->handle_irq(irq, desc);
 diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c
-index 4d1c746..232961d 100644
+index 4d1c746..55a22d6 100644
 --- a/arch/x86/kernel/irq_64.c
 +++ b/arch/x86/kernel/irq_64.c
-@@ -44,7 +44,7 @@ static inline void stack_overflow_check(struct pt_regs *regs)
+@@ -26,6 +26,8 @@ EXPORT_PER_CPU_SYMBOL(irq_stat);
+ DEFINE_PER_CPU(struct pt_regs *, irq_regs);
+ EXPORT_PER_CPU_SYMBOL(irq_regs);
++extern void gr_handle_kernel_exploit(void);
++
+ int sysctl_panic_on_stackoverflow;
+ /*
+@@ -44,7 +46,7 @@ static inline void stack_overflow_check(struct pt_regs *regs)
        u64 estack_top, estack_bottom;
        u64 curbase = (u64)task_stack_page(current);
  
@@ -25032,6 +25156,15 @@ index 4d1c746..232961d 100644
                return;
  
        if (regs->sp >= curbase + sizeof(struct thread_info) +
+@@ -69,6 +71,8 @@ static inline void stack_overflow_check(struct pt_regs *regs)
+               irq_stack_top, irq_stack_bottom,
+               estack_top, estack_bottom);
++      gr_handle_kernel_exploit();
++
+       if (sysctl_panic_on_stackoverflow)
+               panic("low stack detected by irq handler - check messages\n");
+ #endif
 diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
 index 26d5a55..a01160a 100644
 --- a/arch/x86/kernel/jump_label.c
@@ -25164,7 +25297,7 @@ index 7ec1d5f..5a7d130 100644
  }
  
 diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
-index 79a3f96..6ba030a 100644
+index 61b17dc..784bfe9 100644
 --- a/arch/x86/kernel/kprobes/core.c
 +++ b/arch/x86/kernel/kprobes/core.c
 @@ -119,9 +119,12 @@ static void __kprobes __synthesize_relative_insn(void *from, void *to, u8 op)
@@ -25271,7 +25404,7 @@ index 79a3f96..6ba030a 100644
        unsigned long orig_ip = (unsigned long)p->addr;
        kprobe_opcode_t *insn = p->ainsn.insn;
  
-@@ -961,7 +971,7 @@ kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, void *d
+@@ -959,7 +969,7 @@ kprobe_exceptions_notify(struct notifier_block *self, unsigned long val, void *d
        struct die_args *args = data;
        int ret = NOTIFY_DONE;
  
@@ -25350,7 +25483,7 @@ index 898160b..758cde8 100644
                        reset_current_kprobe();
                preempt_enable_no_resched();
 diff --git a/arch/x86/kernel/ksysfs.c b/arch/x86/kernel/ksysfs.c
-index c2bedae..25e7ab6 100644
+index c2bedae..25e7ab60 100644
 --- a/arch/x86/kernel/ksysfs.c
 +++ b/arch/x86/kernel/ksysfs.c
 @@ -184,7 +184,7 @@ out:
@@ -25363,10 +25496,10 @@ index c2bedae..25e7ab6 100644
                .name = "data",
                .mode = S_IRUGO,
 diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c
-index ebc9873..37b8776 100644
+index dcbbaa1..81ae763 100644
 --- a/arch/x86/kernel/ldt.c
 +++ b/arch/x86/kernel/ldt.c
-@@ -66,13 +66,13 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int reload)
+@@ -68,13 +68,13 @@ static int alloc_ldt(mm_context_t *pc, int mincount, int reload)
        if (reload) {
  #ifdef CONFIG_SMP
                preempt_disable();
@@ -25382,7 +25515,7 @@ index ebc9873..37b8776 100644
  #endif
        }
        if (oldsize) {
-@@ -94,7 +94,7 @@ static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
+@@ -96,7 +96,7 @@ static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
                return err;
  
        for (i = 0; i < old->size; i++)
@@ -25391,7 +25524,7 @@ index ebc9873..37b8776 100644
        return 0;
  }
  
-@@ -115,6 +115,24 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
+@@ -117,6 +117,24 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
                retval = copy_ldt(&mm->context, &old_mm->context);
                mutex_unlock(&old_mm->context.lock);
        }
@@ -25416,7 +25549,7 @@ index ebc9873..37b8776 100644
        return retval;
  }
  
-@@ -229,6 +247,24 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
+@@ -231,6 +249,13 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
                }
        }
  
@@ -25427,20 +25560,9 @@ index ebc9873..37b8776 100644
 +      }
 +#endif
 +
-+      /*
-+       * On x86-64 we do not support 16-bit segments due to
-+       * IRET leaking the high bits of the kernel stack address.
-+       */
-+#ifdef CONFIG_X86_64
-+      if (!ldt_info.seg_32bit) {
-+              error = -EINVAL;
-+              goto out_unlock;
-+      }
-+#endif
-+
-       fill_ldt(&ldt, &ldt_info);
-       if (oldmode)
-               ldt.avl = 0;
+       /*
+        * On x86-64 we do not support 16-bit segments due to
+        * IRET leaking the high bits of the kernel stack address.
 diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
 index 1667b1d..16492c5 100644
 --- a/arch/x86/kernel/machine_kexec_32.c
@@ -25473,11 +25595,11 @@ index 1667b1d..16492c5 100644
        relocate_kernel_ptr = control_page;
        page_list[PA_CONTROL_PAGE] = __pa(control_page);
 diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
-index 18be189..4a9fe40 100644
+index e69f988..da078ea 100644
 --- a/arch/x86/kernel/module.c
 +++ b/arch/x86/kernel/module.c
-@@ -43,15 +43,60 @@ do {                                                       \
- } while (0)
+@@ -81,17 +81,62 @@ static unsigned long int get_module_load_offset(void)
+ }
  #endif
  
 -void *module_alloc(unsigned long size)
@@ -25486,10 +25608,13 @@ index 18be189..4a9fe40 100644
 -      if (PAGE_ALIGN(size) > MODULES_LEN)
 +      if (!size || PAGE_ALIGN(size) > MODULES_LEN)
                return NULL;
-       return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
--                              GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC,
-+                              GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, prot,
-                               NUMA_NO_NODE, __builtin_return_address(0));
+       return __vmalloc_node_range(size, 1,
+                                   MODULES_VADDR + get_module_load_offset(),
+-                                  MODULES_END, GFP_KERNEL | __GFP_HIGHMEM,
+-                                  PAGE_KERNEL_EXEC, NUMA_NO_NODE,
++                                  MODULES_END, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO,
++                                  prot, NUMA_NO_NODE,
+                                   __builtin_return_address(0));
  }
  
 +void *module_alloc(unsigned long size)
@@ -25513,7 +25638,7 @@ index 18be189..4a9fe40 100644
 +              return NULL;
 +
 +      area = __get_vm_area(size, VM_ALLOC, (unsigned long)&MODULES_EXEC_VADDR, (unsigned long)&MODULES_EXEC_END);
-+      return area ? area->addr : NULL;
++return area ? area->addr : NULL;
 +}
 +EXPORT_SYMBOL(module_alloc_exec);
 +
@@ -25540,7 +25665,7 @@ index 18be189..4a9fe40 100644
  #ifdef CONFIG_X86_32
  int apply_relocate(Elf32_Shdr *sechdrs,
                   const char *strtab,
-@@ -62,14 +107,16 @@ int apply_relocate(Elf32_Shdr *sechdrs,
+@@ -102,14 +147,16 @@ int apply_relocate(Elf32_Shdr *sechdrs,
        unsigned int i;
        Elf32_Rel *rel = (void *)sechdrs[relsec].sh_addr;
        Elf32_Sym *sym;
@@ -25560,7 +25685,7 @@ index 18be189..4a9fe40 100644
                /* This is the symbol it is referring to.  Note that all
                   undefined symbols have been resolved.  */
                sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
-@@ -78,11 +125,15 @@ int apply_relocate(Elf32_Shdr *sechdrs,
+@@ -118,11 +165,15 @@ int apply_relocate(Elf32_Shdr *sechdrs,
                switch (ELF32_R_TYPE(rel[i].r_info)) {
                case R_386_32:
                        /* We add the value into the location given */
@@ -25578,7 +25703,7 @@ index 18be189..4a9fe40 100644
                        break;
                default:
                        pr_err("%s: Unknown relocation: %u\n",
-@@ -127,21 +178,30 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
+@@ -167,21 +218,30 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
                case R_X86_64_NONE:
                        break;
                case R_X86_64_64:
@@ -25610,7 +25735,7 @@ index 18be189..4a9fe40 100644
                        if ((s64)val != *(s32 *)loc)
                                goto overflow;
 diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c
-index 05266b5..3432443 100644
+index c9603ac..9f88728 100644
 --- a/arch/x86/kernel/msr.c
 +++ b/arch/x86/kernel/msr.c
 @@ -37,6 +37,7 @@
@@ -25654,10 +25779,45 @@ index 05266b5..3432443 100644
  };
  
 diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c
-index 6fcb49c..5b3f4ff 100644
+index b4872b9..5bf0684 100644
 --- a/arch/x86/kernel/nmi.c
 +++ b/arch/x86/kernel/nmi.c
-@@ -138,7 +138,7 @@ static int __kprobes nmi_handle(unsigned int type, struct pt_regs *regs, bool b2
+@@ -98,16 +98,16 @@ fs_initcall(nmi_warning_debugfs);
+ static void nmi_max_handler(struct irq_work *w)
+ {
+-      struct nmiaction *a = container_of(w, struct nmiaction, irq_work);
++      struct nmiwork *n = container_of(w, struct nmiwork, irq_work);
+       int remainder_ns, decimal_msecs;
+-      u64 whole_msecs = ACCESS_ONCE(a->max_duration);
++      u64 whole_msecs = ACCESS_ONCE(n->max_duration);
+       remainder_ns = do_div(whole_msecs, (1000 * 1000));
+       decimal_msecs = remainder_ns / 1000;
+       printk_ratelimited(KERN_INFO
+               "INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n",
+-              a->handler, whole_msecs, decimal_msecs);
++              n->action->handler, whole_msecs, decimal_msecs);
+ }
+ static int __kprobes nmi_handle(unsigned int type, struct pt_regs *regs, bool b2b)
+@@ -134,11 +134,11 @@ static int __kprobes nmi_handle(unsigned int type, struct pt_regs *regs, bool b2
+               delta = sched_clock() - delta;
+               trace_nmi_handler(a->handler, (int)delta, thishandled);
+-              if (delta < nmi_longest_ns || delta < a->max_duration)
++              if (delta < nmi_longest_ns || delta < a->work->max_duration)
+                       continue;
+-              a->max_duration = delta;
+-              irq_work_queue(&a->irq_work);
++              a->work->max_duration = delta;
++              irq_work_queue(&a->work->irq_work);
+       }
+       rcu_read_unlock();
+@@ -147,7 +147,7 @@ static int __kprobes nmi_handle(unsigned int type, struct pt_regs *regs, bool b2
        return handled;
  }
  
@@ -25666,7 +25826,17 @@ index 6fcb49c..5b3f4ff 100644
  {
        struct nmi_desc *desc = nmi_to_desc(type);
        unsigned long flags;
-@@ -162,9 +162,9 @@ int __register_nmi_handler(unsigned int type, struct nmiaction *action)
+@@ -155,7 +155,8 @@ int __register_nmi_handler(unsigned int type, struct nmiaction *action)
+       if (!action->handler)
+               return -EINVAL;
+-      init_irq_work(&action->irq_work, nmi_max_handler);
++      action->work->action = action;
++      init_irq_work(&action->work->irq_work, nmi_max_handler);
+       spin_lock_irqsave(&desc->lock, flags);
+@@ -173,9 +174,9 @@ int __register_nmi_handler(unsigned int type, struct nmiaction *action)
         * event confuses some handlers (kdump uses this flag)
         */
        if (action->flags & NMI_FLAG_FIRST)
@@ -25678,7 +25848,7 @@ index 6fcb49c..5b3f4ff 100644
        
        spin_unlock_irqrestore(&desc->lock, flags);
        return 0;
-@@ -187,7 +187,7 @@ void unregister_nmi_handler(unsigned int type, const char *name)
+@@ -198,7 +199,7 @@ void unregister_nmi_handler(unsigned int type, const char *name)
                if (!strcmp(n->name, name)) {
                        WARN(in_nmi(),
                                "Trying to free NMI (%s) from NMI context!\n", n->name);
@@ -25687,7 +25857,7 @@ index 6fcb49c..5b3f4ff 100644
                        break;
                }
        }
-@@ -512,6 +512,17 @@ static inline void nmi_nesting_postprocess(void)
+@@ -523,6 +524,17 @@ static inline void nmi_nesting_postprocess(void)
  dotraplinkage notrace __kprobes void
  do_nmi(struct pt_regs *regs, long error_code)
  {
@@ -25741,7 +25911,7 @@ index bbb6c73..24a58ef 100644
        .lock_spinning = __PV_IS_CALLEE_SAVE(paravirt_nop),
        .unlock_kick = paravirt_nop,
 diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
-index 1b10af8..0b58cbc 100644
+index 1b10af8..45bfbec 100644
 --- a/arch/x86/kernel/paravirt.c
 +++ b/arch/x86/kernel/paravirt.c
 @@ -55,6 +55,9 @@ u64 _paravirt_ident_64(u64 x)
@@ -25754,11 +25924,13 @@ index 1b10af8..0b58cbc 100644
  
  void __init default_banner(void)
  {
-@@ -142,15 +145,19 @@ unsigned paravirt_patch_default(u8 type, u16 clobbers, void *insnbuf,
+@@ -141,16 +144,20 @@ unsigned paravirt_patch_default(u8 type, u16 clobbers, void *insnbuf,
        if (opfunc == NULL)
                /* If there's no function, patch it with a ud2a (BUG) */
-               ret = paravirt_patch_insns(insnbuf, len, ud2a, ud2a+sizeof(ud2a));
+-              ret = paravirt_patch_insns(insnbuf, len, ud2a, ud2a+sizeof(ud2a));
 -      else if (opfunc == _paravirt_nop)
++              ret = paravirt_patch_insns(insnbuf, len, ktva_ktla(ud2a), ud2a+sizeof(ud2a));
 +      else if (opfunc == (void *)_paravirt_nop)
                /* If the operation is a nop, then nop the callsite */
                ret = paravirt_patch_nop();
@@ -25876,10 +26048,10 @@ index 1b10af8..0b58cbc 100644
  
  EXPORT_SYMBOL_GPL(pv_time_ops);
 diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c
-index 299d493..2ccb0ee 100644
+index 0497f71..7186c0d 100644
 --- a/arch/x86/kernel/pci-calgary_64.c
 +++ b/arch/x86/kernel/pci-calgary_64.c
-@@ -1339,7 +1339,7 @@ static void __init get_tce_space_from_tar(void)
+@@ -1347,7 +1347,7 @@ static void __init get_tce_space_from_tar(void)
                        tce_space = be64_to_cpu(readq(target));
                        tce_space = tce_space & TAR_SW_BITS;
  
@@ -25942,7 +26114,7 @@ index ca7f0d5..8996469 100644
        CFI_ENDPROC
  
 diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
-index 3fb8d95..254dc51 100644
+index 4505e2a..ae28b0d 100644
 --- a/arch/x86/kernel/process.c
 +++ b/arch/x86/kernel/process.c
 @@ -36,7 +36,8 @@
@@ -25992,7 +26164,7 @@ index 3fb8d95..254dc51 100644
                return;
        __exit_idle();
  }
-@@ -327,7 +331,7 @@ bool xen_set_default_idle(void)
+@@ -324,7 +328,7 @@ bool xen_set_default_idle(void)
        return ret;
  }
  #endif
@@ -26001,7 +26173,7 @@ index 3fb8d95..254dc51 100644
  {
        local_irq_disable();
        /*
-@@ -456,16 +460,37 @@ static int __init idle_setup(char *str)
+@@ -453,16 +457,37 @@ static int __init idle_setup(char *str)
  }
  early_param("idle", idle_setup);
  
@@ -26050,7 +26222,7 @@ index 3fb8d95..254dc51 100644
 +}
 +#endif
 diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
-index 0de43e9..056b840 100644
+index 7bc86bb..0ea06e8 100644
 --- a/arch/x86/kernel/process_32.c
 +++ b/arch/x86/kernel/process_32.c
 @@ -64,6 +64,7 @@ asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread");
@@ -26130,17 +26302,20 @@ index 0de43e9..056b840 100644
        /*
         * Load the per-thread Thread-Local Storage descriptor.
         */
-@@ -314,6 +319,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
+@@ -314,9 +319,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
         */
        arch_end_context_switch(next_p);
  
+-      this_cpu_write(kernel_stack,
+-                (unsigned long)task_stack_page(next_p) +
+-                THREAD_SIZE - KERNEL_STACK_OFFSET);
 +      this_cpu_write(current_task, next_p);
 +      this_cpu_write(current_tinfo, &next_p->tinfo);
-+
++      this_cpu_write(kernel_stack, next->sp0);
        /*
         * Restore %gs if needed (which is common)
-        */
-@@ -322,8 +330,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
+@@ -326,8 +331,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
  
        switch_fpu_finish(next_p, fpu);
  
@@ -26149,13 +26324,13 @@ index 0de43e9..056b840 100644
        return prev_p;
  }
  
-@@ -353,4 +359,3 @@ unsigned long get_wchan(struct task_struct *p)
+@@ -357,4 +360,3 @@ unsigned long get_wchan(struct task_struct *p)
        } while (count++ < 16);
        return 0;
  }
 -
 diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
-index 9c0280f..5bbb1c0 100644
+index 898d077..4c458ff 100644
 --- a/arch/x86/kernel/process_64.c
 +++ b/arch/x86/kernel/process_64.c
 @@ -158,10 +158,11 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
@@ -26234,29 +26409,44 @@ index 9c0280f..5bbb1c0 100644
                ip = *(u64 *)(fp+8);
                if (!in_sched_functions(ip))
 diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
-index 7461f50..1334029 100644
+index 678c0ad..2fc2a7b 100644
 --- a/arch/x86/kernel/ptrace.c
 +++ b/arch/x86/kernel/ptrace.c
-@@ -184,14 +184,13 @@ unsigned long kernel_stack_pointer(struct pt_regs *regs)
- {
-       unsigned long context = (unsigned long)regs & ~(THREAD_SIZE - 1);
+@@ -186,10 +186,10 @@ unsigned long kernel_stack_pointer(struct pt_regs *regs)
        unsigned long sp = (unsigned long)&regs->sp;
--      struct thread_info *tinfo;
+       u32 *prev_esp;
  
 -      if (context == (sp & ~(THREAD_SIZE - 1)))
 +      if (context == ((sp + 8) & ~(THREAD_SIZE - 1)))
                return sp;
  
--      tinfo = (struct thread_info *)context;
--      if (tinfo->previous_esp)
--              return tinfo->previous_esp;
-+      sp = *(unsigned long *)context;
-+      if (sp)
-+              return sp;
+-      prev_esp = (u32 *)(context);
++      prev_esp = *(u32 **)(context);
+       if (prev_esp)
+               return (unsigned long)prev_esp;
  
-       return (unsigned long)regs;
- }
-@@ -588,7 +587,7 @@ static void ptrace_triggered(struct perf_event *bp,
+@@ -452,6 +452,20 @@ static int putreg(struct task_struct *child,
+               if (child->thread.gs != value)
+                       return do_arch_prctl(child, ARCH_SET_GS, value);
+               return 0;
++
++      case offsetof(struct user_regs_struct,ip):
++              /*
++               * Protect against any attempt to set ip to an
++               * impossible address.  There are dragons lurking if the
++               * address is noncanonical.  (This explicitly allows
++               * setting ip to TASK_SIZE_MAX, because user code can do
++               * that all by itself by running off the end of its
++               * address space.
++               */
++              if (value > TASK_SIZE_MAX)
++                      return -EIO;
++              break;
++
+ #endif
+       }
+@@ -588,7 +602,7 @@ static void ptrace_triggered(struct perf_event *bp,
  static unsigned long ptrace_get_dr7(struct perf_event *bp[])
  {
        int i;
@@ -26265,7 +26455,7 @@ index 7461f50..1334029 100644
        struct arch_hw_breakpoint *info;
  
        for (i = 0; i < HBP_NUM; i++) {
-@@ -822,7 +821,7 @@ long arch_ptrace(struct task_struct *child, long request,
+@@ -822,7 +836,7 @@ long arch_ptrace(struct task_struct *child, long request,
                 unsigned long addr, unsigned long data)
  {
        int ret;
@@ -26274,7 +26464,7 @@ index 7461f50..1334029 100644
  
        switch (request) {
        /* read the word at location addr in the USER area. */
-@@ -907,14 +906,14 @@ long arch_ptrace(struct task_struct *child, long request,
+@@ -907,14 +921,14 @@ long arch_ptrace(struct task_struct *child, long request,
                if ((int) addr < 0)
                        return -EIO;
                ret = do_get_thread_area(child, addr,
@@ -26291,7 +26481,7 @@ index 7461f50..1334029 100644
                break;
  #endif
  
-@@ -1292,7 +1291,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
+@@ -1292,7 +1306,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
  
  #ifdef CONFIG_X86_64
  
@@ -26300,7 +26490,7 @@ index 7461f50..1334029 100644
        [REGSET_GENERAL] = {
                .core_note_type = NT_PRSTATUS,
                .n = sizeof(struct user_regs_struct) / sizeof(long),
-@@ -1333,7 +1332,7 @@ static const struct user_regset_view user_x86_64_view = {
+@@ -1333,7 +1347,7 @@ static const struct user_regset_view user_x86_64_view = {
  #endif        /* CONFIG_X86_64 */
  
  #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
@@ -26309,7 +26499,7 @@ index 7461f50..1334029 100644
        [REGSET_GENERAL] = {
                .core_note_type = NT_PRSTATUS,
                .n = sizeof(struct user_regs_struct32) / sizeof(u32),
-@@ -1386,7 +1385,7 @@ static const struct user_regset_view user_x86_32_view = {
+@@ -1386,7 +1400,7 @@ static const struct user_regset_view user_x86_32_view = {
   */
  u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
  
@@ -26318,7 +26508,7 @@ index 7461f50..1334029 100644
  {
  #ifdef CONFIG_X86_64
        x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64);
-@@ -1421,7 +1420,7 @@ static void fill_sigtrap_info(struct task_struct *tsk,
+@@ -1421,7 +1435,7 @@ static void fill_sigtrap_info(struct task_struct *tsk,
        memset(info, 0, sizeof(*info));
        info->si_signo = SIGTRAP;
        info->si_code = si_code;
@@ -26327,7 +26517,7 @@ index 7461f50..1334029 100644
  }
  
  void user_single_step_siginfo(struct task_struct *tsk,
-@@ -1450,6 +1449,10 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
+@@ -1450,6 +1464,10 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
  # define IS_IA32      0
  #endif
  
@@ -26338,7 +26528,7 @@ index 7461f50..1334029 100644
  /*
   * We must return the syscall number to actually look up in the table.
   * This can be -1L to skip running any syscall at all.
-@@ -1460,6 +1463,11 @@ long syscall_trace_enter(struct pt_regs *regs)
+@@ -1460,6 +1478,11 @@ long syscall_trace_enter(struct pt_regs *regs)
  
        user_exit();
  
@@ -26350,7 +26540,7 @@ index 7461f50..1334029 100644
        /*
         * If we stepped into a sysenter/syscall insn, it trapped in
         * kernel mode; do_debug() cleared TF and set TIF_SINGLESTEP.
-@@ -1515,6 +1523,11 @@ void syscall_trace_leave(struct pt_regs *regs)
+@@ -1515,6 +1538,11 @@ void syscall_trace_leave(struct pt_regs *regs)
         */
        user_exit();
  
@@ -26395,7 +26585,7 @@ index 2f355d2..e75ed0a 100644
  
        return ret;
 diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
-index c752cb4..866c432 100644
+index 52b1157..c6e67c4 100644
 --- a/arch/x86/kernel/reboot.c
 +++ b/arch/x86/kernel/reboot.c
 @@ -68,6 +68,11 @@ static int __init set_bios_reboot(const struct dmi_system_id *d)
@@ -26441,16 +26631,16 @@ index c752cb4..866c432 100644
                     "rm" (real_mode_header->machine_real_restart_asm),
                     "a" (type));
  #else
-@@ -470,7 +497,7 @@ void __attribute__((weak)) mach_reboot_fixups(void)
-  * try to force a triple fault and then cycle between hitting the keyboard
-  * controller and doing that
+@@ -486,7 +513,7 @@ void __attribute__((weak)) mach_reboot_fixups(void)
+  * This means that this function can never return, it can misbehave
+  * by not rebooting properly and hanging.
   */
 -static void native_machine_emergency_restart(void)
 +static void __noreturn native_machine_emergency_restart(void)
  {
        int i;
        int attempt = 0;
-@@ -593,13 +620,13 @@ void native_machine_shutdown(void)
+@@ -610,13 +637,13 @@ void native_machine_shutdown(void)
  #endif
  }
  
@@ -26466,7 +26656,7 @@ index c752cb4..866c432 100644
  {
        pr_notice("machine restart\n");
  
-@@ -608,7 +635,7 @@ static void native_machine_restart(char *__unused)
+@@ -625,7 +652,7 @@ static void native_machine_restart(char *__unused)
        __machine_emergency_restart(0);
  }
  
@@ -26475,7 +26665,7 @@ index c752cb4..866c432 100644
  {
        /* Stop other cpus and apics */
        machine_shutdown();
-@@ -618,7 +645,7 @@ static void native_machine_halt(void)
+@@ -635,7 +662,7 @@ static void native_machine_halt(void)
        stop_this_cpu(NULL);
  }
  
@@ -26484,7 +26674,7 @@ index c752cb4..866c432 100644
  {
        if (pm_power_off) {
                if (!reboot_force)
-@@ -627,9 +654,10 @@ static void native_machine_power_off(void)
+@@ -644,9 +671,10 @@ static void native_machine_power_off(void)
        }
        /* A fallback in case there is no PM info available */
        tboot_shutdown(TB_SHUTDOWN_HALT);
@@ -26524,7 +26714,7 @@ index 3fd2c69..a444264 100644
  identity_mapped:
        /* set return address to 0 if not preserving context */
 diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
-index ce72964..be8aea7 100644
+index 09c76d2..7f33fc2 100644
 --- a/arch/x86/kernel/setup.c
 +++ b/arch/x86/kernel/setup.c
 @@ -110,6 +110,7 @@
@@ -26620,7 +26810,7 @@ index ce72964..be8aea7 100644
  
        early_reserve_initrd();
  
-@@ -947,14 +990,14 @@ void __init setup_arch(char **cmdline_p)
+@@ -946,14 +989,14 @@ void __init setup_arch(char **cmdline_p)
  
        if (!boot_params.hdr.root_flags)
                root_mountflags &= ~MS_RDONLY;
@@ -26795,7 +26985,7 @@ index 9e5de68..16c53cb 100644
  }
  
 diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
-index 7c3a5a6..f0a8961 100644
+index be8e1bd..a3d93fa 100644
 --- a/arch/x86/kernel/smp.c
 +++ b/arch/x86/kernel/smp.c
 @@ -341,7 +341,7 @@ static int __init nonmi_ipi_setup(char *str)
@@ -26808,35 +26998,32 @@ index 7c3a5a6..f0a8961 100644
        .smp_prepare_cpus       = native_smp_prepare_cpus,
        .smp_cpus_done          = native_smp_cpus_done,
 diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
-index a32da80..30c97f1 100644
+index ae2fd975..c0c8d10 100644
 --- a/arch/x86/kernel/smpboot.c
 +++ b/arch/x86/kernel/smpboot.c
-@@ -229,14 +229,18 @@ static void notrace start_secondary(void *unused)
+@@ -230,14 +230,17 @@ static void notrace start_secondary(void *unused)
  
        enable_start_cpu0 = 0;
  
 -#ifdef CONFIG_X86_32
--      /* switch away from the initial page table */
--      load_cr3(swapper_pg_dir);
--      __flush_tlb_all();
--#endif
--
-       /* otherwise gcc will move up smp_processor_id before the cpu_init */
-       barrier();
++      /* otherwise gcc will move up smp_processor_id before the cpu_init */
++      barrier();
 +
-+      /* switch away from the initial page table */
+       /* switch away from the initial page table */
 +#ifdef CONFIG_PAX_PER_CPU_PGD
 +      load_cr3(get_cpu_pgd(smp_processor_id(), kernel));
-+      __flush_tlb_all();
-+#elif defined(CONFIG_X86_32)
-+      load_cr3(swapper_pg_dir);
-+      __flush_tlb_all();
++#else
+       load_cr3(swapper_pg_dir);
 +#endif
-+
+       __flush_tlb_all();
+-#endif
+-      /* otherwise gcc will move up smp_processor_id before the cpu_init */
+-      barrier();
        /*
         * Check TSC synchronization with the BP:
         */
-@@ -749,8 +753,9 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
+@@ -757,8 +760,9 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
        alternatives_enable_smp();
  
        idle->thread.sp = (unsigned long) (((struct pt_regs *)
@@ -26847,24 +27034,21 @@ index a32da80..30c97f1 100644
  
  #ifdef CONFIG_X86_32
        /* Stack for startup_32 can be just as for start_secondary onwards */
-@@ -758,11 +763,13 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
- #else
+@@ -767,10 +771,10 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
        clear_tsk_thread_flag(idle, TIF_FORK);
        initial_gs = per_cpu_offset(cpu);
+ #endif
 -      per_cpu(kernel_stack, cpu) =
 -              (unsigned long)task_stack_page(idle) -
 -              KERNEL_STACK_OFFSET + THREAD_SIZE;
 +      per_cpu(kernel_stack, cpu) = (unsigned long)task_stack_page(idle) - 16 + THREAD_SIZE;
- #endif
-+
 +      pax_open_kernel();
        early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu);
 +      pax_close_kernel();
-+
        initial_code = (unsigned long)start_secondary;
        stack_start  = idle->thread.sp;
  
-@@ -911,6 +918,15 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle)
+@@ -916,6 +920,15 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle)
        /* the FPU context is blank, nobody can own it */
        __cpu_disable_lazy_restore(cpu);
  
@@ -26879,7 +27063,7 @@ index a32da80..30c97f1 100644
 +
        err = do_boot_cpu(apicid, cpu, tidle);
        if (err) {
-               pr_debug("do_boot_cpu failed %d\n", err);
+               pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu);
 diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c
 index 9b4d51d..5d28b58 100644
 --- a/arch/x86/kernel/step.c
@@ -27259,7 +27443,7 @@ index 91a4496..bb87552 100644
  
  #ifdef CONFIG_DEBUG_FS
 diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c
-index 24d3c91..d06b473 100644
+index bf7ef5c..59d0ac9 100644
 --- a/arch/x86/kernel/time.c
 +++ b/arch/x86/kernel/time.c
 @@ -30,9 +30,9 @@ unsigned long profile_pc(struct pt_regs *regs)
@@ -27336,7 +27520,7 @@ index 1c113db..287b42e 100644
  static int trace_irq_vector_refcount;
  static DEFINE_MUTEX(irq_vector_mutex);
 diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
-index 57409f6..e2c17e1 100644
+index f73b5d4..0adcc9a 100644
 --- a/arch/x86/kernel/traps.c
 +++ b/arch/x86/kernel/traps.c
 @@ -66,7 +66,7 @@
@@ -27415,7 +27599,19 @@ index 57409f6..e2c17e1 100644
                        regs->ip, regs->sp, error_code);
                print_vma_addr(" in ", regs->ip);
                pr_cont("\n");
-@@ -273,7 +285,7 @@ do_general_protection(struct pt_regs *regs, long error_code)
+@@ -251,6 +263,11 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
+       tsk->thread.error_code = error_code;
+       tsk->thread.trap_nr = X86_TRAP_DF;
++#ifdef CONFIG_GRKERNSEC_KSTACKOVERFLOW
++      if ((unsigned long)tsk->stack - regs->sp <= PAGE_SIZE)
++              die("grsec: kernel stack overflow detected", regs, error_code); 
++#endif
++
+ #ifdef CONFIG_DOUBLEFAULT
+       df_debug(regs, error_code);
+ #endif
+@@ -273,7 +290,7 @@ do_general_protection(struct pt_regs *regs, long error_code)
        conditional_sti(regs);
  
  #ifdef CONFIG_X86_32
@@ -27424,7 +27620,7 @@ index 57409f6..e2c17e1 100644
                local_irq_enable();
                handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
                goto exit;
-@@ -281,18 +293,42 @@ do_general_protection(struct pt_regs *regs, long error_code)
+@@ -281,18 +298,42 @@ do_general_protection(struct pt_regs *regs, long error_code)
  #endif
  
        tsk = current;
@@ -27469,7 +27665,7 @@ index 57409f6..e2c17e1 100644
        tsk->thread.error_code = error_code;
        tsk->thread.trap_nr = X86_TRAP_GP;
  
-@@ -453,7 +489,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
+@@ -453,7 +494,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
        /* It's safe to allow irq's after DR6 has been saved */
        preempt_conditional_sti(regs);
  
@@ -27478,7 +27674,7 @@ index 57409f6..e2c17e1 100644
                handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code,
                                        X86_TRAP_DB);
                preempt_conditional_cli(regs);
-@@ -468,7 +504,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
+@@ -468,7 +509,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
         * We already checked v86 mode above, so we can check for kernel mode
         * by just checking the CPL of CS.
         */
@@ -27487,7 +27683,7 @@ index 57409f6..e2c17e1 100644
                tsk->thread.debugreg6 &= ~DR_STEP;
                set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
                regs->flags &= ~X86_EFLAGS_TF;
-@@ -500,7 +536,7 @@ void math_error(struct pt_regs *regs, int error_code, int trapnr)
+@@ -500,7 +541,7 @@ void math_error(struct pt_regs *regs, int error_code, int trapnr)
                return;
        conditional_sti(regs);
  
@@ -27497,7 +27693,7 @@ index 57409f6..e2c17e1 100644
                if (!fixup_exception(regs)) {
                        task->thread.error_code = error_code;
 diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
-index cfbe99f..a6e8fa7 100644
+index 57e5ce1..20b0040 100644
 --- a/arch/x86/kernel/tsc.c
 +++ b/arch/x86/kernel/tsc.c
 @@ -150,7 +150,7 @@ static void cyc2ns_write_end(int cpu, struct cyc2ns_data *data)
@@ -27612,7 +27808,7 @@ index e8edcf5..27f9344 100644
                goto cannot_handle;
        if ((segoffs >> 16) == BIOSSEG)
 diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
-index da6b35a..977e9cf 100644
+index 49edf2d..c0d1362 100644
 --- a/arch/x86/kernel/vmlinux.lds.S
 +++ b/arch/x86/kernel/vmlinux.lds.S
 @@ -26,6 +26,13 @@
@@ -27757,8 +27953,8 @@ index da6b35a..977e9cf 100644
  
                PAGE_ALIGNED_DATA(PAGE_SIZE)
  
-@@ -172,12 +230,19 @@ SECTIONS
- #endif /* CONFIG_X86_64 */
+@@ -174,12 +232,19 @@ SECTIONS
+        . = ALIGN(__vvar_page + PAGE_SIZE, PAGE_SIZE);
  
        /* Init code and data - will be freed after init */
 -      . = ALIGN(PAGE_SIZE);
@@ -27780,7 +27976,7 @@ index da6b35a..977e9cf 100644
        /*
         * percpu offsets are zero-based on SMP.  PERCPU_VADDR() changes the
         * output PHDR, so the next output section - .init.text - should
-@@ -186,12 +251,27 @@ SECTIONS
+@@ -188,12 +253,27 @@ SECTIONS
        PERCPU_VADDR(INTERNODE_CACHE_BYTES, 0, :percpu)
  #endif
  
@@ -27813,7 +28009,7 @@ index da6b35a..977e9cf 100644
  
        .x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) {
                __x86_cpu_dev_start = .;
-@@ -262,19 +342,12 @@ SECTIONS
+@@ -264,19 +344,12 @@ SECTIONS
        }
  
        . = ALIGN(8);
@@ -27834,7 +28030,7 @@ index da6b35a..977e9cf 100644
        PERCPU_SECTION(INTERNODE_CACHE_BYTES)
  #endif
  
-@@ -293,16 +366,10 @@ SECTIONS
+@@ -295,16 +368,10 @@ SECTIONS
        .smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
                __smp_locks = .;
                *(.smp_locks)
@@ -27852,7 +28048,7 @@ index da6b35a..977e9cf 100644
        /* BSS */
        . = ALIGN(PAGE_SIZE);
        .bss : AT(ADDR(.bss) - LOAD_OFFSET) {
-@@ -318,6 +385,7 @@ SECTIONS
+@@ -320,6 +387,7 @@ SECTIONS
                __brk_base = .;
                . += 64 * 1024;         /* 64k alignment slop space */
                *(.brk_reservation)     /* areas brk users have reserved */
@@ -27860,7 +28056,7 @@ index da6b35a..977e9cf 100644
                __brk_limit = .;
        }
  
-@@ -344,13 +412,12 @@ SECTIONS
+@@ -346,13 +414,12 @@ SECTIONS
   * for the boot processor.
   */
  #define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load
@@ -27876,12 +28072,12 @@ index da6b35a..977e9cf 100644
  
  #ifdef CONFIG_SMP
 diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
-index 1f96f93..d5c8f7a 100644
+index 8b3b3eb..9395aa9 100644
 --- a/arch/x86/kernel/vsyscall_64.c
 +++ b/arch/x86/kernel/vsyscall_64.c
-@@ -56,15 +56,13 @@
+@@ -54,15 +54,13 @@
  DEFINE_VVAR(int, vgetcpu_mode);
- DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data);
  
 -static enum { EMULATE, NATIVE, NONE } vsyscall_mode = EMULATE;
 +static enum { EMULATE, NONE } vsyscall_mode = EMULATE;
@@ -27896,7 +28092,7 @@ index 1f96f93..d5c8f7a 100644
                else if (!strcmp("none", str))
                        vsyscall_mode = NONE;
                else
-@@ -323,8 +321,7 @@ do_ret:
+@@ -279,8 +277,7 @@ do_ret:
        return true;
  
  sigsegv:
@@ -27906,8 +28102,8 @@ index 1f96f93..d5c8f7a 100644
  }
  
  /*
-@@ -377,10 +374,7 @@ void __init map_vsyscall(void)
-       extern char __vvar_page;
+@@ -332,10 +329,7 @@ void __init map_vsyscall(void)
+       unsigned long physaddr_vsyscall = __pa_symbol(&__vsyscall_page);
        unsigned long physaddr_vvar_page = __pa_symbol(&__vvar_page);
  
 -      __set_fixmap(VSYSCALL_FIRST_PAGE, physaddr_vsyscall,
@@ -28022,10 +28218,10 @@ index a4b451c..8dfe1ad 100644
                if ((unsigned long)buf % 64 || fx_only) {
                        u64 init_bv = pcntxt_mask & ~XSTATE_FPSSE;
 diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
-index c697625..a032162 100644
+index f47a104..5ce59a8 100644
 --- a/arch/x86/kvm/cpuid.c
 +++ b/arch/x86/kvm/cpuid.c
-@@ -156,15 +156,20 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,
+@@ -166,15 +166,20 @@ int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,
                              struct kvm_cpuid2 *cpuid,
                              struct kvm_cpuid_entry2 __user *entries)
  {
@@ -28049,7 +28245,7 @@ index c697625..a032162 100644
        vcpu->arch.cpuid_nent = cpuid->nent;
        kvm_apic_set_version(vcpu);
        kvm_x86_ops->cpuid_update(vcpu);
-@@ -179,15 +184,19 @@ int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
+@@ -189,15 +194,19 @@ int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
                              struct kvm_cpuid2 *cpuid,
                              struct kvm_cpuid_entry2 __user *entries)
  {
@@ -28073,7 +28269,7 @@ index c697625..a032162 100644
  
  out:
 diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
-index 9736529..ab4f54c 100644
+index 0069118..c28ec0a 100644
 --- a/arch/x86/kvm/lapic.c
 +++ b/arch/x86/kvm/lapic.c
 @@ -55,7 +55,7 @@
@@ -28086,7 +28282,7 @@ index 9736529..ab4f54c 100644
  #define APIC_LVT_NUM                  6
  /* 14 is the version for Xeon and Pentium 8.4.8*/
 diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
-index cba218a..1cc1bed 100644
+index 123efd3..ad7726e 100644
 --- a/arch/x86/kvm/paging_tmpl.h
 +++ b/arch/x86/kvm/paging_tmpl.h
 @@ -331,7 +331,7 @@ retry_walk:
@@ -28099,10 +28295,10 @@ index cba218a..1cc1bed 100644
                        goto error;
                walker->ptep_user[walker->level - 1] = ptep_user;
 diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
-index 2de1bc0..22251ee 100644
+index 7f4f9c2..67b1db0 100644
 --- a/arch/x86/kvm/svm.c
 +++ b/arch/x86/kvm/svm.c
-@@ -3508,7 +3508,11 @@ static void reload_tss(struct kvm_vcpu *vcpu)
+@@ -3535,7 +3535,11 @@ static void reload_tss(struct kvm_vcpu *vcpu)
        int cpu = raw_smp_processor_id();
  
        struct svm_cpu_data *sd = per_cpu(svm_data, cpu);
@@ -28114,7 +28310,7 @@ index 2de1bc0..22251ee 100644
        load_TR_desc();
  }
  
-@@ -3911,6 +3915,10 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -3936,6 +3940,10 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
  #endif
  #endif
  
@@ -28126,10 +28322,10 @@ index 2de1bc0..22251ee 100644
  
        local_irq_disable();
 diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
-index 3927528..fc19971 100644
+index 138ceff..2e584f0 100644
 --- a/arch/x86/kvm/vmx.c
 +++ b/arch/x86/kvm/vmx.c
-@@ -1320,12 +1320,12 @@ static void vmcs_write64(unsigned long field, u64 value)
+@@ -1339,12 +1339,12 @@ static void vmcs_write64(unsigned long field, u64 value)
  #endif
  }
  
@@ -28144,7 +28340,7 @@ index 3927528..fc19971 100644
  {
        vmcs_writel(field, vmcs_readl(field) | mask);
  }
-@@ -1585,7 +1585,11 @@ static void reload_tss(void)
+@@ -1604,7 +1604,11 @@ static void reload_tss(void)
        struct desc_struct *descs;
  
        descs = (void *)gdt->address;
@@ -28156,7 +28352,7 @@ index 3927528..fc19971 100644
        load_TR_desc();
  }
  
-@@ -1809,6 +1813,10 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
+@@ -1832,6 +1836,10 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
                vmcs_writel(HOST_TR_BASE, kvm_read_tr_base()); /* 22.2.4 */
                vmcs_writel(HOST_GDTR_BASE, gdt->address);   /* 22.2.4 */
  
@@ -28167,7 +28363,7 @@ index 3927528..fc19971 100644
                rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp);
                vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */
                vmx->loaded_vmcs->cpu = cpu;
-@@ -2098,7 +2106,7 @@ static void setup_msrs(struct vcpu_vmx *vmx)
+@@ -2121,7 +2129,7 @@ static void setup_msrs(struct vcpu_vmx *vmx)
   * reads and returns guest's timestamp counter "register"
   * guest_tsc = host_tsc + tsc_offset    -- 21.3
   */
@@ -28176,7 +28372,7 @@ index 3927528..fc19971 100644
  {
        u64 host_tsc, tsc_offset;
  
-@@ -3024,8 +3032,11 @@ static __init int hardware_setup(void)
+@@ -3093,8 +3101,11 @@ static __init int hardware_setup(void)
        if (!cpu_has_vmx_flexpriority())
                flexpriority_enabled = 0;
  
@@ -28190,7 +28386,7 @@ index 3927528..fc19971 100644
  
        if (enable_ept && !cpu_has_vmx_ept_2m_page())
                kvm_disable_largepages();
-@@ -3036,13 +3047,15 @@ static __init int hardware_setup(void)
+@@ -3105,13 +3116,15 @@ static __init int hardware_setup(void)
        if (!cpu_has_vmx_apicv())
                enable_apicv = 0;
  
@@ -28210,7 +28406,7 @@ index 3927528..fc19971 100644
  
        if (nested)
                nested_vmx_setup_ctls_msrs();
-@@ -4165,7 +4178,10 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
+@@ -4235,7 +4248,10 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
  
        vmcs_writel(HOST_CR0, read_cr0() & ~X86_CR0_TS);  /* 22.2.3 */
        vmcs_writel(HOST_CR4, read_cr4());  /* 22.2.3, 22.2.5 */
@@ -28221,7 +28417,7 @@ index 3927528..fc19971 100644
  
        vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS);  /* 22.2.4 */
  #ifdef CONFIG_X86_64
-@@ -4187,7 +4203,7 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
+@@ -4257,7 +4273,7 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
        vmcs_writel(HOST_IDTR_BASE, dt.address);   /* 22.2.4 */
        vmx->host_idt_base = dt.address;
  
@@ -28230,7 +28426,7 @@ index 3927528..fc19971 100644
  
        rdmsr(MSR_IA32_SYSENTER_CS, low32, high32);
        vmcs_write32(HOST_IA32_SYSENTER_CS, low32);
-@@ -7265,6 +7281,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -7333,6 +7349,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
                "jmp 2f \n\t"
                "1: " __ex(ASM_VMX_VMRESUME) "\n\t"
                "2: "
@@ -28243,7 +28439,7 @@ index 3927528..fc19971 100644
                /* Save guest registers, load host registers, keep flags */
                "mov %0, %c[wordsize](%%" _ASM_SP ") \n\t"
                "pop %0 \n\t"
-@@ -7317,6 +7339,11 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -7385,6 +7407,11 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
  #endif
                [cr2]"i"(offsetof(struct vcpu_vmx, vcpu.arch.cr2)),
                [wordsize]"i"(sizeof(ulong))
@@ -28255,7 +28451,7 @@ index 3927528..fc19971 100644
              : "cc", "memory"
  #ifdef CONFIG_X86_64
                , "rax", "rbx", "rdi", "rsi"
-@@ -7330,7 +7357,7 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -7398,7 +7425,7 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
        if (debugctlmsr)
                update_debugctlmsr(debugctlmsr);
  
@@ -28264,7 +28460,7 @@ index 3927528..fc19971 100644
        /*
         * The sysexit path does not restore ds/es, so we must set them to
         * a reasonable value ourselves.
-@@ -7339,8 +7366,18 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -7407,8 +7434,18 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
         * may be executed in interrupt context, which saves and restore segments
         * around it, nullifying its effect.
         */
@@ -28286,10 +28482,10 @@ index 3927528..fc19971 100644
  
        vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP)
 diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
-index 2b85784..ad70e19 100644
+index 5521f7c..691b7a3 100644
 --- a/arch/x86/kvm/x86.c
 +++ b/arch/x86/kvm/x86.c
-@@ -1777,8 +1777,8 @@ static int xen_hvm_config(struct kvm_vcpu *vcpu, u64 data)
+@@ -1822,8 +1822,8 @@ static int xen_hvm_config(struct kvm_vcpu *vcpu, u64 data)
  {
        struct kvm *kvm = vcpu->kvm;
        int lm = is_long_mode(vcpu);
@@ -28300,7 +28496,7 @@ index 2b85784..ad70e19 100644
        u8 blob_size = lm ? kvm->arch.xen_hvm_config.blob_size_64
                : kvm->arch.xen_hvm_config.blob_size_32;
        u32 page_num = data & ~PAGE_MASK;
-@@ -2689,6 +2689,8 @@ long kvm_arch_dev_ioctl(struct file *filp,
+@@ -2738,6 +2738,8 @@ long kvm_arch_dev_ioctl(struct file *filp,
                if (n < msr_list.nmsrs)
                        goto out;
                r = -EFAULT;
@@ -28309,7 +28505,7 @@ index 2b85784..ad70e19 100644
                if (copy_to_user(user_msr_list->indices, &msrs_to_save,
                                 num_msrs_to_save * sizeof(u32)))
                        goto out;
-@@ -5503,7 +5505,7 @@ static struct notifier_block pvclock_gtod_notifier = {
+@@ -5574,7 +5576,7 @@ static struct notifier_block pvclock_gtod_notifier = {
  };
  #endif
  
@@ -28319,7 +28515,7 @@ index 2b85784..ad70e19 100644
        int r;
        struct kvm_x86_ops *ops = opaque;
 diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
-index ad1fb5f..fe30b66 100644
+index aae9413..d11e829 100644
 --- a/arch/x86/lguest/boot.c
 +++ b/arch/x86/lguest/boot.c
 @@ -1206,9 +1206,10 @@ static __init int early_put_chars(u32 vtermno, const char *buf, int count)
@@ -31180,7 +31376,7 @@ index 903ec1e..c4166b2 100644
  }
  
 diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
-index a10c8c7..35a5abb 100644
+index 8e57229..31cce89 100644
 --- a/arch/x86/mm/fault.c
 +++ b/arch/x86/mm/fault.c
 @@ -14,11 +14,18 @@
@@ -31372,15 +31568,17 @@ index a10c8c7..35a5abb 100644
  
  static void
  show_fault_oops(struct pt_regs *regs, unsigned long error_code,
-@@ -582,15 +666,27 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code,
+@@ -582,7 +666,7 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code,
        if (!oops_may_print())
                return;
  
 -      if (error_code & PF_INSTR) {
 +      if ((__supported_pte_mask & _PAGE_NX) && (error_code & PF_INSTR)) {
                unsigned int level;
-               pte_t *pte = lookup_address(address, &level);
+               pgd_t *pgd;
+               pte_t *pte;
+@@ -593,9 +677,21 @@ show_fault_oops(struct pt_regs *regs, unsigned long error_code,
+               pte = lookup_address_in_pgd(pgd, address, &level);
  
                if (pte && pte_present(*pte) && !pte_exec(*pte))
 -                      printk(nx_warning, from_kuid(&init_user_ns, current_uid()));
@@ -31402,7 +31600,7 @@ index a10c8c7..35a5abb 100644
        printk(KERN_ALERT "BUG: unable to handle kernel ");
        if (address < PAGE_SIZE)
                printk(KERN_CONT "NULL pointer dereference");
-@@ -771,6 +867,22 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
+@@ -776,6 +872,22 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
                                return;
                }
  #endif
@@ -31425,7 +31623,7 @@ index a10c8c7..35a5abb 100644
                /* Kernel addresses are always protection faults: */
                if (address >= TASK_SIZE)
                        error_code |= PF_PROT;
-@@ -856,7 +968,7 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
+@@ -861,7 +973,7 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
        if (fault & (VM_FAULT_HWPOISON|VM_FAULT_HWPOISON_LARGE)) {
                printk(KERN_ERR
        "MCE: Killing %s:%d due to hardware memory corruption fault at&nbs