summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2012-06-18 08:45:44 -0400
committerAnthony G. Basile <blueness@gentoo.org>2012-06-18 08:45:44 -0400
commit230909a311c93618d18dd8cb92ba15bea420bd07 (patch)
treeb024633b4faba3df9cb08c058f3f2d9b83608af2
parentGrsec/PaX: 2.9-{2.6.32.59,3.2.20,3.4.2}-201206160836 (diff)
downloadhardened-patchset-20120617.tar.gz
hardened-patchset-20120617.tar.bz2
hardened-patchset-20120617.zip
Grsec/PaX: 2.9-{2.6.32.59,3.2.20,3.4.3}-20120617183620120617
-rw-r--r--2.6.32/0000_README2
-rw-r--r--2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201206171956.patch (renamed from 2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201206160835.patch)418
-rw-r--r--3.2.20/0000_README2
-rw-r--r--3.2.20/4420_grsecurity-2.9.1-3.2.20-201206171957.patch (renamed from 3.2.20/4420_grsecurity-2.9.1-3.2.20-201206160836.patch)283
-rw-r--r--3.4.3/0000_README (renamed from 3.4.2/0000_README)6
-rw-r--r--3.4.3/1002_linux-3.4.3.patch1622
-rw-r--r--3.4.3/4420_grsecurity-2.9.1-3.4.3-201206171836.patch (renamed from 3.4.2/4420_grsecurity-2.9.1-3.4.2-201206160836.patch)137
-rw-r--r--3.4.3/4430_grsec-remove-localversion-grsec.patch (renamed from 3.4.2/4430_grsec-remove-localversion-grsec.patch)0
-rw-r--r--3.4.3/4435_grsec-mute-warnings.patch (renamed from 3.4.2/4435_grsec-mute-warnings.patch)0
-rw-r--r--3.4.3/4440_grsec-remove-protected-paths.patch (renamed from 3.4.2/4440_grsec-remove-protected-paths.patch)0
-rw-r--r--3.4.3/4445_grsec-pax-without-grsec.patch (renamed from 3.4.2/4445_grsec-pax-without-grsec.patch)0
-rw-r--r--3.4.3/4450_grsec-kconfig-default-gids.patch (renamed from 3.4.2/4450_grsec-kconfig-default-gids.patch)0
-rw-r--r--3.4.3/4455_grsec-kconfig-gentoo.patch (renamed from 3.4.2/4455_grsec-kconfig-gentoo.patch)0
-rw-r--r--3.4.3/4460-grsec-kconfig-proc-user.patch (renamed from 3.4.2/4460-grsec-kconfig-proc-user.patch)0
-rw-r--r--3.4.3/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.4.2/4465_selinux-avc_audit-log-curr_ip.patch)0
-rw-r--r--3.4.3/4470_disable-compat_vdso.patch (renamed from 3.4.2/4470_disable-compat_vdso.patch)0
16 files changed, 2160 insertions, 310 deletions
diff --git a/2.6.32/0000_README b/2.6.32/0000_README
index 75c3519..e239f2b 100644
--- a/2.6.32/0000_README
+++ b/2.6.32/0000_README
@@ -30,7 +30,7 @@ Patch: 1058_linux-2.6.32.59.patch
From: http://www.kernel.org
Desc: Linux 2.6.32.59
-Patch: 4420_grsecurity-2.9.1-2.6.32.59-201206160835.patch
+Patch: 4420_grsecurity-2.9.1-2.6.32.59-201206171956.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201206160835.patch b/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201206171956.patch
index 249ffe4..eff2b70 100644
--- a/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201206160835.patch
+++ b/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201206171956.patch
@@ -221,7 +221,7 @@ index 613da5d..4fe3eda 100644
M: Liam Girdwood <lrg@slimlogic.co.uk>
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
diff --git a/Makefile b/Makefile
-index 3a9a721..683dc09 100644
+index 3a9a721..69f34e7 100644
--- a/Makefile
+++ b/Makefile
@@ -221,8 +221,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -256,12 +256,13 @@ index 3a9a721..683dc09 100644
include/linux/version.h headers_% \
kernelrelease kernelversion
-@@ -526,6 +527,55 @@ else
+@@ -526,6 +527,56 @@ else
KBUILD_CFLAGS += -O2
endif
+ifndef DISABLE_PAX_PLUGINS
-+ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(HOSTCC)" "$(CC)"), y)
++PLUGINCC := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(HOSTCC)" "$(HOSTCXX)" "$(CC)")
++ifneq ($(PLUGINCC),)
+ifndef DISABLE_PAX_CONSTIFY_PLUGIN
+ifndef CONFIG_UML
+CONSTIFY_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/constify_plugin.so -DCONSTIFY_PLUGIN
@@ -291,7 +292,7 @@ index 3a9a721..683dc09 100644
+GCC_PLUGINS_CFLAGS := $(CONSTIFY_PLUGIN_CFLAGS) $(STACKLEAK_PLUGIN_CFLAGS) $(KALLOCSTAT_PLUGIN_CFLAGS)
+GCC_PLUGINS_CFLAGS += $(KERNEXEC_PLUGIN_CFLAGS) $(CHECKER_PLUGIN_CFLAGS) $(COLORIZE_PLUGIN_CFLAGS) $(SIZE_OVERFLOW_PLUGIN_CFLAGS)
+GCC_PLUGINS_AFLAGS := $(KERNEXEC_PLUGIN_AFLAGS)
-+export CONSTIFY_PLUGIN STACKLEAK_PLUGIN KERNEXEC_PLUGIN CHECKER_PLUGIN SIZE_OVERFLOW_PLUGIN
++export PLUGINCC CONSTIFY_PLUGIN STACKLEAK_PLUGIN KERNEXEC_PLUGIN CHECKER_PLUGIN SIZE_OVERFLOW_PLUGIN
+ifeq ($(KBUILD_EXTMOD),)
+gcc-plugins:
+ $(Q)$(MAKE) $(build)=tools/gcc
@@ -312,7 +313,7 @@ index 3a9a721..683dc09 100644
include $(srctree)/arch/$(SRCARCH)/Makefile
ifneq ($(CONFIG_FRAME_WARN),0)
-@@ -647,7 +697,7 @@ export mod_strip_cmd
+@@ -647,7 +698,7 @@ export mod_strip_cmd
ifeq ($(KBUILD_EXTMOD),)
@@ -321,7 +322,7 @@ index 3a9a721..683dc09 100644
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
-@@ -868,6 +918,8 @@ vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
+@@ -868,6 +919,8 @@ vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
# The actual objects are generated when descending,
# make sure no implicit rule kicks in
@@ -330,7 +331,7 @@ index 3a9a721..683dc09 100644
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
# Handle descending into subdirectories listed in $(vmlinux-dirs)
-@@ -877,7 +929,7 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
+@@ -877,7 +930,7 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
# Error messages still appears in the original language
PHONY += $(vmlinux-dirs)
@@ -339,7 +340,7 @@ index 3a9a721..683dc09 100644
$(Q)$(MAKE) $(build)=$@
# Build the kernel release string
-@@ -986,6 +1038,7 @@ prepare0: archprepare FORCE
+@@ -986,6 +1039,7 @@ prepare0: archprepare FORCE
$(Q)$(MAKE) $(build)=. missing-syscalls
# All the preparing..
@@ -347,7 +348,7 @@ index 3a9a721..683dc09 100644
prepare: prepare0
# The asm symlink changes when $(ARCH) changes.
-@@ -1127,6 +1180,8 @@ all: modules
+@@ -1127,6 +1181,8 @@ all: modules
# using awk while concatenating to the final file.
PHONY += modules
@@ -356,7 +357,7 @@ index 3a9a721..683dc09 100644
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
@$(kecho) ' Building modules, stage 2.';
-@@ -1136,7 +1191,7 @@ modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
+@@ -1136,7 +1192,7 @@ modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
# Target to prepare building external modules
PHONY += modules_prepare
@@ -365,7 +366,7 @@ index 3a9a721..683dc09 100644
# Target to install modules
PHONY += modules_install
-@@ -1201,7 +1256,7 @@ MRPROPER_FILES += .config .config.old include/asm .version .old_version \
+@@ -1201,7 +1257,7 @@ MRPROPER_FILES += .config .config.old include/asm .version .old_version \
include/linux/autoconf.h include/linux/version.h \
include/linux/utsrelease.h \
include/linux/bounds.h include/asm*/asm-offsets.h \
@@ -374,7 +375,7 @@ index 3a9a721..683dc09 100644
# clean - Delete most, but leave enough to build external modules
#
-@@ -1245,7 +1300,7 @@ distclean: mrproper
+@@ -1245,7 +1301,7 @@ distclean: mrproper
@find $(srctree) $(RCS_FIND_IGNORE) \
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
@@ -383,7 +384,7 @@ index 3a9a721..683dc09 100644
-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
-type f -print | xargs rm -f
-@@ -1292,6 +1347,7 @@ help:
+@@ -1292,6 +1348,7 @@ help:
@echo ' modules_prepare - Set up for building external modules'
@echo ' tags/TAGS - Generate tags file for editors'
@echo ' cscope - Generate cscope index'
@@ -391,7 +392,7 @@ index 3a9a721..683dc09 100644
@echo ' kernelrelease - Output the release version string'
@echo ' kernelversion - Output the version stored in Makefile'
@echo ' headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
-@@ -1393,6 +1449,8 @@ PHONY += $(module-dirs) modules
+@@ -1393,6 +1450,8 @@ PHONY += $(module-dirs) modules
$(module-dirs): crmodverdir $(objtree)/Module.symvers
$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
@@ -400,7 +401,7 @@ index 3a9a721..683dc09 100644
modules: $(module-dirs)
@$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
-@@ -1448,7 +1506,7 @@ endif # KBUILD_EXTMOD
+@@ -1448,7 +1507,7 @@ endif # KBUILD_EXTMOD
quiet_cmd_tags = GEN $@
cmd_tags = $(CONFIG_SHELL) $(srctree)/scripts/tags.sh $@
@@ -409,7 +410,7 @@ index 3a9a721..683dc09 100644
$(call cmd,tags)
# Scripts to check various things for consistency
-@@ -1513,17 +1571,21 @@ else
+@@ -1513,17 +1572,21 @@ else
target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
endif
@@ -435,7 +436,7 @@ index 3a9a721..683dc09 100644
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.symtypes: %.c prepare scripts FORCE
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
-@@ -1533,11 +1595,15 @@ endif
+@@ -1533,11 +1596,15 @@ endif
$(cmd_crmodverdir)
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
@@ -14192,7 +14193,7 @@ index 61c5874..8a046e9 100644
# include "uaccess_32.h"
#else
diff --git a/arch/x86/include/asm/uaccess_32.h b/arch/x86/include/asm/uaccess_32.h
-index 632fb44..b8785282 100644
+index 632fb44..9aef8c8 100644
--- a/arch/x86/include/asm/uaccess_32.h
+++ b/arch/x86/include/asm/uaccess_32.h
@@ -12,15 +12,15 @@
@@ -14287,7 +14288,7 @@ index 632fb44..b8785282 100644
if (__builtin_constant_p(n)) {
unsigned long ret;
-@@ -182,14 +205,62 @@ static __always_inline unsigned long
+@@ -182,14 +205,86 @@ static __always_inline unsigned long
__copy_from_user_inatomic_nocache(void *to, const void __user *from,
unsigned long n)
{
@@ -14298,6 +14299,22 @@ index 632fb44..b8785282 100644
+ return __copy_from_user_ll_nocache_nozero(to, from, n);
+}
+
++extern void copy_to_user_overflow(void)
++#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
++ __compiletime_error("copy_to_user() buffer size is not provably correct")
++#else
++ __compiletime_warning("copy_to_user() buffer size is not provably correct")
++#endif
++;
++
++extern void copy_from_user_overflow(void)
++#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
++ __compiletime_error("copy_from_user() buffer size is not provably correct")
++#else
++ __compiletime_warning("copy_from_user() buffer size is not provably correct")
++#endif
++;
++
+/**
+ * copy_to_user: - Copy a block of data into user space.
+ * @to: Destination address, in user space.
@@ -14314,7 +14331,11 @@ index 632fb44..b8785282 100644
+static __always_inline unsigned long __must_check
+copy_to_user(void __user *to, const void *from, unsigned long n)
+{
-+ if (access_ok(VERIFY_WRITE, to, n))
++ int sz = __compiletime_object_size(from);
++
++ if (unlikely(sz != -1 && sz < n))
++ copy_to_user_overflow();
++ else if (access_ok(VERIFY_WRITE, to, n))
+ n = __copy_to_user(to, from, n);
+ return n;
+}
@@ -14338,7 +14359,11 @@ index 632fb44..b8785282 100644
+static __always_inline unsigned long __must_check
+copy_from_user(void *to, const void __user *from, unsigned long n)
+{
-+ if (access_ok(VERIFY_READ, from, n))
++ int sz = __compiletime_object_size(to);
++
++ if (unlikely(sz != -1 && sz < n))
++ copy_from_user_overflow();
++ else if (access_ok(VERIFY_READ, from, n))
+ n = __copy_from_user(to, from, n);
+ else if ((long)n > 0) {
+ if (!__builtin_constant_p(n))
@@ -14356,7 +14381,7 @@ index 632fb44..b8785282 100644
long __must_check strncpy_from_user(char *dst, const char __user *src,
long count);
long __must_check __strncpy_from_user(char *dst,
-@@ -212,7 +283,7 @@ long __must_check __strncpy_from_user(char *dst,
+@@ -212,7 +307,7 @@ long __must_check __strncpy_from_user(char *dst,
#define strlen_user(str) strnlen_user(str, LONG_MAX)
long strnlen_user(const char __user *str, long n);
@@ -14367,7 +14392,7 @@ index 632fb44..b8785282 100644
#endif /* _ASM_X86_UACCESS_32_H */
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h
-index db24b21..00b1ea6 100644
+index db24b21..443d022 100644
--- a/arch/x86/include/asm/uaccess_64.h
+++ b/arch/x86/include/asm/uaccess_64.h
@@ -9,6 +9,9 @@
@@ -14380,7 +14405,7 @@ index db24b21..00b1ea6 100644
/*
* Copy To/From Userspace
-@@ -16,116 +19,205 @@
+@@ -16,116 +19,233 @@
/* Handles exceptions in both to and from, but doesn't do access_ok */
__must_check unsigned long
@@ -14394,12 +14419,29 @@ index db24b21..00b1ea6 100644
-__must_check unsigned long
-copy_in_user(void __user *to, const void __user *from, unsigned len);
+copy_in_user(void __user *to, const void __user *from, unsigned long len);
++
++extern void copy_to_user_overflow(void)
++#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
++ __compiletime_error("copy_to_user() buffer size is not provably correct")
++#else
++ __compiletime_warning("copy_to_user() buffer size is not provably correct")
++#endif
++;
++
++extern void copy_from_user_overflow(void)
++#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
++ __compiletime_error("copy_from_user() buffer size is not provably correct")
++#else
++ __compiletime_warning("copy_from_user() buffer size is not provably correct")
++#endif
++;
static __always_inline __must_check
-int __copy_from_user(void *dst, const void __user *src, unsigned size)
+unsigned long __copy_from_user(void *dst, const void __user *src, unsigned long size)
{
- int ret = 0;
++ int sz = __compiletime_object_size(dst);
+ unsigned ret = 0;
might_fault();
@@ -14414,6 +14456,11 @@ index db24b21..00b1ea6 100644
+ return size;
+#endif
+
++ if (unlikely(sz != -1 && sz < size)) {
++ copy_from_user_overflow();
++ return size;
++ }
++
+ if (!__builtin_constant_p(size)) {
+ check_object_size(dst, size, false);
+
@@ -14480,6 +14527,7 @@ index db24b21..00b1ea6 100644
+unsigned long __copy_to_user(void __user *dst, const void *src, unsigned long size)
{
- int ret = 0;
++ int sz = __compiletime_object_size(dst);
+ unsigned ret = 0;
might_fault();
@@ -14496,6 +14544,11 @@ index db24b21..00b1ea6 100644
+ return size;
+#endif
+
++ if (unlikely(sz != -1 && sz < size)) {
++ copy_to_user_overflow();
++ return size;
++ }
++
+ if (!__builtin_constant_p(size)) {
+ check_object_size(src, size, true);
+
@@ -14624,7 +14677,7 @@ index db24b21..00b1ea6 100644
ret, "b", "b", "=q", 1);
if (likely(!ret))
__put_user_asm(tmp, (u8 __user *)dst,
-@@ -134,7 +226,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -134,7 +254,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
}
case 2: {
u16 tmp;
@@ -14633,7 +14686,7 @@ index db24b21..00b1ea6 100644
ret, "w", "w", "=r", 2);
if (likely(!ret))
__put_user_asm(tmp, (u16 __user *)dst,
-@@ -144,7 +236,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -144,7 +264,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
case 4: {
u32 tmp;
@@ -14642,7 +14695,7 @@ index db24b21..00b1ea6 100644
ret, "l", "k", "=r", 4);
if (likely(!ret))
__put_user_asm(tmp, (u32 __user *)dst,
-@@ -153,7 +245,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -153,7 +273,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
}
case 8: {
u64 tmp;
@@ -14651,7 +14704,7 @@ index db24b21..00b1ea6 100644
ret, "q", "", "=r", 8);
if (likely(!ret))
__put_user_asm(tmp, (u64 __user *)dst,
-@@ -161,8 +253,16 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -161,8 +281,16 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
return ret;
}
default:
@@ -14670,7 +14723,7 @@ index db24b21..00b1ea6 100644
}
}
-@@ -173,36 +273,78 @@ __strncpy_from_user(char *dst, const char __user *src, long count);
+@@ -173,36 +301,78 @@ __strncpy_from_user(char *dst, const char __user *src, long count);
__must_check long strnlen_user(const char __user *str, long n);
__must_check long __strnlen_user(const char __user *str, long n);
__must_check long strlen_user(const char __user *str);
@@ -25034,7 +25087,7 @@ index bf9a7d5..fb06ab5 100644
ret
CFI_ENDPROC
diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c
-index 1f118d4..fc661b0 100644
+index 1f118d4..a99a1eb 100644
--- a/arch/x86/lib/usercopy_32.c
+++ b/arch/x86/lib/usercopy_32.c
@@ -43,7 +43,7 @@ do { \
@@ -25581,7 +25634,7 @@ index 1f118d4..fc661b0 100644
return n;
}
EXPORT_SYMBOL(__copy_from_user_ll_nozero);
-@@ -827,59 +949,38 @@ unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *fr
+@@ -827,59 +949,50 @@ unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *fr
if (n > 64 && cpu_has_xmm2)
n = __copy_user_intel_nocache(to, from, n);
else
@@ -25610,29 +25663,15 @@ index 1f118d4..fc661b0 100644
- */
-unsigned long
-copy_to_user(void __user *to, const void *from, unsigned long n)
-+#ifdef CONFIG_PAX_MEMORY_UDEREF
-+void __set_fs(mm_segment_t x)
++void copy_from_user_overflow(void)
{
- if (access_ok(VERIFY_WRITE, to, n))
- n = __copy_to_user(to, from, n);
- return n;
-+ switch (x.seg) {
-+ case 0:
-+ loadsegment(gs, 0);
-+ break;
-+ case TASK_SIZE_MAX:
-+ loadsegment(gs, __USER_DS);
-+ break;
-+ case -1UL:
-+ loadsegment(gs, __KERNEL_DS);
-+ break;
-+ default:
-+ BUG();
-+ }
-+ return;
++ WARN(1, "Buffer overflow detected!\n");
}
-EXPORT_SYMBOL(copy_to_user);
-+EXPORT_SYMBOL(__set_fs);
++EXPORT_SYMBOL(copy_from_user_overflow);
-/**
- * copy_from_user: - Copy a block of data from user space.
@@ -25652,21 +25691,47 @@ index 1f118d4..fc661b0 100644
- */
-unsigned long
-copy_from_user(void *to, const void __user *from, unsigned long n)
-+void set_fs(mm_segment_t x)
++void copy_to_user_overflow(void)
{
- if (access_ok(VERIFY_READ, from, n))
- n = __copy_from_user(to, from, n);
- else
- memset(to, 0, n);
- return n;
-+ current_thread_info()->addr_limit = x;
-+ __set_fs(x);
++ WARN(1, "Buffer overflow detected!\n");
}
-EXPORT_SYMBOL(copy_from_user);
++EXPORT_SYMBOL(copy_to_user_overflow);
++
++#ifdef CONFIG_PAX_MEMORY_UDEREF
++void __set_fs(mm_segment_t x)
++{
++ switch (x.seg) {
++ case 0:
++ loadsegment(gs, 0);
++ break;
++ case TASK_SIZE_MAX:
++ loadsegment(gs, __USER_DS);
++ break;
++ case -1UL:
++ loadsegment(gs, __KERNEL_DS);
++ break;
++ default:
++ BUG();
++ }
++ return;
++}
++EXPORT_SYMBOL(__set_fs);
++
++void set_fs(mm_segment_t x)
++{
++ current_thread_info()->addr_limit = x;
++ __set_fs(x);
++}
+EXPORT_SYMBOL(set_fs);
+#endif
diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c
-index b7c2849..8633ad8 100644
+index b7c2849..ca4b1cb 100644
--- a/arch/x86/lib/usercopy_64.c
+++ b/arch/x86/lib/usercopy_64.c
@@ -42,6 +42,12 @@ long
@@ -25730,6 +25795,22 @@ index b7c2849..8633ad8 100644
{
char c;
unsigned zero_len;
+@@ -181,3 +201,15 @@ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest)
+ break;
+ return len;
+ }
++
++void copy_from_user_overflow(void)
++{
++ WARN(1, "Buffer overflow detected!\n");
++}
++EXPORT_SYMBOL(copy_from_user_overflow);
++
++void copy_to_user_overflow(void)
++{
++ WARN(1, "Buffer overflow detected!\n");
++}
++EXPORT_SYMBOL(copy_to_user_overflow);
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index 61b41ca..5fef66a 100644
--- a/arch/x86/mm/extable.c
@@ -85496,7 +85577,7 @@ index c8f2a5f7..1618a5c 100644
/* audit system wants to get cap info from files as well */
struct dentry;
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
-index 450fa59..246fa19 100644
+index 450fa59..7c875cb 100644
--- a/include/linux/compiler-gcc4.h
+++ b/include/linux/compiler-gcc4.h
@@ -14,6 +14,9 @@
@@ -85509,7 +85590,7 @@ index 450fa59..246fa19 100644
/*
* A trick to suppress uninitialized variable warning without generating any
* code
-@@ -36,4 +39,16 @@
+@@ -36,4 +39,23 @@
the kernel context */
#define __cold __attribute__((__cold__))
@@ -85517,6 +85598,7 @@ index 450fa59..246fa19 100644
+#define __bos(ptr, arg) __builtin_object_size((ptr), (arg))
+#define __bos0(ptr) __bos((ptr), 0)
+#define __bos1(ptr) __bos((ptr), 1)
++#endif
+
+#if __GNUC_MINOR__ >= 5
+#ifdef CONSTIFY_PLUGIN
@@ -85525,9 +85607,15 @@ index 450fa59..246fa19 100644
+#endif
+#endif
+
++#if __GNUC_MINOR__ > 0
++#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
++#endif
++#if __GNUC_MINOR__ >= 4 && !defined(__CHECKER__)
++#define __compiletime_warning(message) __attribute__((warning(message)))
++#define __compiletime_error(message) __attribute__((error(message)))
#endif
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
-index 04fb513..6189f3b 100644
+index 04fb513..edaeada 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -5,11 +5,14 @@
@@ -85621,7 +85709,27 @@ index 04fb513..6189f3b 100644
/* Simple shorthand for a section definition */
#ifndef __section
# define __section(S) __attribute__ ((__section__(#S)))
-@@ -278,6 +329,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
+@@ -266,6 +317,19 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
+ # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
+ #endif
+
++/* Compile time object size, -1 for unknown */
++#ifndef __compiletime_object_size
++# define __compiletime_object_size(obj) -1
++#endif
++#ifndef __compiletime_warning
++# define __compiletime_warning(message)
++#endif
++#ifndef __compiletime_error
++# define __compiletime_error(message)
++#endif
++#ifndef __linktime_error
++# define __linktime_error(message)
++#endif
+ /*
+ * Prevent the compiler from merging or refetching accesses. The compiler
+ * is also forbidden from reordering successive instances of ACCESS_ONCE(),
+@@ -278,6 +342,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
* use is to mediate communication between process-level code and irq/NMI
* handlers, all running on the same CPU.
*/
@@ -104317,7 +104425,7 @@ index 45b7d56..19e828c 100644
.store = foo_attr_store,
};
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
-index 341b589..405aed3 100644
+index 341b589..29fffe0 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -59,7 +59,7 @@ endif
@@ -104325,7 +104433,7 @@ index 341b589..405aed3 100644
# Do not include host rules unless needed
-ifneq ($(hostprogs-y)$(hostprogs-m),)
-+ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m),)
++ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),)
include scripts/Makefile.host
endif
@@ -104344,24 +104452,75 @@ index 6f89fbb..53adc9c 100644
# as clean-files is given relative to the current directory, this adds
# a $(obj) prefix, except for absolute paths
diff --git a/scripts/Makefile.host b/scripts/Makefile.host
-index 1ac414f..a1c1451 100644
+index 1ac414f..38575f7 100644
--- a/scripts/Makefile.host
+++ b/scripts/Makefile.host
-@@ -31,6 +31,7 @@
+@@ -31,6 +31,8 @@
# Note: Shared libraries consisting of C++ files are not supported
__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
+__hostlibs := $(sort $(hostlibs-y) $(hostlibs-m))
++__hostcxxlibs := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
# C code
# Executables compiled from a single .c file
-@@ -54,6 +55,7 @@ host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
+@@ -54,11 +56,15 @@ host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
# Shared libaries (only .c supported)
# Shared libraries (.so) - all .so files referenced in "xxx-objs"
host-cshlib := $(sort $(filter %.so, $(host-cobjs)))
+host-cshlib += $(sort $(filter %.so, $(__hostlibs)))
++host-cxxshlib := $(sort $(filter %.so, $(__hostcxxlibs)))
# Remove .so files from "xxx-objs"
host-cobjs := $(filter-out %.so,$(host-cobjs))
++host-cxxobjs := $(filter-out %.so,$(host-cxxobjs))
+
+-#Object (.o) files used by the shared libaries
++# Object (.o) files used by the shared libaries
+ host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
++host-cxxshobjs := $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
+
+ # output directory for programs/.o files
+ # hostprogs-y := tools/build may have been specified. Retrieve directory
+@@ -82,7 +88,9 @@ host-cobjs := $(addprefix $(obj)/,$(host-cobjs))
+ host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti))
+ host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs))
+ host-cshlib := $(addprefix $(obj)/,$(host-cshlib))
++host-cxxshlib := $(addprefix $(obj)/,$(host-cxxshlib))
+ host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs))
++host-cxxshobjs := $(addprefix $(obj)/,$(host-cxxshobjs))
+ host-objdirs := $(addprefix $(obj)/,$(host-objdirs))
+
+ obj-dirs += $(host-objdirs)
+@@ -156,6 +164,13 @@ quiet_cmd_host-cshobjs = HOSTCC -fPIC $@
+ $(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
+ $(call if_changed_dep,host-cshobjs)
+
++# Compile .c file, create position independent .o file
++# host-cxxshobjs -> .o
++quiet_cmd_host-cxxshobjs = HOSTCXX -fPIC $@
++ cmd_host-cxxshobjs = $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
++$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
++ $(call if_changed_dep,host-cxxshobjs)
++
+ # Link a shared library, based on position independent .o files
+ # *.o -> .so shared library (host-cshlib)
+ quiet_cmd_host-cshlib = HOSTLLD -shared $@
+@@ -165,6 +180,15 @@ quiet_cmd_host-cshlib = HOSTLLD -shared $@
+ $(host-cshlib): $(obj)/%: $(host-cshobjs) FORCE
+ $(call if_changed,host-cshlib)
+
++# Link a shared library, based on position independent .o files
++# *.o -> .so shared library (host-cxxshlib)
++quiet_cmd_host-cxxshlib = HOSTLLD -shared $@
++ cmd_host-cxxshlib = $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \
++ $(addprefix $(obj)/,$($(@F:.so=-objs))) \
++ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
++$(host-cxxshlib): $(obj)/%: $(host-cxxshobjs) FORCE
++ $(call if_changed,host-cxxshlib)
++
+ targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\
+- $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs)
++ $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c
index 6bf21f8..c0546b3 100644
@@ -104408,12 +104567,27 @@ index 6bf21f8..c0546b3 100644
fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianess? %#x\n",
diff --git a/scripts/gcc-plugin.sh b/scripts/gcc-plugin.sh
new file mode 100644
-index 0000000..8729101
+index 0000000..5a412da
--- /dev/null
+++ b/scripts/gcc-plugin.sh
-@@ -0,0 +1,2 @@
+@@ -0,0 +1,17 @@
+#!/bin/sh
-+echo -e "#include \"gcc-plugin.h\"\n#include \"tree.h\"\n#include \"tm.h\"\n#include \"rtl.h\"" | $1 -x c -shared - -o /dev/null -I`$2 -print-file-name=plugin`/include >/dev/null 2>&1 && echo "y"
++plugincc=`$1 -x c -shared - -o /dev/null -I\`$3 -print-file-name=plugin\`/include 2>&1 <<EOF
++#include "gcc-plugin.h"
++#include "tree.h"
++#include "tm.h"
++#include "rtl.h"
++#ifdef ENABLE_BUILD_WITH_CXX
++#warning $2
++#else
++#warning $1
++#endif
++EOF`
++if [ $? -eq 0 ]
++then
++ [[ "$plugincc" =~ "$1" ]] && echo $1
++ [[ "$plugincc" =~ "$2" ]] && echo $2
++fi
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 62a9025..65b82ad 100644
--- a/scripts/mod/file2alias.c
@@ -106609,28 +106783,33 @@ index 79633ea..9732e90 100644
}
diff --git a/tools/gcc/Makefile b/tools/gcc/Makefile
new file mode 100644
-index 0000000..ca64170
+index 0000000..991f33b
--- /dev/null
+++ b/tools/gcc/Makefile
-@@ -0,0 +1,26 @@
+@@ -0,0 +1,31 @@
+#CC := gcc
+#PLUGIN_SOURCE_FILES := pax_plugin.c
+#PLUGIN_OBJECT_FILES := $(patsubst %.c,%.o,$(PLUGIN_SOURCE_FILES))
+GCCPLUGINS_DIR := $(shell $(CC) -print-file-name=plugin)
+#CFLAGS += -I$(GCCPLUGINS_DIR)/include -fPIC -O2 -Wall -W -std=gnu99
+
++ifeq ($(PLUGINCC),$(HOSTCC))
++HOSTLIBS := hostlibs
+HOST_EXTRACFLAGS += -I$(GCCPLUGINS_DIR)/include -I$(GCCPLUGINS_DIR)/include/c-family -std=gnu99 -ggdb
-+CFLAGS_size_overflow_plugin.o := -Wno-missing-initializer
++else
++HOSTLIBS := hostcxxlibs
++HOST_EXTRACXXFLAGS += -I$(GCCPLUGINS_DIR)/include -I$(GCCPLUGINS_DIR)/include/c-family -std=gnu++98 -ggdb -Wno-unused-parameter
++endif
+
-+hostlibs-y := constify_plugin.so
-+hostlibs-$(CONFIG_PAX_MEMORY_STACKLEAK) += stackleak_plugin.so
-+hostlibs-$(CONFIG_KALLOCSTAT_PLUGIN) += kallocstat_plugin.so
-+hostlibs-$(CONFIG_PAX_KERNEXEC_PLUGIN) += kernexec_plugin.so
-+hostlibs-$(CONFIG_CHECKER_PLUGIN) += checker_plugin.so
-+hostlibs-y += colorize_plugin.so
-+hostlibs-$(CONFIG_PAX_SIZE_OVERFLOW) += size_overflow_plugin.so
++$(HOSTLIBS)-y := constify_plugin.so
++$(HOSTLIBS)-$(CONFIG_PAX_MEMORY_STACKLEAK) += stackleak_plugin.so
++$(HOSTLIBS)-$(CONFIG_KALLOCSTAT_PLUGIN) += kallocstat_plugin.so
++$(HOSTLIBS)-$(CONFIG_PAX_KERNEXEC_PLUGIN) += kernexec_plugin.so
++$(HOSTLIBS)-$(CONFIG_CHECKER_PLUGIN) += checker_plugin.so
++$(HOSTLIBS)-y += colorize_plugin.so
++$(HOSTLIBS)-$(CONFIG_PAX_SIZE_OVERFLOW) += size_overflow_plugin.so
+
-+always := $(hostlibs-y)
++always := $($(HOSTLIBS)-y)
+
+constify_plugin-objs := constify_plugin.o
+stackleak_plugin-objs := stackleak_plugin.o
@@ -106818,10 +106997,10 @@ index 0000000..d41b5af
+}
diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c
new file mode 100644
-index 0000000..ee950d0
+index 0000000..7a5e311
--- /dev/null
+++ b/tools/gcc/colorize_plugin.c
-@@ -0,0 +1,147 @@
+@@ -0,0 +1,148 @@
+/*
+ * Copyright 2012 by PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
@@ -106853,6 +107032,7 @@ index 0000000..ee950d0
+
+static struct plugin_info colorize_plugin_info = {
+ .version = "201203092200",
++ .help = NULL,
+};
+
+#define GREEN "\033[32m\033[2m"
@@ -121183,10 +121363,10 @@ index 0000000..604f3f0
+};
diff --git a/tools/gcc/size_overflow_plugin.c b/tools/gcc/size_overflow_plugin.c
new file mode 100644
-index 0000000..9ad0f39
+index 0000000..273e66a
--- /dev/null
+++ b/tools/gcc/size_overflow_plugin.c
-@@ -0,0 +1,1221 @@
+@@ -0,0 +1,1203 @@
+/*
+ * Copyright 2011, 2012 by Emese Revfy <re.emese@gmail.com>
+ * Licensed under the GPL v2, or (at your option) v3
@@ -121199,7 +121379,7 @@ index 0000000..9ad0f39
+ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed.
+ *
+ * Usage:
-+ * $ gcc -I`gcc -print-file-name=plugin`/include -fPIC -shared -O2 -o size_overflow_plugin.so size_overflow_plugin.c
++ * $ gcc -I`gcc -print-file-name=plugin`/include/c-family -I`gcc -print-file-name=plugin`/include -fPIC -shared -O2 -ggdb -Wall -W -Wno-missing-field-initializers -o size_overflow_plugin.so size_overflow_plugin.c
+ * $ gcc -fplugin=size_overflow_plugin.so test.c -O2
+ */
+
@@ -121253,8 +121433,8 @@ index 0000000..9ad0f39
+static unsigned int handle_function(void);
+
+static struct plugin_info size_overflow_plugin_info = {
-+ .version = "20120612beta",
-+ .help = "no-size_overflow\tturn off size overflow checking\n",
++ .version = "20120617beta",
++ .help = "no-size-overflow\tturn off size overflow checking\n",
+};
+
+static tree handle_size_overflow_attribute(tree *node, tree __unused name, tree args, int __unused flags, bool *no_add_attrs)
@@ -121279,6 +121459,9 @@ index 0000000..9ad0f39
+ .type_required = true,
+ .function_type_required = true,
+ .handler = handle_size_overflow_attribute
++#if BUILDING_GCC_VERSION >= 4007
++ .affects_type_identity = false
++#endif
+};
+
+static void register_attributes(void __unused *event_data, void __unused *data)
@@ -121539,11 +121722,17 @@ index 0000000..9ad0f39
+
+static tree cast_a_tree(tree type, tree var)
+{
++ gcc_assert(type != NULL_TREE && var != NULL_TREE);
+ gcc_assert(fold_convertible_p(type, var));
+
+ return fold_convert(type, var);
+}
+
++static tree signed_cast(tree var)
++{
++ return cast_a_tree(signed_size_overflow_type, var);
++}
++
+static gimple build_cast_stmt(tree type, tree var, tree new_var, location_t loc)
+{
+ gimple assign;
@@ -121642,7 +121831,7 @@ index 0000000..9ad0f39
+
+ if (rhs1 != NULL_TREE) {
+ if (!gimple_assign_cast_p(oldstmt))
-+ rhs1 = cast_a_tree(signed_size_overflow_type, rhs1);
++ rhs1 = signed_cast(rhs1);
+ gimple_assign_set_rhs1(stmt, rhs1);
+ }
+
@@ -121680,13 +121869,6 @@ index 0000000..9ad0f39
+ return phi;
+}
+
-+static tree signed_cast_constant(tree node)
-+{
-+ gcc_assert(is_gimple_constant(node));
-+
-+ return cast_a_tree(signed_size_overflow_type, node);
-+}
-+
+static basic_block create_a_first_bb(void)
+{
+ basic_block first_bb;
@@ -121782,7 +121964,7 @@ index 0000000..9ad0f39
+
+ arg = gimple_phi_arg_def(oldstmt, i);
+ if (is_gimple_constant(arg))
-+ arg = signed_cast_constant(arg);
++ arg = signed_cast(arg);
+ lhs = build_new_phi_arg(visited, potentionally_overflowed, arg, new_var);
+ if (lhs == NULL_TREE)
+ lhs = gimple_get_lhs(cast_old_phi_arg(oldstmt, arg, new_var, i));
@@ -121815,7 +121997,7 @@ index 0000000..9ad0f39
+ tree rhs1 = gimple_assign_rhs1(def_stmt);
+
+ if (is_gimple_constant(rhs1))
-+ return dup_assign(visited, potentionally_overflowed, def_stmt, signed_cast_constant(rhs1), NULL_TREE, NULL_TREE);
++ return dup_assign(visited, potentionally_overflowed, def_stmt, signed_cast(rhs1), NULL_TREE, NULL_TREE);
+
+ gcc_assert(TREE_CODE(rhs1) != COND_EXPR);
+ switch (TREE_CODE(rhs1)) {
@@ -121944,19 +122126,6 @@ index 0000000..9ad0f39
+// print_the_code_insertions(stmt);
+}
+
-+static tree get_type_for_check(tree rhs)
-+{
-+ tree def_rhs;
-+ gimple def_stmt = get_def_stmt(rhs);
-+
-+ if (!gimple_assign_cast_p(def_stmt))
-+ return TREE_TYPE(rhs);
-+ def_rhs = gimple_assign_rhs1(def_stmt);
-+ if (TREE_CODE(TREE_TYPE(def_rhs)) == INTEGER_TYPE)
-+ return TREE_TYPE(def_rhs);
-+ return TREE_TYPE(rhs);
-+}
-+
+static gimple cast_to_unsigned_size_overflow_type(gimple stmt, tree cast_rhs)
+{
+ gimple ucast_stmt;
@@ -121971,61 +122140,54 @@ index 0000000..9ad0f39
+
+static void check_size_overflow(gimple stmt, tree cast_rhs, tree rhs, bool *potentionally_overflowed)
+{
-+ tree type_max, type_min, rhs_type;
++ tree type_max, type_min, rhs_type = TREE_TYPE(rhs);
+ gimple ucast_stmt;
+
+ if (!*potentionally_overflowed)
+ return;
+
-+ rhs_type = get_type_for_check(rhs);
-+
+ if (TYPE_UNSIGNED(rhs_type)) {
+ ucast_stmt = cast_to_unsigned_size_overflow_type(stmt, cast_rhs);
+ type_max = cast_a_tree(unsigned_size_overflow_type, TYPE_MAX_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, GT_EXPR, gimple_get_lhs(ucast_stmt), type_max);
+ } else {
-+ type_max = cast_a_tree(signed_size_overflow_type, TYPE_MAX_VALUE(rhs_type));
++ type_max = signed_cast(TYPE_MAX_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, GT_EXPR, cast_rhs, type_max);
+
-+ type_min = cast_a_tree(signed_size_overflow_type, TYPE_MIN_VALUE(rhs_type));
++ type_min = signed_cast(TYPE_MIN_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, LT_EXPR, cast_rhs, type_min);
+ }
+}
+
-+static tree change_assign_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple stmt, tree orig_rhs)
++static tree change_assign_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple stmt, tree orig_rhs, tree new_rhs)
+{
+ gimple assign;
+ gimple_stmt_iterator gsi = gsi_for_stmt(stmt);
-+ tree new_rhs, origtype = TREE_TYPE(orig_rhs);
++ tree origtype = TREE_TYPE(orig_rhs);
+
+ gcc_assert(gimple_code(stmt) == GIMPLE_ASSIGN);
+
-+ new_rhs = expand(visited, potentionally_overflowed, orig_rhs);
-+ if (new_rhs == NULL_TREE)
-+ return NULL_TREE;
-+
+ assign = build_cast_stmt(origtype, new_rhs, CREATE_NEW_VAR, gimple_location(stmt));
+ gsi_insert_before(&gsi, assign, GSI_SAME_STMT);
+ update_stmt(assign);
+ return gimple_get_lhs(assign);
+}
+
-+static tree handle_const_assign(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple def_stmt, tree var, tree rhs, tree new_rhs1, tree new_rhs2, void (*gimple_assign_set_rhs)(gimple, tree))
++static tree handle_const_assign(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple def_stmt, tree var, tree orig_rhs, tree var_rhs, tree new_rhs1, tree new_rhs2, void (*gimple_assign_set_rhs)(gimple, tree))
+{
-+ tree new_rhs, cast_rhs;
++ tree new_rhs;
+
+ if (gimple_assign_rhs_code(def_stmt) == MIN_EXPR)
+ return dup_assign(visited, potentionally_overflowed, def_stmt, new_rhs1, new_rhs2, NULL_TREE);
+
-+ new_rhs = change_assign_rhs(visited, potentionally_overflowed, def_stmt, rhs);
-+ if (new_rhs != NULL_TREE) {
-+ gimple_assign_set_rhs(def_stmt, new_rhs);
-+ update_stmt(def_stmt);
++ if (var_rhs == NULL_TREE)
++ return create_assign(visited, potentionally_overflowed, def_stmt, var, AFTER_STMT);
+
-+ cast_rhs = gimple_assign_rhs1(get_def_stmt(new_rhs));
++ new_rhs = change_assign_rhs(visited, potentionally_overflowed, def_stmt, orig_rhs, var_rhs);
++ gimple_assign_set_rhs(def_stmt, new_rhs);
++ update_stmt(def_stmt);
+
-+ check_size_overflow(def_stmt, cast_rhs, rhs, potentionally_overflowed);
-+ }
++ check_size_overflow(def_stmt, var_rhs, orig_rhs, potentionally_overflowed);
+ return create_assign(visited, potentionally_overflowed, def_stmt, var, AFTER_STMT);
+}
+
@@ -122066,10 +122228,10 @@ index 0000000..9ad0f39
+ new_rhs2 = expand(visited, potentionally_overflowed, rhs2);
+
+ if (is_gimple_constant(rhs2))
-+ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs1, new_rhs1, signed_cast_constant(rhs2), &gimple_assign_set_rhs1);
++ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs1, new_rhs1, new_rhs1, signed_cast(rhs2), &gimple_assign_set_rhs1);
+
+ if (is_gimple_constant(rhs1))
-+ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs2, signed_cast_constant(rhs1), new_rhs2, &gimple_assign_set_rhs2);
++ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs2, new_rhs2, signed_cast(rhs1), new_rhs2, &gimple_assign_set_rhs2);
+
+ return dup_assign(visited, potentionally_overflowed, def_stmt, new_rhs1, new_rhs2, NULL_TREE);
+}
@@ -122078,7 +122240,7 @@ index 0000000..9ad0f39
+static tree get_new_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, tree rhs)
+{
+ if (is_gimple_constant(rhs))
-+ return signed_cast_constant(rhs);
++ return signed_cast(rhs);
+ if (TREE_CODE(rhs) != SSA_NAME)
+ return NULL_TREE;
+ return expand(visited, potentionally_overflowed, rhs);
diff --git a/3.2.20/0000_README b/3.2.20/0000_README
index fb633c6..032419d 100644
--- a/3.2.20/0000_README
+++ b/3.2.20/0000_README
@@ -6,7 +6,7 @@ Patch: 1019_linux-3.2.20.patch
From: http://www.kernel.org
Desc: Linux 3.2.20
-Patch: 4420_grsecurity-2.9.1-3.2.20-201206160836.patch
+Patch: 4420_grsecurity-2.9.1-3.2.20-201206171957.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.2.20/4420_grsecurity-2.9.1-3.2.20-201206160836.patch b/3.2.20/4420_grsecurity-2.9.1-3.2.20-201206171957.patch
index 5d95369..e582270 100644
--- a/3.2.20/4420_grsecurity-2.9.1-3.2.20-201206160836.patch
+++ b/3.2.20/4420_grsecurity-2.9.1-3.2.20-201206171957.patch
@@ -203,7 +203,7 @@ index 81c287f..d456d02 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index c7e9cc4..8448a0f 100644
+index c7e9cc4..7ce8f8d 100644
--- a/Makefile
+++ b/Makefile
@@ -245,8 +245,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -229,12 +229,13 @@ index c7e9cc4..8448a0f 100644
$(Q)$(MAKE) $(build)=scripts/basic
$(Q)rm -f .tmp_quiet_recordmcount
-@@ -564,6 +565,55 @@ else
+@@ -564,6 +565,56 @@ else
KBUILD_CFLAGS += -O2
endif
+ifndef DISABLE_PAX_PLUGINS
-+ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(HOSTCC)" "$(CC)"), y)
++PLUGINCC := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(HOSTCC)" "$(HOSTCXX)" "$(CC)")
++ifneq ($(PLUGINCC),)
+ifndef DISABLE_PAX_CONSTIFY_PLUGIN
+ifndef CONFIG_UML
+CONSTIFY_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/constify_plugin.so -DCONSTIFY_PLUGIN
@@ -264,7 +265,7 @@ index c7e9cc4..8448a0f 100644
+GCC_PLUGINS_CFLAGS := $(CONSTIFY_PLUGIN_CFLAGS) $(STACKLEAK_PLUGIN_CFLAGS) $(KALLOCSTAT_PLUGIN_CFLAGS)
+GCC_PLUGINS_CFLAGS += $(KERNEXEC_PLUGIN_CFLAGS) $(CHECKER_PLUGIN_CFLAGS) $(COLORIZE_PLUGIN_CFLAGS) $(SIZE_OVERFLOW_PLUGIN_CFLAGS)
+GCC_PLUGINS_AFLAGS := $(KERNEXEC_PLUGIN_AFLAGS)
-+export CONSTIFY_PLUGIN STACKLEAK_PLUGIN KERNEXEC_PLUGIN CHECKER_PLUGIN SIZE_OVERFLOW_PLUGIN
++export PLUGINCC CONSTIFY_PLUGIN STACKLEAK_PLUGIN KERNEXEC_PLUGIN CHECKER_PLUGIN SIZE_OVERFLOW_PLUGIN
+ifeq ($(KBUILD_EXTMOD),)
+gcc-plugins:
+ $(Q)$(MAKE) $(build)=tools/gcc
@@ -285,7 +286,7 @@ index c7e9cc4..8448a0f 100644
include $(srctree)/arch/$(SRCARCH)/Makefile
ifneq ($(CONFIG_FRAME_WARN),0)
-@@ -708,7 +758,7 @@ export mod_strip_cmd
+@@ -708,7 +759,7 @@ export mod_strip_cmd
ifeq ($(KBUILD_EXTMOD),)
@@ -294,7 +295,7 @@ index c7e9cc4..8448a0f 100644
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
-@@ -932,6 +982,8 @@ vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
+@@ -932,6 +983,8 @@ vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
# The actual objects are generated when descending,
# make sure no implicit rule kicks in
@@ -303,7 +304,7 @@ index c7e9cc4..8448a0f 100644
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
# Handle descending into subdirectories listed in $(vmlinux-dirs)
-@@ -941,7 +993,7 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
+@@ -941,7 +994,7 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
# Error messages still appears in the original language
PHONY += $(vmlinux-dirs)
@@ -312,7 +313,7 @@ index c7e9cc4..8448a0f 100644
$(Q)$(MAKE) $(build)=$@
# Store (new) KERNELRELASE string in include/config/kernel.release
-@@ -985,6 +1037,7 @@ prepare0: archprepare FORCE
+@@ -985,6 +1038,7 @@ prepare0: archprepare FORCE
$(Q)$(MAKE) $(build)=.
# All the preparing..
@@ -320,7 +321,7 @@ index c7e9cc4..8448a0f 100644
prepare: prepare0
# Generate some files
-@@ -1089,6 +1142,8 @@ all: modules
+@@ -1089,6 +1143,8 @@ all: modules
# using awk while concatenating to the final file.
PHONY += modules
@@ -329,7 +330,7 @@ index c7e9cc4..8448a0f 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.';
-@@ -1104,7 +1159,7 @@ modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
+@@ -1104,7 +1160,7 @@ modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
# Target to prepare building external modules
PHONY += modules_prepare
@@ -338,7 +339,7 @@ index c7e9cc4..8448a0f 100644
# Target to install modules
PHONY += modules_install
-@@ -1201,6 +1256,7 @@ distclean: mrproper
+@@ -1201,6 +1257,7 @@ distclean: mrproper
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
-o -name '.*.rej' \
@@ -346,7 +347,7 @@ index c7e9cc4..8448a0f 100644
-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
-type f -print | xargs rm -f
-@@ -1361,6 +1417,8 @@ PHONY += $(module-dirs) modules
+@@ -1361,6 +1418,8 @@ PHONY += $(module-dirs) modules
$(module-dirs): crmodverdir $(objtree)/Module.symvers
$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
@@ -355,7 +356,7 @@ index c7e9cc4..8448a0f 100644
modules: $(module-dirs)
@$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
-@@ -1487,17 +1545,21 @@ else
+@@ -1487,17 +1546,21 @@ else
target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
endif
@@ -381,7 +382,7 @@ index c7e9cc4..8448a0f 100644
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.symtypes: %.c prepare scripts FORCE
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
-@@ -1507,11 +1569,15 @@ endif
+@@ -1507,11 +1570,15 @@ endif
$(cmd_crmodverdir)
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
@@ -12976,7 +12977,7 @@ index 566e803..ce99a01 100644
}
diff --git a/arch/x86/include/asm/uaccess_64.h b/arch/x86/include/asm/uaccess_64.h
-index 1c66d30..bf1a2cc 100644
+index 1c66d30..d0f1634 100644
--- a/arch/x86/include/asm/uaccess_64.h
+++ b/arch/x86/include/asm/uaccess_64.h
@@ -10,6 +10,9 @@
@@ -13007,7 +13008,7 @@ index 1c66d30..bf1a2cc 100644
{
unsigned ret;
-@@ -32,142 +37,226 @@ copy_user_generic(void *to, const void *from, unsigned len)
+@@ -32,142 +37,238 @@ copy_user_generic(void *to, const void *from, unsigned len)
ASM_OUTPUT2("=a" (ret), "=D" (to), "=S" (from),
"=d" (len)),
"1" (to), "2" (from), "3" (len)
@@ -13027,6 +13028,22 @@ index 1c66d30..bf1a2cc 100644
-__must_check unsigned long
-copy_in_user(void __user *to, const void __user *from, unsigned len);
+copy_in_user(void __user *to, const void __user *from, unsigned long len) __size_overflow(3);
++
++extern void copy_to_user_overflow(void)
++#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
++ __compiletime_error("copy_to_user() buffer size is not provably correct")
++#else
++ __compiletime_warning("copy_to_user() buffer size is not provably correct")
++#endif
++;
++
++extern void copy_from_user_overflow(void)
++#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
++ __compiletime_error("copy_from_user() buffer size is not provably correct")
++#else
++ __compiletime_warning("copy_from_user() buffer size is not provably correct")
++#endif
++;
static inline unsigned long __must_check copy_from_user(void *to,
const void __user *from,
@@ -13085,9 +13102,7 @@ index 1c66d30..bf1a2cc 100644
+#endif
+
+ if (unlikely(sz != -1 && sz < size)) {
-+#ifdef CONFIG_DEBUG_VM
-+ WARN(1, "Buffer overflow detected!\n");
-+#endif
++ copy_from_user_overflow();
+ return size;
+ }
+
@@ -13173,9 +13188,7 @@ index 1c66d30..bf1a2cc 100644
+#endif
+
+ if (unlikely(sz != -1 && sz < size)) {
-+#ifdef CONFIG_DEBUG_VM
-+ WARN(1, "Buffer overflow detected!\n");
-+#endif
++ copy_to_user_overflow();
+ return size;
+ }
+
@@ -13282,7 +13295,7 @@ index 1c66d30..bf1a2cc 100644
ret, "b", "b", "=q", 1);
if (likely(!ret))
__put_user_asm(tmp, (u8 __user *)dst,
-@@ -176,7 +265,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -176,7 +277,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
}
case 2: {
u16 tmp;
@@ -13291,7 +13304,7 @@ index 1c66d30..bf1a2cc 100644
ret, "w", "w", "=r", 2);
if (likely(!ret))
__put_user_asm(tmp, (u16 __user *)dst,
-@@ -186,7 +275,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -186,7 +287,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
case 4: {
u32 tmp;
@@ -13300,7 +13313,7 @@ index 1c66d30..bf1a2cc 100644
ret, "l", "k", "=r", 4);
if (likely(!ret))
__put_user_asm(tmp, (u32 __user *)dst,
-@@ -195,7 +284,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -195,7 +296,7 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
}
case 8: {
u64 tmp;
@@ -13309,7 +13322,7 @@ index 1c66d30..bf1a2cc 100644
ret, "q", "", "=r", 8);
if (likely(!ret))
__put_user_asm(tmp, (u64 __user *)dst,
-@@ -203,8 +292,16 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
+@@ -203,8 +304,16 @@ int __copy_in_user(void __user *dst, const void __user *src, unsigned size)
return ret;
}
default:
@@ -13328,7 +13341,7 @@ index 1c66d30..bf1a2cc 100644
}
}
-@@ -215,39 +312,76 @@ __strncpy_from_user(char *dst, const char __user *src, long count);
+@@ -215,39 +324,76 @@ __strncpy_from_user(char *dst, const char __user *src, long count);
__must_check long strnlen_user(const char __user *str, long n);
__must_check long __strnlen_user(const char __user *str, long n);
__must_check long strlen_user(const char __user *str);
@@ -23508,7 +23521,7 @@ index e218d5d..a99a1eb 100644
+EXPORT_SYMBOL(set_fs);
+#endif
diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c
-index b7c2849..8633ad8 100644
+index b7c2849..ca4b1cb 100644
--- a/arch/x86/lib/usercopy_64.c
+++ b/arch/x86/lib/usercopy_64.c
@@ -42,6 +42,12 @@ long
@@ -23572,6 +23585,22 @@ index b7c2849..8633ad8 100644
{
char c;
unsigned zero_len;
+@@ -181,3 +201,15 @@ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest)
+ break;
+ return len;
+ }
++
++void copy_from_user_overflow(void)
++{
++ WARN(1, "Buffer overflow detected!\n");
++}
++EXPORT_SYMBOL(copy_from_user_overflow);
++
++void copy_to_user_overflow(void)
++{
++ WARN(1, "Buffer overflow detected!\n");
++}
++EXPORT_SYMBOL(copy_to_user_overflow);
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index d0474ad..36e9257 100644
--- a/arch/x86/mm/extable.c
@@ -79152,7 +79181,7 @@ index 0174034..65eaf78 100644
}
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
-index d2b366c..51ff91ebc 100644
+index d2b366c..2d5a6f8 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -109,7 +109,7 @@ endif
@@ -79160,7 +79189,7 @@ index d2b366c..51ff91ebc 100644
# Do not include host rules unless needed
-ifneq ($(hostprogs-y)$(hostprogs-m),)
-+ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m),)
++ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),)
include scripts/Makefile.host
endif
@@ -79221,24 +79250,75 @@ index a57f5bd..d3bae5e 100644
echo "\#include <asm-generic/$$F>" > $(install)/$$F; \
done; \
diff --git a/scripts/Makefile.host b/scripts/Makefile.host
-index 1ac414f..a1c1451 100644
+index 1ac414f..38575f7 100644
--- a/scripts/Makefile.host
+++ b/scripts/Makefile.host
-@@ -31,6 +31,7 @@
+@@ -31,6 +31,8 @@
# Note: Shared libraries consisting of C++ files are not supported
__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
+__hostlibs := $(sort $(hostlibs-y) $(hostlibs-m))
++__hostcxxlibs := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
# C code
# Executables compiled from a single .c file
-@@ -54,6 +55,7 @@ host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
+@@ -54,11 +56,15 @@ host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
# Shared libaries (only .c supported)
# Shared libraries (.so) - all .so files referenced in "xxx-objs"
host-cshlib := $(sort $(filter %.so, $(host-cobjs)))
+host-cshlib += $(sort $(filter %.so, $(__hostlibs)))
++host-cxxshlib := $(sort $(filter %.so, $(__hostcxxlibs)))
# Remove .so files from "xxx-objs"
host-cobjs := $(filter-out %.so,$(host-cobjs))
++host-cxxobjs := $(filter-out %.so,$(host-cxxobjs))
+
+-#Object (.o) files used by the shared libaries
++# Object (.o) files used by the shared libaries
+ host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
++host-cxxshobjs := $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
+
+ # output directory for programs/.o files
+ # hostprogs-y := tools/build may have been specified. Retrieve directory
+@@ -82,7 +88,9 @@ host-cobjs := $(addprefix $(obj)/,$(host-cobjs))
+ host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti))
+ host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs))
+ host-cshlib := $(addprefix $(obj)/,$(host-cshlib))
++host-cxxshlib := $(addprefix $(obj)/,$(host-cxxshlib))
+ host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs))
++host-cxxshobjs := $(addprefix $(obj)/,$(host-cxxshobjs))
+ host-objdirs := $(addprefix $(obj)/,$(host-objdirs))
+
+ obj-dirs += $(host-objdirs)
+@@ -156,6 +164,13 @@ quiet_cmd_host-cshobjs = HOSTCC -fPIC $@
+ $(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
+ $(call if_changed_dep,host-cshobjs)
+
++# Compile .c file, create position independent .o file
++# host-cxxshobjs -> .o
++quiet_cmd_host-cxxshobjs = HOSTCXX -fPIC $@
++ cmd_host-cxxshobjs = $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
++$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
++ $(call if_changed_dep,host-cxxshobjs)
++
+ # Link a shared library, based on position independent .o files
+ # *.o -> .so shared library (host-cshlib)
+ quiet_cmd_host-cshlib = HOSTLLD -shared $@
+@@ -165,6 +180,15 @@ quiet_cmd_host-cshlib = HOSTLLD -shared $@
+ $(host-cshlib): $(obj)/%: $(host-cshobjs) FORCE
+ $(call if_changed,host-cshlib)
+
++# Link a shared library, based on position independent .o files
++# *.o -> .so shared library (host-cxxshlib)
++quiet_cmd_host-cxxshlib = HOSTLLD -shared $@
++ cmd_host-cxxshlib = $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \
++ $(addprefix $(obj)/,$($(@F:.so=-objs))) \
++ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
++$(host-cxxshlib): $(obj)/%: $(host-cxxshobjs) FORCE
++ $(call if_changed,host-cxxshlib)
++
+ targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\
+- $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs)
++ $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c
index cb1f50c..cef2a7c 100644
@@ -79289,12 +79369,27 @@ index cb1f50c..cef2a7c 100644
fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianess? %#x\n",
diff --git a/scripts/gcc-plugin.sh b/scripts/gcc-plugin.sh
new file mode 100644
-index 0000000..8729101
+index 0000000..5a412da
--- /dev/null
+++ b/scripts/gcc-plugin.sh
-@@ -0,0 +1,2 @@
+@@ -0,0 +1,17 @@
+#!/bin/sh
-+echo -e "#include \"gcc-plugin.h\"\n#include \"tree.h\"\n#include \"tm.h\"\n#include \"rtl.h\"" | $1 -x c -shared - -o /dev/null -I`$2 -print-file-name=plugin`/include >/dev/null 2>&1 && echo "y"
++plugincc=`$1 -x c -shared - -o /dev/null -I\`$3 -print-file-name=plugin\`/include 2>&1 <<EOF
++#include "gcc-plugin.h"
++#include "tree.h"
++#include "tm.h"
++#include "rtl.h"
++#ifdef ENABLE_BUILD_WITH_CXX
++#warning $2
++#else
++#warning $1
++#endif
++EOF`
++if [ $? -eq 0 ]
++then
++ [[ "$plugincc" =~ "$1" ]] && echo $1
++ [[ "$plugincc" =~ "$2" ]] && echo $2
++fi
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index d1d0ae8..6b73b2a 100644
--- a/scripts/mod/file2alias.c
@@ -81096,28 +81191,33 @@ index a39edcc..1014050 100644
};
diff --git a/tools/gcc/Makefile b/tools/gcc/Makefile
new file mode 100644
-index 0000000..ca64170
+index 0000000..991f33b
--- /dev/null
+++ b/tools/gcc/Makefile
-@@ -0,0 +1,26 @@
+@@ -0,0 +1,31 @@
+#CC := gcc
+#PLUGIN_SOURCE_FILES := pax_plugin.c
+#PLUGIN_OBJECT_FILES := $(patsubst %.c,%.o,$(PLUGIN_SOURCE_FILES))
+GCCPLUGINS_DIR := $(shell $(CC) -print-file-name=plugin)
+#CFLAGS += -I$(GCCPLUGINS_DIR)/include -fPIC -O2 -Wall -W -std=gnu99
+
++ifeq ($(PLUGINCC),$(HOSTCC))
++HOSTLIBS := hostlibs
+HOST_EXTRACFLAGS += -I$(GCCPLUGINS_DIR)/include -I$(GCCPLUGINS_DIR)/include/c-family -std=gnu99 -ggdb
-+CFLAGS_size_overflow_plugin.o := -Wno-missing-initializer
++else
++HOSTLIBS := hostcxxlibs
++HOST_EXTRACXXFLAGS += -I$(GCCPLUGINS_DIR)/include -I$(GCCPLUGINS_DIR)/include/c-family -std=gnu++98 -ggdb -Wno-unused-parameter
++endif
+
-+hostlibs-y := constify_plugin.so
-+hostlibs-$(CONFIG_PAX_MEMORY_STACKLEAK) += stackleak_plugin.so
-+hostlibs-$(CONFIG_KALLOCSTAT_PLUGIN) += kallocstat_plugin.so
-+hostlibs-$(CONFIG_PAX_KERNEXEC_PLUGIN) += kernexec_plugin.so
-+hostlibs-$(CONFIG_CHECKER_PLUGIN) += checker_plugin.so
-+hostlibs-y += colorize_plugin.so
-+hostlibs-$(CONFIG_PAX_SIZE_OVERFLOW) += size_overflow_plugin.so
++$(HOSTLIBS)-y := constify_plugin.so
++$(HOSTLIBS)-$(CONFIG_PAX_MEMORY_STACKLEAK) += stackleak_plugin.so
++$(HOSTLIBS)-$(CONFIG_KALLOCSTAT_PLUGIN) += kallocstat_plugin.so
++$(HOSTLIBS)-$(CONFIG_PAX_KERNEXEC_PLUGIN) += kernexec_plugin.so
++$(HOSTLIBS)-$(CONFIG_CHECKER_PLUGIN) += checker_plugin.so
++$(HOSTLIBS)-y += colorize_plugin.so
++$(HOSTLIBS)-$(CONFIG_PAX_SIZE_OVERFLOW) += size_overflow_plugin.so
+
-+always := $(hostlibs-y)
++always := $($(HOSTLIBS)-y)
+
+constify_plugin-objs := constify_plugin.o
+stackleak_plugin-objs := stackleak_plugin.o
@@ -81305,10 +81405,10 @@ index 0000000..d41b5af
+}
diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c
new file mode 100644
-index 0000000..ee950d0
+index 0000000..7a5e311
--- /dev/null
+++ b/tools/gcc/colorize_plugin.c
-@@ -0,0 +1,147 @@
+@@ -0,0 +1,148 @@
+/*
+ * Copyright 2012 by PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
@@ -81340,6 +81440,7 @@ index 0000000..ee950d0
+
+static struct plugin_info colorize_plugin_info = {
+ .version = "201203092200",
++ .help = NULL,
+};
+
+#define GREEN "\033[32m\033[2m"
@@ -99089,10 +99190,10 @@ index 0000000..cd8690a
+};
diff --git a/tools/gcc/size_overflow_plugin.c b/tools/gcc/size_overflow_plugin.c
new file mode 100644
-index 0000000..9ad0f39
+index 0000000..273e66a
--- /dev/null
+++ b/tools/gcc/size_overflow_plugin.c
-@@ -0,0 +1,1221 @@
+@@ -0,0 +1,1203 @@
+/*
+ * Copyright 2011, 2012 by Emese Revfy <re.emese@gmail.com>
+ * Licensed under the GPL v2, or (at your option) v3
@@ -99105,7 +99206,7 @@ index 0000000..9ad0f39
+ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed.
+ *
+ * Usage:
-+ * $ gcc -I`gcc -print-file-name=plugin`/include -fPIC -shared -O2 -o size_overflow_plugin.so size_overflow_plugin.c
++ * $ gcc -I`gcc -print-file-name=plugin`/include/c-family -I`gcc -print-file-name=plugin`/include -fPIC -shared -O2 -ggdb -Wall -W -Wno-missing-field-initializers -o size_overflow_plugin.so size_overflow_plugin.c
+ * $ gcc -fplugin=size_overflow_plugin.so test.c -O2
+ */
+
@@ -99159,8 +99260,8 @@ index 0000000..9ad0f39
+static unsigned int handle_function(void);
+
+static struct plugin_info size_overflow_plugin_info = {
-+ .version = "20120612beta",
-+ .help = "no-size_overflow\tturn off size overflow checking\n",
++ .version = "20120617beta",
++ .help = "no-size-overflow\tturn off size overflow checking\n",
+};
+
+static tree handle_size_overflow_attribute(tree *node, tree __unused name, tree args, int __unused flags, bool *no_add_attrs)
@@ -99185,6 +99286,9 @@ index 0000000..9ad0f39
+ .type_required = true,
+ .function_type_required = true,
+ .handler = handle_size_overflow_attribute
++#if BUILDING_GCC_VERSION >= 4007
++ .affects_type_identity = false
++#endif
+};
+
+static void register_attributes(void __unused *event_data, void __unused *data)
@@ -99445,11 +99549,17 @@ index 0000000..9ad0f39
+
+static tree cast_a_tree(tree type, tree var)
+{
++ gcc_assert(type != NULL_TREE && var != NULL_TREE);
+ gcc_assert(fold_convertible_p(type, var));
+
+ return fold_convert(type, var);
+}
+
++static tree signed_cast(tree var)
++{
++ return cast_a_tree(signed_size_overflow_type, var);
++}
++
+static gimple build_cast_stmt(tree type, tree var, tree new_var, location_t loc)
+{
+ gimple assign;
@@ -99548,7 +99658,7 @@ index 0000000..9ad0f39
+
+ if (rhs1 != NULL_TREE) {
+ if (!gimple_assign_cast_p(oldstmt))
-+ rhs1 = cast_a_tree(signed_size_overflow_type, rhs1);
++ rhs1 = signed_cast(rhs1);
+ gimple_assign_set_rhs1(stmt, rhs1);
+ }
+
@@ -99586,13 +99696,6 @@ index 0000000..9ad0f39
+ return phi;
+}
+
-+static tree signed_cast_constant(tree node)
-+{
-+ gcc_assert(is_gimple_constant(node));
-+
-+ return cast_a_tree(signed_size_overflow_type, node);
-+}
-+
+static basic_block create_a_first_bb(void)
+{
+ basic_block first_bb;
@@ -99688,7 +99791,7 @@ index 0000000..9ad0f39
+
+ arg = gimple_phi_arg_def(oldstmt, i);
+ if (is_gimple_constant(arg))
-+ arg = signed_cast_constant(arg);
++ arg = signed_cast(arg);
+ lhs = build_new_phi_arg(visited, potentionally_overflowed, arg, new_var);
+ if (lhs == NULL_TREE)
+ lhs = gimple_get_lhs(cast_old_phi_arg(oldstmt, arg, new_var, i));
@@ -99721,7 +99824,7 @@ index 0000000..9ad0f39
+ tree rhs1 = gimple_assign_rhs1(def_stmt);
+
+ if (is_gimple_constant(rhs1))
-+ return dup_assign(visited, potentionally_overflowed, def_stmt, signed_cast_constant(rhs1), NULL_TREE, NULL_TREE);
++ return dup_assign(visited, potentionally_overflowed, def_stmt, signed_cast(rhs1), NULL_TREE, NULL_TREE);
+
+ gcc_assert(TREE_CODE(rhs1) != COND_EXPR);
+ switch (TREE_CODE(rhs1)) {
@@ -99850,19 +99953,6 @@ index 0000000..9ad0f39
+// print_the_code_insertions(stmt);
+}
+
-+static tree get_type_for_check(tree rhs)
-+{
-+ tree def_rhs;
-+ gimple def_stmt = get_def_stmt(rhs);
-+
-+ if (!gimple_assign_cast_p(def_stmt))
-+ return TREE_TYPE(rhs);
-+ def_rhs = gimple_assign_rhs1(def_stmt);
-+ if (TREE_CODE(TREE_TYPE(def_rhs)) == INTEGER_TYPE)
-+ return TREE_TYPE(def_rhs);
-+ return TREE_TYPE(rhs);
-+}
-+
+static gimple cast_to_unsigned_size_overflow_type(gimple stmt, tree cast_rhs)
+{
+ gimple ucast_stmt;
@@ -99877,61 +99967,54 @@ index 0000000..9ad0f39
+
+static void check_size_overflow(gimple stmt, tree cast_rhs, tree rhs, bool *potentionally_overflowed)
+{
-+ tree type_max, type_min, rhs_type;
++ tree type_max, type_min, rhs_type = TREE_TYPE(rhs);
+ gimple ucast_stmt;
+
+ if (!*potentionally_overflowed)
+ return;
+
-+ rhs_type = get_type_for_check(rhs);
-+
+ if (TYPE_UNSIGNED(rhs_type)) {
+ ucast_stmt = cast_to_unsigned_size_overflow_type(stmt, cast_rhs);
+ type_max = cast_a_tree(unsigned_size_overflow_type, TYPE_MAX_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, GT_EXPR, gimple_get_lhs(ucast_stmt), type_max);
+ } else {
-+ type_max = cast_a_tree(signed_size_overflow_type, TYPE_MAX_VALUE(rhs_type));
++ type_max = signed_cast(TYPE_MAX_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, GT_EXPR, cast_rhs, type_max);
+
-+ type_min = cast_a_tree(signed_size_overflow_type, TYPE_MIN_VALUE(rhs_type));
++ type_min = signed_cast(TYPE_MIN_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, LT_EXPR, cast_rhs, type_min);
+ }
+}
+
-+static tree change_assign_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple stmt, tree orig_rhs)
++static tree change_assign_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple stmt, tree orig_rhs, tree new_rhs)
+{
+ gimple assign;
+ gimple_stmt_iterator gsi = gsi_for_stmt(stmt);
-+ tree new_rhs, origtype = TREE_TYPE(orig_rhs);
++ tree origtype = TREE_TYPE(orig_rhs);
+
+ gcc_assert(gimple_code(stmt) == GIMPLE_ASSIGN);
+
-+ new_rhs = expand(visited, potentionally_overflowed, orig_rhs);
-+ if (new_rhs == NULL_TREE)
-+ return NULL_TREE;
-+
+ assign = build_cast_stmt(origtype, new_rhs, CREATE_NEW_VAR, gimple_location(stmt));
+ gsi_insert_before(&gsi, assign, GSI_SAME_STMT);
+ update_stmt(assign);
+ return gimple_get_lhs(assign);
+}
+
-+static tree handle_const_assign(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple def_stmt, tree var, tree rhs, tree new_rhs1, tree new_rhs2, void (*gimple_assign_set_rhs)(gimple, tree))
++static tree handle_const_assign(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple def_stmt, tree var, tree orig_rhs, tree var_rhs, tree new_rhs1, tree new_rhs2, void (*gimple_assign_set_rhs)(gimple, tree))
+{
-+ tree new_rhs, cast_rhs;
++ tree new_rhs;
+
+ if (gimple_assign_rhs_code(def_stmt) == MIN_EXPR)
+ return dup_assign(visited, potentionally_overflowed, def_stmt, new_rhs1, new_rhs2, NULL_TREE);
+
-+ new_rhs = change_assign_rhs(visited, potentionally_overflowed, def_stmt, rhs);
-+ if (new_rhs != NULL_TREE) {
-+ gimple_assign_set_rhs(def_stmt, new_rhs);
-+ update_stmt(def_stmt);
++ if (var_rhs == NULL_TREE)
++ return create_assign(visited, potentionally_overflowed, def_stmt, var, AFTER_STMT);
+
-+ cast_rhs = gimple_assign_rhs1(get_def_stmt(new_rhs));
++ new_rhs = change_assign_rhs(visited, potentionally_overflowed, def_stmt, orig_rhs, var_rhs);
++ gimple_assign_set_rhs(def_stmt, new_rhs);
++ update_stmt(def_stmt);
+
-+ check_size_overflow(def_stmt, cast_rhs, rhs, potentionally_overflowed);
-+ }
++ check_size_overflow(def_stmt, var_rhs, orig_rhs, potentionally_overflowed);
+ return create_assign(visited, potentionally_overflowed, def_stmt, var, AFTER_STMT);
+}
+
@@ -99972,10 +100055,10 @@ index 0000000..9ad0f39
+ new_rhs2 = expand(visited, potentionally_overflowed, rhs2);
+
+ if (is_gimple_constant(rhs2))
-+ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs1, new_rhs1, signed_cast_constant(rhs2), &gimple_assign_set_rhs1);
++ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs1, new_rhs1, new_rhs1, signed_cast(rhs2), &gimple_assign_set_rhs1);
+
+ if (is_gimple_constant(rhs1))
-+ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs2, signed_cast_constant(rhs1), new_rhs2, &gimple_assign_set_rhs2);
++ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs2, new_rhs2, signed_cast(rhs1), new_rhs2, &gimple_assign_set_rhs2);
+
+ return dup_assign(visited, potentionally_overflowed, def_stmt, new_rhs1, new_rhs2, NULL_TREE);
+}
@@ -99984,7 +100067,7 @@ index 0000000..9ad0f39
+static tree get_new_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, tree rhs)
+{
+ if (is_gimple_constant(rhs))
-+ return signed_cast_constant(rhs);
++ return signed_cast(rhs);
+ if (TREE_CODE(rhs) != SSA_NAME)
+ return NULL_TREE;
+ return expand(visited, potentionally_overflowed, rhs);
diff --git a/3.4.2/0000_README b/3.4.3/0000_README
index e8b7a86..510fb5d 100644
--- a/3.4.2/0000_README
+++ b/3.4.3/0000_README
@@ -2,7 +2,11 @@ README
-----------------------------------------------------------------------------
Individual Patch Descriptions:
-----------------------------------------------------------------------------
-Patch: 4420_grsecurity-2.9.1-3.4.2-201206160836.patch
+Patch: 1002_linux-3.4.3.patch
+From: http://www.kernel.org
+Desc: Linux 3.4.3
+
+Patch: 4420_grsecurity-2.9.1-3.4.3-201206171836.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.4.3/1002_linux-3.4.3.patch b/3.4.3/1002_linux-3.4.3.patch
new file mode 100644
index 0000000..2c6ffa6
--- /dev/null
+++ b/3.4.3/1002_linux-3.4.3.patch
@@ -0,0 +1,1622 @@
+diff --git a/Makefile b/Makefile
+index 901a955..a0804c6 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 4
+-SUBLEVEL = 2
++SUBLEVEL = 3
+ EXTRAVERSION =
+ NAME = Saber-toothed Squirrel
+
+diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c
+index 0b6d796..2e3200c 100644
+--- a/arch/powerpc/kernel/module_32.c
++++ b/arch/powerpc/kernel/module_32.c
+@@ -176,8 +176,8 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr,
+
+ static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val)
+ {
+- if (entry->jump[0] == 0x3d600000 + ((val + 0x8000) >> 16)
+- && entry->jump[1] == 0x396b0000 + (val & 0xffff))
++ if (entry->jump[0] == 0x3d800000 + ((val + 0x8000) >> 16)
++ && entry->jump[1] == 0x398c0000 + (val & 0xffff))
+ return 1;
+ return 0;
+ }
+@@ -204,10 +204,9 @@ static uint32_t do_plt_call(void *location,
+ entry++;
+ }
+
+- /* Stolen from Paul Mackerras as well... */
+- entry->jump[0] = 0x3d600000+((val+0x8000)>>16); /* lis r11,sym@ha */
+- entry->jump[1] = 0x396b0000 + (val&0xffff); /* addi r11,r11,sym@l*/
+- entry->jump[2] = 0x7d6903a6; /* mtctr r11 */
++ entry->jump[0] = 0x3d800000+((val+0x8000)>>16); /* lis r12,sym@ha */
++ entry->jump[1] = 0x398c0000 + (val&0xffff); /* addi r12,r12,sym@l*/
++ entry->jump[2] = 0x7d8903a6; /* mtctr r12 */
+ entry->jump[3] = 0x4e800420; /* bctr */
+
+ DEBUGP("Initialized plt for 0x%x at %p\n", val, entry);
+diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
+index 2c42cd7..730e69c 100644
+--- a/arch/powerpc/kernel/time.c
++++ b/arch/powerpc/kernel/time.c
+@@ -474,6 +474,7 @@ void timer_interrupt(struct pt_regs * regs)
+ struct pt_regs *old_regs;
+ u64 *next_tb = &__get_cpu_var(decrementers_next_tb);
+ struct clock_event_device *evt = &__get_cpu_var(decrementers);
++ u64 now;
+
+ /* Ensure a positive value is written to the decrementer, or else
+ * some CPUs will continue to take decrementer exceptions.
+@@ -508,9 +509,16 @@ void timer_interrupt(struct pt_regs * regs)
+ irq_work_run();
+ }
+
+- *next_tb = ~(u64)0;
+- if (evt->event_handler)
+- evt->event_handler(evt);
++ now = get_tb_or_rtc();
++ if (now >= *next_tb) {
++ *next_tb = ~(u64)0;
++ if (evt->event_handler)
++ evt->event_handler(evt);
++ } else {
++ now = *next_tb - now;
++ if (now <= DECREMENTER_MAX)
++ set_dec((int)now);
++ }
+
+ #ifdef CONFIG_PPC64
+ /* collect purr register values often, for accurate calculations */
+diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S
+index be6d9e3..3470624 100644
+--- a/arch/x86/crypto/aesni-intel_asm.S
++++ b/arch/x86/crypto/aesni-intel_asm.S
+@@ -2460,10 +2460,12 @@ ENTRY(aesni_cbc_dec)
+ pxor IN3, STATE4
+ movaps IN4, IV
+ #else
+- pxor (INP), STATE2
+- pxor 0x10(INP), STATE3
+ pxor IN1, STATE4
+ movaps IN2, IV
++ movups (INP), IN1
++ pxor IN1, STATE2
++ movups 0x10(INP), IN2
++ pxor IN2, STATE3
+ #endif
+ movups STATE1, (OUTP)
+ movups STATE2, 0x10(OUTP)
+diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h
+index becf47b..6149b47 100644
+--- a/arch/x86/include/asm/uv/uv_bau.h
++++ b/arch/x86/include/asm/uv/uv_bau.h
+@@ -149,7 +149,6 @@
+ /* 4 bits of software ack period */
+ #define UV2_ACK_MASK 0x7UL
+ #define UV2_ACK_UNITS_SHFT 3
+-#define UV2_LEG_SHFT UV2H_LB_BAU_MISC_CONTROL_USE_LEGACY_DESCRIPTOR_FORMATS_SHFT
+ #define UV2_EXT_SHFT UV2H_LB_BAU_MISC_CONTROL_ENABLE_EXTENDED_SB_STATUS_SHFT
+
+ /*
+diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c
+index 99b5717..2c1d178 100644
+--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
++++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
+@@ -51,6 +51,7 @@ struct threshold_block {
+ unsigned int cpu;
+ u32 address;
+ u16 interrupt_enable;
++ bool interrupt_capable;
+ u16 threshold_limit;
+ struct kobject kobj;
+ struct list_head miscj;
+@@ -83,6 +84,21 @@ struct thresh_restart {
+ u16 old_limit;
+ };
+
++static bool lvt_interrupt_supported(unsigned int bank, u32 msr_high_bits)
++{
++ /*
++ * bank 4 supports APIC LVT interrupts implicitly since forever.
++ */
++ if (bank == 4)
++ return true;
++
++ /*
++ * IntP: interrupt present; if this bit is set, the thresholding
++ * bank can generate APIC LVT interrupts
++ */
++ return msr_high_bits & BIT(28);
++}
++
+ static int lvt_off_valid(struct threshold_block *b, int apic, u32 lo, u32 hi)
+ {
+ int msr = (hi & MASK_LVTOFF_HI) >> 20;
+@@ -104,8 +120,10 @@ static int lvt_off_valid(struct threshold_block *b, int apic, u32 lo, u32 hi)
+ return 1;
+ };
+
+-/* must be called with correct cpu affinity */
+-/* Called via smp_call_function_single() */
++/*
++ * Called via smp_call_function_single(), must be called with correct
++ * cpu affinity.
++ */
+ static void threshold_restart_bank(void *_tr)
+ {
+ struct thresh_restart *tr = _tr;
+@@ -128,6 +146,12 @@ static void threshold_restart_bank(void *_tr)
+ (new_count & THRESHOLD_MAX);
+ }
+
++ /* clear IntType */
++ hi &= ~MASK_INT_TYPE_HI;
++
++ if (!tr->b->interrupt_capable)
++ goto done;
++
+ if (tr->set_lvt_off) {
+ if (lvt_off_valid(tr->b, tr->lvt_off, lo, hi)) {
+ /* set new lvt offset */
+@@ -136,9 +160,10 @@ static void threshold_restart_bank(void *_tr)
+ }
+ }
+
+- tr->b->interrupt_enable ?
+- (hi = (hi & ~MASK_INT_TYPE_HI) | INT_TYPE_APIC) :
+- (hi &= ~MASK_INT_TYPE_HI);
++ if (tr->b->interrupt_enable)
++ hi |= INT_TYPE_APIC;
++
++ done:
+
+ hi |= MASK_COUNT_EN_HI;
+ wrmsr(tr->b->address, lo, hi);
+@@ -202,14 +227,17 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
+ if (shared_bank[bank] && c->cpu_core_id)
+ break;
+
+- offset = setup_APIC_mce(offset,
+- (high & MASK_LVTOFF_HI) >> 20);
+-
+ memset(&b, 0, sizeof(b));
+- b.cpu = cpu;
+- b.bank = bank;
+- b.block = block;
+- b.address = address;
++ b.cpu = cpu;
++ b.bank = bank;
++ b.block = block;
++ b.address = address;
++ b.interrupt_capable = lvt_interrupt_supported(bank, high);
++
++ if (b.interrupt_capable) {
++ int new = (high & MASK_LVTOFF_HI) >> 20;
++ offset = setup_APIC_mce(offset, new);
++ }
+
+ mce_threshold_block_init(&b, offset);
+ mce_threshold_vector = amd_threshold_interrupt;
+@@ -309,6 +337,9 @@ store_interrupt_enable(struct threshold_block *b, const char *buf, size_t size)
+ struct thresh_restart tr;
+ unsigned long new;
+
++ if (!b->interrupt_capable)
++ return -EINVAL;
++
+ if (strict_strtoul(buf, 0, &new) < 0)
+ return -EINVAL;
+
+@@ -467,6 +498,7 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
+ b->cpu = cpu;
+ b->address = address;
+ b->interrupt_enable = 0;
++ b->interrupt_capable = lvt_interrupt_supported(bank, high);
+ b->threshold_limit = THRESHOLD_MAX;
+
+ INIT_LIST_HEAD(&b->miscj);
+diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c
+index 3ae0e61..59880af 100644
+--- a/arch/x86/platform/uv/tlb_uv.c
++++ b/arch/x86/platform/uv/tlb_uv.c
+@@ -1295,7 +1295,6 @@ static void __init enable_timeouts(void)
+ */
+ mmr_image |= (1L << SOFTACK_MSHIFT);
+ if (is_uv2_hub()) {
+- mmr_image &= ~(1L << UV2_LEG_SHFT);
+ mmr_image |= (1L << UV2_EXT_SHFT);
+ }
+ write_mmr_misc_control(pnode, mmr_image);
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index 9577b6f..66e8f73 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -1745,6 +1745,7 @@ static int acpi_video_bus_remove(struct acpi_device *device, int type)
+
+ static int __init intel_opregion_present(void)
+ {
++ int i915 = 0;
+ #if defined(CONFIG_DRM_I915) || defined(CONFIG_DRM_I915_MODULE)
+ struct pci_dev *dev = NULL;
+ u32 address;
+@@ -1757,10 +1758,10 @@ static int __init intel_opregion_present(void)
+ pci_read_config_dword(dev, 0xfc, &address);
+ if (!address)
+ continue;
+- return 1;
++ i915 = 1;
+ }
+ #endif
+- return 0;
++ return i915;
+ }
+
+ int acpi_video_register(void)
+diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
+index 7857e8f..3c809bf 100644
+--- a/drivers/ata/ata_piix.c
++++ b/drivers/ata/ata_piix.c
+@@ -1554,6 +1554,39 @@ static bool piix_broken_system_poweroff(struct pci_dev *pdev)
+ return false;
+ }
+
++static int prefer_ms_hyperv = 1;
++module_param(prefer_ms_hyperv, int, 0);
++
++static void piix_ignore_devices_quirk(struct ata_host *host)
++{
++#if IS_ENABLED(CONFIG_HYPERV_STORAGE)
++ static const struct dmi_system_id ignore_hyperv[] = {
++ {
++ /* On Hyper-V hypervisors the disks are exposed on
++ * both the emulated SATA controller and on the
++ * paravirtualised drivers. The CD/DVD devices
++ * are only exposed on the emulated controller.
++ * Request we ignore ATA devices on this host.
++ */
++ .ident = "Hyper-V Virtual Machine",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR,
++ "Microsoft Corporation"),
++ DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
++ },
++ },
++ { } /* terminate list */
++ };
++ const struct dmi_system_id *dmi = dmi_first_match(ignore_hyperv);
++
++ if (dmi && prefer_ms_hyperv) {
++ host->flags |= ATA_HOST_IGNORE_ATA;
++ dev_info(host->dev, "%s detected, ATA device ignore set\n",
++ dmi->ident);
++ }
++#endif
++}
++
+ /**
+ * piix_init_one - Register PIIX ATA PCI device with kernel services
+ * @pdev: PCI device to register
+@@ -1669,6 +1702,9 @@ static int __devinit piix_init_one(struct pci_dev *pdev,
+ }
+ host->flags |= ATA_HOST_PARALLEL_SCAN;
+
++ /* Allow hosts to specify device types to ignore when scanning. */
++ piix_ignore_devices_quirk(host);
++
+ pci_set_master(pdev);
+ return ata_pci_sff_activate_host(host, ata_bmdma_interrupt, sht);
+ }
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 23763a1..d31ee55 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -1973,6 +1973,12 @@ retry:
+ if (class == ATA_DEV_ATA) {
+ if (!ata_id_is_ata(id) && !ata_id_is_cfa(id))
+ goto err_out;
++ if (ap->host->flags & ATA_HOST_IGNORE_ATA &&
++ ata_id_is_ata(id)) {
++ ata_dev_dbg(dev,
++ "host indicates ignore ATA devices, ignored\n");
++ return -ENOENT;
++ }
+ } else {
+ if (ata_id_is_ata(id))
+ goto err_out;
+diff --git a/drivers/bcma/driver_chipcommon_pmu.c b/drivers/bcma/driver_chipcommon_pmu.c
+index a058842..61ce405 100644
+--- a/drivers/bcma/driver_chipcommon_pmu.c
++++ b/drivers/bcma/driver_chipcommon_pmu.c
+@@ -139,7 +139,9 @@ void bcma_pmu_workarounds(struct bcma_drv_cc *cc)
+ bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x7);
+ break;
+ case 0x4331:
+- /* BCM4331 workaround is SPROM-related, we put it in sprom.c */
++ case 43431:
++ /* Ext PA lines must be enabled for tx on BCM4331 */
++ bcma_chipco_bcm4331_ext_pa_lines_ctl(cc, true);
+ break;
+ case 43224:
+ if (bus->chipinfo.rev == 0) {
+diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c
+index 3e2a600..4588da2 100644
+--- a/drivers/bcma/sprom.c
++++ b/drivers/bcma/sprom.c
+@@ -432,13 +432,13 @@ int bcma_sprom_get(struct bcma_bus *bus)
+ if (!sprom)
+ return -ENOMEM;
+
+- if (bus->chipinfo.id == 0x4331)
++ if (bus->chipinfo.id == 0x4331 || bus->chipinfo.id == 43431)
+ bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false);
+
+ pr_debug("SPROM offset 0x%x\n", offset);
+ bcma_sprom_read(bus, offset, sprom);
+
+- if (bus->chipinfo.id == 0x4331)
++ if (bus->chipinfo.id == 0x4331 || bus->chipinfo.id == 43431)
+ bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true);
+
+ err = bcma_sprom_valid(sprom);
+diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
+index 962e75d..4293c48 100644
+--- a/drivers/char/agp/intel-agp.c
++++ b/drivers/char/agp/intel-agp.c
+@@ -898,6 +898,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
+ ID(PCI_DEVICE_ID_INTEL_B43_HB),
+ ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
+ ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
++ ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB),
+ ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
+ ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
+ ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
+diff --git a/drivers/char/agp/intel-agp.h b/drivers/char/agp/intel-agp.h
+index 7ea18a5..439d7e7 100644
+--- a/drivers/char/agp/intel-agp.h
++++ b/drivers/char/agp/intel-agp.h
+@@ -211,6 +211,7 @@
+ #define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30
+ #define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32
+ #define PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB 0x0040
++#define PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB 0x0069
+ #define PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG 0x0042
+ #define PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB 0x0044
+ #define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062
+diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c
+index f518b99..6289f0e 100644
+--- a/drivers/char/hw_random/atmel-rng.c
++++ b/drivers/char/hw_random/atmel-rng.c
+@@ -36,6 +36,13 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,
+ /* data ready? */
+ if (readl(trng->base + TRNG_ODATA) & 1) {
+ *data = readl(trng->base + TRNG_ODATA);
++ /*
++ ensure data ready is only set again AFTER the next data
++ word is ready in case it got set between checking ISR
++ and reading ODATA, so we don't risk re-reading the
++ same word
++ */
++ readl(trng->base + TRNG_ISR);
+ return 4;
+ } else
+ return 0;
+diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
+index c34adf9..09af2ff 100644
+--- a/drivers/gpu/drm/gma500/psb_drv.c
++++ b/drivers/gpu/drm/gma500/psb_drv.c
+@@ -349,7 +349,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
+ PSB_WSGX32(0x30000000, PSB_CR_BIF_3D_REQ_BASE);
+
+ /* igd_opregion_init(&dev_priv->opregion_dev); */
+- acpi_video_register();
++/* acpi_video_register(); */
+ if (dev_priv->lid_state)
+ psb_lid_timer_init(dev_priv);
+
+diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
+index 62892a8..302d3d5 100644
+--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
++++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
+@@ -309,6 +309,7 @@ static int init_ring_common(struct intel_ring_buffer *ring)
+ ring->head = I915_READ_HEAD(ring);
+ ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
+ ring->space = ring_space(ring);
++ ring->last_retired_head = -1;
+ }
+
+ return 0;
+@@ -1026,6 +1027,10 @@ int intel_init_ring_buffer(struct drm_device *dev,
+ if (ret)
+ goto err_unref;
+
++ ret = i915_gem_object_set_to_gtt_domain(obj, true);
++ if (ret)
++ goto err_unpin;
++
+ ring->map.size = ring->size;
+ ring->map.offset = dev->agp->base + obj->gtt_offset;
+ ring->map.type = 0;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c
+index fa86035..7b11edb 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
++++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
+@@ -654,7 +654,13 @@ nouveau_connector_detect_depth(struct drm_connector *connector)
+ if (nv_connector->edid && connector->display_info.bpc)
+ return;
+
+- /* if not, we're out of options unless we're LVDS, default to 8bpc */
++ /* EDID 1.4 is *supposed* to be supported on eDP, but, Apple... */
++ if (nv_connector->type == DCB_CONNECTOR_eDP) {
++ connector->display_info.bpc = 6;
++ return;
++ }
++
++ /* we're out of options unless we're LVDS, default to 8bpc */
+ if (nv_encoder->dcb->type != OUTPUT_LVDS) {
+ connector->display_info.bpc = 8;
+ return;
+diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c
+index 70089d3..ea69dae 100644
+--- a/drivers/gpu/drm/radeon/evergreen_cs.c
++++ b/drivers/gpu/drm/radeon/evergreen_cs.c
+@@ -52,6 +52,7 @@ struct evergreen_cs_track {
+ u32 cb_color_view[12];
+ u32 cb_color_pitch[12];
+ u32 cb_color_slice[12];
++ u32 cb_color_slice_idx[12];
+ u32 cb_color_attrib[12];
+ u32 cb_color_cmask_slice[8];/* unused */
+ u32 cb_color_fmask_slice[8];/* unused */
+@@ -127,12 +128,14 @@ static void evergreen_cs_track_init(struct evergreen_cs_track *track)
+ track->cb_color_info[i] = 0;
+ track->cb_color_view[i] = 0xFFFFFFFF;
+ track->cb_color_pitch[i] = 0;
+- track->cb_color_slice[i] = 0;
++ track->cb_color_slice[i] = 0xfffffff;
++ track->cb_color_slice_idx[i] = 0;
+ }
+ track->cb_target_mask = 0xFFFFFFFF;
+ track->cb_shader_mask = 0xFFFFFFFF;
+ track->cb_dirty = true;
+
++ track->db_depth_slice = 0xffffffff;
+ track->db_depth_view = 0xFFFFC000;
+ track->db_depth_size = 0xFFFFFFFF;
+ track->db_depth_control = 0xFFFFFFFF;
+@@ -250,10 +253,9 @@ static int evergreen_surface_check_2d(struct radeon_cs_parser *p,
+ {
+ struct evergreen_cs_track *track = p->track;
+ unsigned palign, halign, tileb, slice_pt;
++ unsigned mtile_pr, mtile_ps, mtileb;
+
+ tileb = 64 * surf->bpe * surf->nsamples;
+- palign = track->group_size / (8 * surf->bpe * surf->nsamples);
+- palign = MAX(8, palign);
+ slice_pt = 1;
+ if (tileb > surf->tsplit) {
+ slice_pt = tileb / surf->tsplit;
+@@ -262,7 +264,10 @@ static int evergreen_surface_check_2d(struct radeon_cs_parser *p,
+ /* macro tile width & height */
+ palign = (8 * surf->bankw * track->npipes) * surf->mtilea;
+ halign = (8 * surf->bankh * surf->nbanks) / surf->mtilea;
+- surf->layer_size = surf->nbx * surf->nby * surf->bpe * slice_pt;
++ mtileb = (palign / 8) * (halign / 8) * tileb;;
++ mtile_pr = surf->nbx / palign;
++ mtile_ps = (mtile_pr * surf->nby) / halign;
++ surf->layer_size = mtile_ps * mtileb * slice_pt;
+ surf->base_align = (palign / 8) * (halign / 8) * tileb;
+ surf->palign = palign;
+ surf->halign = halign;
+@@ -434,6 +439,39 @@ static int evergreen_cs_track_validate_cb(struct radeon_cs_parser *p, unsigned i
+
+ offset += surf.layer_size * mslice;
+ if (offset > radeon_bo_size(track->cb_color_bo[id])) {
++ /* old ddx are broken they allocate bo with w*h*bpp but
++ * program slice with ALIGN(h, 8), catch this and patch
++ * command stream.
++ */
++ if (!surf.mode) {
++ volatile u32 *ib = p->ib->ptr;
++ unsigned long tmp, nby, bsize, size, min = 0;
++
++ /* find the height the ddx wants */
++ if (surf.nby > 8) {
++ min = surf.nby - 8;
++ }
++ bsize = radeon_bo_size(track->cb_color_bo[id]);
++ tmp = track->cb_color_bo_offset[id] << 8;
++ for (nby = surf.nby; nby > min; nby--) {
++ size = nby * surf.nbx * surf.bpe * surf.nsamples;
++ if ((tmp + size * mslice) <= bsize) {
++ break;
++ }
++ }
++ if (nby > min) {
++ surf.nby = nby;
++ slice = ((nby * surf.nbx) / 64) - 1;
++ if (!evergreen_surface_check(p, &surf, "cb")) {
++ /* check if this one works */
++ tmp += surf.layer_size * mslice;
++ if (tmp <= bsize) {
++ ib[track->cb_color_slice_idx[id]] = slice;
++ goto old_ddx_ok;
++ }
++ }
++ }
++ }
+ dev_warn(p->dev, "%s:%d cb[%d] bo too small (layer size %d, "
+ "offset %d, max layer %d, bo size %ld, slice %d)\n",
+ __func__, __LINE__, id, surf.layer_size,
+@@ -446,6 +484,7 @@ static int evergreen_cs_track_validate_cb(struct radeon_cs_parser *p, unsigned i
+ surf.tsplit, surf.mtilea);
+ return -EINVAL;
+ }
++old_ddx_ok:
+
+ return 0;
+ }
+@@ -1532,6 +1571,7 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
+ case CB_COLOR7_SLICE:
+ tmp = (reg - CB_COLOR0_SLICE) / 0x3c;
+ track->cb_color_slice[tmp] = radeon_get_ib_value(p, idx);
++ track->cb_color_slice_idx[tmp] = idx;
+ track->cb_dirty = true;
+ break;
+ case CB_COLOR8_SLICE:
+@@ -1540,6 +1580,7 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
+ case CB_COLOR11_SLICE:
+ tmp = ((reg - CB_COLOR8_SLICE) / 0x1c) + 8;
+ track->cb_color_slice[tmp] = radeon_get_ib_value(p, idx);
++ track->cb_color_slice_idx[tmp] = idx;
+ track->cb_dirty = true;
+ break;
+ case CB_COLOR0_ATTRIB:
+diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
+index ef7bb3f..15250fb 100644
+--- a/drivers/gpu/drm/radeon/radeon_drv.c
++++ b/drivers/gpu/drm/radeon/radeon_drv.c
+@@ -57,9 +57,10 @@
+ * 2.13.0 - virtual memory support, streamout
+ * 2.14.0 - add evergreen tiling informations
+ * 2.15.0 - add max_pipes query
++ * 2.16.0 - fix evergreen 2D tiled surface calculation
+ */
+ #define KMS_DRIVER_MAJOR 2
+-#define KMS_DRIVER_MINOR 15
++#define KMS_DRIVER_MINOR 16
+ #define KMS_DRIVER_PATCHLEVEL 0
+ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
+ int radeon_driver_unload_kms(struct drm_device *dev);
+diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
+index 1843418..8b73ae8 100644
+--- a/drivers/gpu/drm/ttm/ttm_bo.c
++++ b/drivers/gpu/drm/ttm/ttm_bo.c
+@@ -1193,6 +1193,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
+ (*destroy)(bo);
+ else
+ kfree(bo);
++ ttm_mem_global_free(mem_glob, acc_size);
+ return -EINVAL;
+ }
+ bo->destroy = destroy;
+@@ -1294,22 +1295,14 @@ int ttm_bo_create(struct ttm_bo_device *bdev,
+ struct ttm_buffer_object **p_bo)
+ {
+ struct ttm_buffer_object *bo;
+- struct ttm_mem_global *mem_glob = bdev->glob->mem_glob;
+ size_t acc_size;
+ int ret;
+
+- acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct ttm_buffer_object));
+- ret = ttm_mem_global_alloc(mem_glob, acc_size, false, false);
+- if (unlikely(ret != 0))
+- return ret;
+-
+ bo = kzalloc(sizeof(*bo), GFP_KERNEL);
+-
+- if (unlikely(bo == NULL)) {
+- ttm_mem_global_free(mem_glob, acc_size);
++ if (unlikely(bo == NULL))
+ return -ENOMEM;
+- }
+
++ acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct ttm_buffer_object));
+ ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,
+ buffer_start, interruptible,
+ persistent_swap_storage, acc_size, NULL);
+diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
+index 536bda0..8dc84d6 100644
+--- a/drivers/net/can/c_can/c_can.c
++++ b/drivers/net/can/c_can/c_can.c
+@@ -686,7 +686,7 @@ static int c_can_get_berr_counter(const struct net_device *dev,
+ *
+ * We iterate from priv->tx_echo to priv->tx_next and check if the
+ * packet has been transmitted, echo it back to the CAN framework.
+- * If we discover a not yet transmitted package, stop looking for more.
++ * If we discover a not yet transmitted packet, stop looking for more.
+ */
+ static void c_can_do_tx(struct net_device *dev)
+ {
+@@ -698,7 +698,7 @@ static void c_can_do_tx(struct net_device *dev)
+ for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) {
+ msg_obj_no = get_tx_echo_msg_obj(priv);
+ val = c_can_read_reg32(priv, &priv->regs->txrqst1);
+- if (!(val & (1 << msg_obj_no))) {
++ if (!(val & (1 << (msg_obj_no - 1)))) {
+ can_get_echo_skb(dev,
+ msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
+ stats->tx_bytes += priv->read_reg(priv,
+@@ -706,6 +706,8 @@ static void c_can_do_tx(struct net_device *dev)
+ & IF_MCONT_DLC_MASK;
+ stats->tx_packets++;
+ c_can_inval_msg_object(dev, 0, msg_obj_no);
++ } else {
++ break;
+ }
+ }
+
+@@ -950,7 +952,7 @@ static int c_can_poll(struct napi_struct *napi, int quota)
+ struct net_device *dev = napi->dev;
+ struct c_can_priv *priv = netdev_priv(dev);
+
+- irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
++ irqstatus = priv->irqstatus;
+ if (!irqstatus)
+ goto end;
+
+@@ -1028,12 +1030,11 @@ end:
+
+ static irqreturn_t c_can_isr(int irq, void *dev_id)
+ {
+- u16 irqstatus;
+ struct net_device *dev = (struct net_device *)dev_id;
+ struct c_can_priv *priv = netdev_priv(dev);
+
+- irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
+- if (!irqstatus)
++ priv->irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
++ if (!priv->irqstatus)
+ return IRQ_NONE;
+
+ /* disable all interrupts and schedule the NAPI */
+@@ -1063,10 +1064,11 @@ static int c_can_open(struct net_device *dev)
+ goto exit_irq_fail;
+ }
+
++ napi_enable(&priv->napi);
++
+ /* start the c_can controller */
+ c_can_start(dev);
+
+- napi_enable(&priv->napi);
+ netif_start_queue(dev);
+
+ return 0;
+diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
+index 9b7fbef..5f32d34 100644
+--- a/drivers/net/can/c_can/c_can.h
++++ b/drivers/net/can/c_can/c_can.h
+@@ -76,6 +76,7 @@ struct c_can_priv {
+ unsigned int tx_next;
+ unsigned int tx_echo;
+ void *priv; /* for board-specific data */
++ u16 irqstatus;
+ };
+
+ struct net_device *alloc_c_can_dev(void);
+diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c
+index b59cf20..cc9776c 100644
+--- a/drivers/net/usb/sierra_net.c
++++ b/drivers/net/usb/sierra_net.c
+@@ -946,7 +946,7 @@ struct sk_buff *sierra_net_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
+ }
+
+ static const u8 sierra_net_ifnum_list[] = { 7, 10, 11 };
+-static const struct sierra_net_info_data sierra_net_info_data_68A3 = {
++static const struct sierra_net_info_data sierra_net_info_data_direct_ip = {
+ .rx_urb_size = 8 * 1024,
+ .whitelist = {
+ .infolen = ARRAY_SIZE(sierra_net_ifnum_list),
+@@ -954,7 +954,7 @@ static const struct sierra_net_info_data sierra_net_info_data_68A3 = {
+ }
+ };
+
+-static const struct driver_info sierra_net_info_68A3 = {
++static const struct driver_info sierra_net_info_direct_ip = {
+ .description = "Sierra Wireless USB-to-WWAN Modem",
+ .flags = FLAG_WWAN | FLAG_SEND_ZLP,
+ .bind = sierra_net_bind,
+@@ -962,12 +962,18 @@ static const struct driver_info sierra_net_info_68A3 = {
+ .status = sierra_net_status,
+ .rx_fixup = sierra_net_rx_fixup,
+ .tx_fixup = sierra_net_tx_fixup,
+- .data = (unsigned long)&sierra_net_info_data_68A3,
++ .data = (unsigned long)&sierra_net_info_data_direct_ip,
+ };
+
+ static const struct usb_device_id products[] = {
+ {USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless USB-to-WWAN modem */
+- .driver_info = (unsigned long) &sierra_net_info_68A3},
++ .driver_info = (unsigned long) &sierra_net_info_direct_ip},
++ {USB_DEVICE(0x0F3D, 0x68A3), /* AT&T Direct IP modem */
++ .driver_info = (unsigned long) &sierra_net_info_direct_ip},
++ {USB_DEVICE(0x1199, 0x68AA), /* Sierra Wireless Direct IP LTE modem */
++ .driver_info = (unsigned long) &sierra_net_info_direct_ip},
++ {USB_DEVICE(0x0F3D, 0x68AA), /* AT&T Direct IP LTE modem */
++ .driver_info = (unsigned long) &sierra_net_info_direct_ip},
+
+ {}, /* last item */
+ };
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
+index c417560..bef3f24 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
+@@ -1222,7 +1222,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
+ key_flags |= STA_KEY_MULTICAST_MSK;
+
+ sta_cmd.key.key_flags = key_flags;
+- sta_cmd.key.key_offset = WEP_INVALID_OFFSET;
++ sta_cmd.key.key_offset = keyconf->hw_key_idx;
+ sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
+ sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
+
+diff --git a/drivers/net/wireless/iwlwifi/iwl-mac80211.c b/drivers/net/wireless/iwlwifi/iwl-mac80211.c
+index c24a713..1018f9b 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-mac80211.c
++++ b/drivers/net/wireless/iwlwifi/iwl-mac80211.c
+@@ -196,6 +196,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
+ WIPHY_FLAG_DISABLE_BEACON_HINTS |
+ WIPHY_FLAG_IBSS_RSN;
+
++#ifdef CONFIG_PM_SLEEP
+ if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len &&
+ trans(priv)->ops->wowlan_suspend &&
+ device_can_wakeup(trans(priv)->dev)) {
+@@ -214,6 +215,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
+ hw->wiphy->wowlan.pattern_max_len =
+ IWLAGN_WOWLAN_MAX_PATTERN_LEN;
+ }
++#endif
+
+ if (iwlagn_mod_params.power_save)
+ hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
+@@ -243,6 +245,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
+ ret = ieee80211_register_hw(priv->hw);
+ if (ret) {
+ IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
++ iwl_leds_exit(priv);
+ return ret;
+ }
+ priv->mac80211_registered = 1;
+diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
+index 3b10692..dfd5466 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-prph.h
++++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
+@@ -224,6 +224,7 @@
+ #define SCD_TXFACT (SCD_BASE + 0x10)
+ #define SCD_ACTIVE (SCD_BASE + 0x14)
+ #define SCD_QUEUECHAIN_SEL (SCD_BASE + 0xe8)
++#define SCD_CHAINEXT_EN (SCD_BASE + 0x244)
+ #define SCD_AGGR_SEL (SCD_BASE + 0x248)
+ #define SCD_INTERRUPT_MASK (SCD_BASE + 0x108)
+
+diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
+index 4d7b30d..66df016 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
++++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
+@@ -1128,6 +1128,11 @@ static void iwl_tx_start(struct iwl_trans *trans)
+ iwl_write_prph(trans, SCD_DRAM_BASE_ADDR,
+ trans_pcie->scd_bc_tbls.dma >> 10);
+
++ /* The chain extension of the SCD doesn't work well. This feature is
++ * enabled by default by the HW, so we need to disable it manually.
++ */
++ iwl_write_prph(trans, SCD_CHAINEXT_EN, 0);
++
+ /* Enable DMA channel */
+ for (chan = 0; chan < FH_TCSR_CHNL_NUM ; chan++)
+ iwl_write_direct32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(chan),
+diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
+index 001735f..5601302 100644
+--- a/drivers/net/wireless/rt2x00/rt2800usb.c
++++ b/drivers/net/wireless/rt2x00/rt2800usb.c
+@@ -922,6 +922,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ { USB_DEVICE(0x1482, 0x3c09) },
+ /* AirTies */
+ { USB_DEVICE(0x1eda, 0x2012) },
++ { USB_DEVICE(0x1eda, 0x2210) },
+ { USB_DEVICE(0x1eda, 0x2310) },
+ /* Allwin */
+ { USB_DEVICE(0x8516, 0x2070) },
+@@ -991,6 +992,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ /* DVICO */
+ { USB_DEVICE(0x0fe9, 0xb307) },
+ /* Edimax */
++ { USB_DEVICE(0x7392, 0x4085) },
+ { USB_DEVICE(0x7392, 0x7711) },
+ { USB_DEVICE(0x7392, 0x7717) },
+ { USB_DEVICE(0x7392, 0x7718) },
+@@ -1066,6 +1068,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ /* Philips */
+ { USB_DEVICE(0x0471, 0x200f) },
+ /* Planex */
++ { USB_DEVICE(0x2019, 0x5201) },
+ { USB_DEVICE(0x2019, 0xab25) },
+ { USB_DEVICE(0x2019, 0xed06) },
+ /* Quanta */
+@@ -1134,6 +1137,10 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ #ifdef CONFIG_RT2800USB_RT33XX
+ /* Belkin */
+ { USB_DEVICE(0x050d, 0x945b) },
++ /* Panasonic */
++ { USB_DEVICE(0x083a, 0xb511) },
++ /* Philips */
++ { USB_DEVICE(0x0471, 0x20dd) },
+ /* Ralink */
+ { USB_DEVICE(0x148f, 0x3370) },
+ { USB_DEVICE(0x148f, 0x8070) },
+@@ -1145,6 +1152,8 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ { USB_DEVICE(0x8516, 0x3572) },
+ /* Askey */
+ { USB_DEVICE(0x1690, 0x0744) },
++ { USB_DEVICE(0x1690, 0x0761) },
++ { USB_DEVICE(0x1690, 0x0764) },
+ /* Cisco */
+ { USB_DEVICE(0x167b, 0x4001) },
+ /* EnGenius */
+@@ -1159,20 +1168,25 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ /* Sitecom */
+ { USB_DEVICE(0x0df6, 0x0041) },
+ { USB_DEVICE(0x0df6, 0x0062) },
++ { USB_DEVICE(0x0df6, 0x0065) },
++ { USB_DEVICE(0x0df6, 0x0066) },
++ { USB_DEVICE(0x0df6, 0x0068) },
+ /* Toshiba */
+ { USB_DEVICE(0x0930, 0x0a07) },
+ /* Zinwell */
+ { USB_DEVICE(0x5a57, 0x0284) },
+ #endif
+ #ifdef CONFIG_RT2800USB_RT53XX
+- /* Alpha */
+- { USB_DEVICE(0x2001, 0x3c15) },
+- { USB_DEVICE(0x2001, 0x3c19) },
+ /* Arcadyan */
+ { USB_DEVICE(0x043e, 0x7a12) },
+ /* Azurewave */
+ { USB_DEVICE(0x13d3, 0x3329) },
+ { USB_DEVICE(0x13d3, 0x3365) },
++ /* D-Link */
++ { USB_DEVICE(0x2001, 0x3c15) },
++ { USB_DEVICE(0x2001, 0x3c19) },
++ { USB_DEVICE(0x2001, 0x3c1c) },
++ { USB_DEVICE(0x2001, 0x3c1d) },
+ /* LG innotek */
+ { USB_DEVICE(0x043e, 0x7a22) },
+ /* Panasonic */
+@@ -1224,12 +1238,8 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ { USB_DEVICE(0x07d1, 0x3c0b) },
+ { USB_DEVICE(0x07d1, 0x3c17) },
+ { USB_DEVICE(0x2001, 0x3c17) },
+- /* Edimax */
+- { USB_DEVICE(0x7392, 0x4085) },
+ /* Encore */
+ { USB_DEVICE(0x203d, 0x14a1) },
+- /* Fujitsu Stylistic 550 */
+- { USB_DEVICE(0x1690, 0x0761) },
+ /* Gemtek */
+ { USB_DEVICE(0x15a9, 0x0010) },
+ /* Gigabyte */
+@@ -1250,7 +1260,6 @@ static struct usb_device_id rt2800usb_device_table[] = {
+ { USB_DEVICE(0x05a6, 0x0101) },
+ { USB_DEVICE(0x1d4d, 0x0010) },
+ /* Planex */
+- { USB_DEVICE(0x2019, 0x5201) },
+ { USB_DEVICE(0x2019, 0xab24) },
+ /* Qcom */
+ { USB_DEVICE(0x18e8, 0x6259) },
+diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
+index 471f87c..c264dfa 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/rt2x00/rt2x00.h
+@@ -396,8 +396,7 @@ struct rt2x00_intf {
+ * for hardware which doesn't support hardware
+ * sequence counting.
+ */
+- spinlock_t seqlock;
+- u16 seqno;
++ atomic_t seqno;
+ };
+
+ static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)
+diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c
+index 2df2eb6..a8885f0 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
+@@ -277,7 +277,6 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
+ else
+ rt2x00dev->intf_sta_count++;
+
+- spin_lock_init(&intf->seqlock);
+ mutex_init(&intf->beacon_skb_mutex);
+ intf->beacon = entry;
+
+diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
+index 9b1b2b7..50f92d5 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
++++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
+@@ -207,6 +207,7 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,
+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+ struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif);
++ u16 seqno;
+
+ if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))
+ return;
+@@ -227,15 +228,13 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,
+ * sequence counting per-frame, since those will override the
+ * sequence counter given by mac80211.
+ */
+- spin_lock(&intf->seqlock);
+-
+ if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags))
+- intf->seqno += 0x10;
+- hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
+- hdr->seq_ctrl |= cpu_to_le16(intf->seqno);
+-
+- spin_unlock(&intf->seqlock);
++ seqno = atomic_add_return(0x10, &intf->seqno);
++ else
++ seqno = atomic_read(&intf->seqno);
+
++ hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
++ hdr->seq_ctrl |= cpu_to_le16(seqno);
+ }
+
+ static void rt2x00queue_create_tx_descriptor_plcp(struct rt2x00_dev *rt2x00dev,
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index 61b16c6..0df0d1f 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -257,10 +257,13 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans,
+ ret = insert_inline_extent(trans, root, inode, start,
+ inline_len, compressed_size,
+ compress_type, compressed_pages);
+- if (ret) {
++ if (ret && ret != -ENOSPC) {
+ btrfs_abort_transaction(trans, root, ret);
+ return ret;
++ } else if (ret == -ENOSPC) {
++ return 1;
+ }
++
+ btrfs_delalloc_release_metadata(inode, end + 1 - start);
+ btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0);
+ return 0;
+diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
+index 4bbd07a..8da837b 100644
+--- a/fs/ext4/balloc.c
++++ b/fs/ext4/balloc.c
+@@ -90,8 +90,8 @@ unsigned ext4_num_overhead_clusters(struct super_block *sb,
+ * unusual file system layouts.
+ */
+ if (ext4_block_in_group(sb, ext4_block_bitmap(sb, gdp), block_group)) {
+- block_cluster = EXT4_B2C(sbi, (start -
+- ext4_block_bitmap(sb, gdp)));
++ block_cluster = EXT4_B2C(sbi,
++ ext4_block_bitmap(sb, gdp) - start);
+ if (block_cluster < num_clusters)
+ block_cluster = -1;
+ else if (block_cluster == num_clusters) {
+@@ -102,7 +102,7 @@ unsigned ext4_num_overhead_clusters(struct super_block *sb,
+
+ if (ext4_block_in_group(sb, ext4_inode_bitmap(sb, gdp), block_group)) {
+ inode_cluster = EXT4_B2C(sbi,
+- start - ext4_inode_bitmap(sb, gdp));
++ ext4_inode_bitmap(sb, gdp) - start);
+ if (inode_cluster < num_clusters)
+ inode_cluster = -1;
+ else if (inode_cluster == num_clusters) {
+@@ -114,7 +114,7 @@ unsigned ext4_num_overhead_clusters(struct super_block *sb,
+ itbl_blk = ext4_inode_table(sb, gdp);
+ for (i = 0; i < sbi->s_itb_per_group; i++) {
+ if (ext4_block_in_group(sb, itbl_blk + i, block_group)) {
+- c = EXT4_B2C(sbi, start - itbl_blk + i);
++ c = EXT4_B2C(sbi, itbl_blk + i - start);
+ if ((c < num_clusters) || (c == inode_cluster) ||
+ (c == block_cluster) || (c == itbl_cluster))
+ continue;
+diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
+index df5ac04..bc43832 100644
+--- a/fs/fuse/dir.c
++++ b/fs/fuse/dir.c
+@@ -863,6 +863,7 @@ int fuse_update_attributes(struct inode *inode, struct kstat *stat,
+ if (stat) {
+ generic_fillattr(inode, stat);
+ stat->mode = fi->orig_i_mode;
++ stat->ino = fi->orig_ino;
+ }
+ }
+
+diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
+index 572cefc..d181926 100644
+--- a/fs/fuse/fuse_i.h
++++ b/fs/fuse/fuse_i.h
+@@ -82,6 +82,9 @@ struct fuse_inode {
+ preserve the original mode */
+ umode_t orig_i_mode;
+
++ /** 64 bit inode number */
++ u64 orig_ino;
++
+ /** Version of last attribute change */
+ u64 attr_version;
+
+diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
+index 26783eb..a59cf5e 100644
+--- a/fs/fuse/inode.c
++++ b/fs/fuse/inode.c
+@@ -91,6 +91,7 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)
+ fi->nlookup = 0;
+ fi->attr_version = 0;
+ fi->writectr = 0;
++ fi->orig_ino = 0;
+ INIT_LIST_HEAD(&fi->write_files);
+ INIT_LIST_HEAD(&fi->queued_writes);
+ INIT_LIST_HEAD(&fi->writepages);
+@@ -139,6 +140,18 @@ static int fuse_remount_fs(struct super_block *sb, int *flags, char *data)
+ return 0;
+ }
+
++/*
++ * ino_t is 32-bits on 32-bit arch. We have to squash the 64-bit value down
++ * so that it will fit.
++ */
++static ino_t fuse_squash_ino(u64 ino64)
++{
++ ino_t ino = (ino_t) ino64;
++ if (sizeof(ino_t) < sizeof(u64))
++ ino ^= ino64 >> (sizeof(u64) - sizeof(ino_t)) * 8;
++ return ino;
++}
++
+ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
+ u64 attr_valid)
+ {
+@@ -148,7 +161,7 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
+ fi->attr_version = ++fc->attr_version;
+ fi->i_time = attr_valid;
+
+- inode->i_ino = attr->ino;
++ inode->i_ino = fuse_squash_ino(attr->ino);
+ inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
+ set_nlink(inode, attr->nlink);
+ inode->i_uid = attr->uid;
+@@ -174,6 +187,8 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
+ fi->orig_i_mode = inode->i_mode;
+ if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
+ inode->i_mode &= ~S_ISVTX;
++
++ fi->orig_ino = attr->ino;
+ }
+
+ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
+diff --git a/include/linux/libata.h b/include/linux/libata.h
+index e926df7..6e887c7 100644
+--- a/include/linux/libata.h
++++ b/include/linux/libata.h
+@@ -247,6 +247,7 @@ enum {
+ ATA_HOST_SIMPLEX = (1 << 0), /* Host is simplex, one DMA channel per host only */
+ ATA_HOST_STARTED = (1 << 1), /* Host started */
+ ATA_HOST_PARALLEL_SCAN = (1 << 2), /* Ports on this host can be scanned in parallel */
++ ATA_HOST_IGNORE_ATA = (1 << 3), /* Ignore ATA devices on this host. */
+
+ /* bits 24:31 of host->flags are reserved for LLD specific flags */
+
+diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
+index ea36486..944bc18 100644
+--- a/include/linux/moduleparam.h
++++ b/include/linux/moduleparam.h
+@@ -128,7 +128,7 @@ struct kparam_array
+ * The ops can have NULL set or get functions.
+ */
+ #define module_param_cb(name, ops, arg, perm) \
+- __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, 0)
++ __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1)
+
+ /**
+ * <level>_param_cb - general callback for a module/cmdline parameter
+@@ -192,7 +192,7 @@ struct kparam_array
+ { (void *)set, (void *)get }; \
+ __module_param_call(MODULE_PARAM_PREFIX, \
+ name, &__param_ops_##name, arg, \
+- (perm) + sizeof(__check_old_set_param(set))*0, 0)
++ (perm) + sizeof(__check_old_set_param(set))*0, -1)
+
+ /* We don't get oldget: it's often a new-style param_get_uint, etc. */
+ static inline int
+@@ -272,7 +272,7 @@ static inline void __kernel_param_unlock(void)
+ */
+ #define core_param(name, var, type, perm) \
+ param_check_##type(name, &(var)); \
+- __module_param_call("", name, &param_ops_##type, &var, perm, 0)
++ __module_param_call("", name, &param_ops_##type, &var, perm, -1)
+ #endif /* !MODULE */
+
+ /**
+@@ -290,7 +290,7 @@ static inline void __kernel_param_unlock(void)
+ = { len, string }; \
+ __module_param_call(MODULE_PARAM_PREFIX, name, \
+ &param_ops_string, \
+- .str = &__param_string_##name, perm, 0); \
++ .str = &__param_string_##name, perm, -1); \
+ __MODULE_PARM_TYPE(name, "string")
+
+ /**
+@@ -431,7 +431,7 @@ extern int param_set_bint(const char *val, const struct kernel_param *kp);
+ __module_param_call(MODULE_PARAM_PREFIX, name, \
+ &param_array_ops, \
+ .arr = &__param_arr_##name, \
+- perm, 0); \
++ perm, -1); \
+ __MODULE_PARM_TYPE(name, "array of " #type)
+
+ extern struct kernel_param_ops param_array_ops;
+diff --git a/init/main.c b/init/main.c
+index cb54cd3..b08c5f7 100644
+--- a/init/main.c
++++ b/init/main.c
+@@ -508,7 +508,7 @@ asmlinkage void __init start_kernel(void)
+ parse_early_param();
+ parse_args("Booting kernel", static_command_line, __start___param,
+ __stop___param - __start___param,
+- 0, 0, &unknown_bootoption);
++ -1, -1, &unknown_bootoption);
+
+ jump_label_init();
+
+diff --git a/kernel/sched/core.c b/kernel/sched/core.c
+index e5212ae..2000e06 100644
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -6230,11 +6230,8 @@ int sched_domain_level_max;
+
+ static int __init setup_relax_domain_level(char *str)
+ {
+- unsigned long val;
+-
+- val = simple_strtoul(str, NULL, 0);
+- if (val < sched_domain_level_max)
+- default_relax_domain_level = val;
++ if (kstrtoint(str, 0, &default_relax_domain_level))
++ pr_warn("Unable to set relax_domain_level\n");
+
+ return 1;
+ }
+@@ -6439,7 +6436,6 @@ struct sched_domain *build_sched_domain(struct sched_domain_topology_level *tl,
+ if (!sd)
+ return child;
+
+- set_domain_attribute(sd, attr);
+ cpumask_and(sched_domain_span(sd), cpu_map, tl->mask(cpu));
+ if (child) {
+ sd->level = child->level + 1;
+@@ -6447,6 +6443,7 @@ struct sched_domain *build_sched_domain(struct sched_domain_topology_level *tl,
+ child->parent = sd;
+ }
+ sd->child = child;
++ set_domain_attribute(sd, attr);
+
+ return sd;
+ }
+diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
+index d66b213..d42574df 100644
+--- a/kernel/time/timekeeping.c
++++ b/kernel/time/timekeeping.c
+@@ -964,6 +964,7 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int shift)
+ timekeeper.xtime.tv_sec++;
+ leap = second_overflow(timekeeper.xtime.tv_sec);
+ timekeeper.xtime.tv_sec += leap;
++ timekeeper.wall_to_monotonic.tv_sec -= leap;
+ }
+
+ /* Accumulate raw time */
+@@ -1079,6 +1080,7 @@ static void update_wall_time(void)
+ timekeeper.xtime.tv_sec++;
+ leap = second_overflow(timekeeper.xtime.tv_sec);
+ timekeeper.xtime.tv_sec += leap;
++ timekeeper.wall_to_monotonic.tv_sec -= leap;
+ }
+
+ timekeeping_update(false);
+diff --git a/lib/btree.c b/lib/btree.c
+index e5ec1e9..5cf9e74 100644
+--- a/lib/btree.c
++++ b/lib/btree.c
+@@ -319,8 +319,8 @@ void *btree_get_prev(struct btree_head *head, struct btree_geo *geo,
+
+ if (head->height == 0)
+ return NULL;
+-retry:
+ longcpy(key, __key, geo->keylen);
++retry:
+ dec_key(geo, key);
+
+ node = head->node;
+@@ -351,7 +351,7 @@ retry:
+ }
+ miss:
+ if (retry_key) {
+- __key = retry_key;
++ longcpy(key, retry_key, geo->keylen);
+ retry_key = NULL;
+ goto retry;
+ }
+diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
+index c20051b..48f937e 100644
+--- a/net/mac80211/iface.c
++++ b/net/mac80211/iface.c
+@@ -514,6 +514,18 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
+ ieee80211_configure_filter(local);
+ break;
+ default:
++ mutex_lock(&local->mtx);
++ if (local->hw_roc_dev == sdata->dev &&
++ local->hw_roc_channel) {
++ /* ignore return value since this is racy */
++ drv_cancel_remain_on_channel(local);
++ ieee80211_queue_work(&local->hw, &local->hw_roc_done);
++ }
++ mutex_unlock(&local->mtx);
++
++ flush_work(&local->hw_roc_start);
++ flush_work(&local->hw_roc_done);
++
+ flush_work(&sdata->work);
+ /*
+ * When we get here, the interface is marked down.
+diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
+index f054e94..935aa4b 100644
+--- a/net/mac80211/offchannel.c
++++ b/net/mac80211/offchannel.c
+@@ -234,6 +234,22 @@ static void ieee80211_hw_roc_done(struct work_struct *work)
+ return;
+ }
+
++ /* was never transmitted */
++ if (local->hw_roc_skb) {
++ u64 cookie;
++
++ cookie = local->hw_roc_cookie ^ 2;
++
++ cfg80211_mgmt_tx_status(local->hw_roc_dev, cookie,
++ local->hw_roc_skb->data,
++ local->hw_roc_skb->len, false,
++ GFP_KERNEL);
++
++ kfree_skb(local->hw_roc_skb);
++ local->hw_roc_skb = NULL;
++ local->hw_roc_skb_for_status = NULL;
++ }
++
+ if (!local->hw_roc_for_tx)
+ cfg80211_remain_on_channel_expired(local->hw_roc_dev,
+ local->hw_roc_cookie,
+diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
+index 38137cb..d93d39b 100644
+--- a/net/mac80211/sta_info.c
++++ b/net/mac80211/sta_info.c
+@@ -378,7 +378,7 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
+ /* make the station visible */
+ sta_info_hash_add(local, sta);
+
+- list_add(&sta->list, &local->sta_list);
++ list_add_rcu(&sta->list, &local->sta_list);
+
+ set_sta_flag(sta, WLAN_STA_INSERTED);
+
+@@ -688,7 +688,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta)
+ if (ret)
+ return ret;
+
+- list_del(&sta->list);
++ list_del_rcu(&sta->list);
+
+ mutex_lock(&local->key_mtx);
+ for (i = 0; i < NUM_DEFAULT_KEYS; i++)
+diff --git a/net/mac80211/util.c b/net/mac80211/util.c
+index 3862c96..eb9d7c0 100644
+--- a/net/mac80211/util.c
++++ b/net/mac80211/util.c
+@@ -1224,7 +1224,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
+ enum ieee80211_sta_state state;
+
+ for (state = IEEE80211_STA_NOTEXIST;
+- state < sta->sta_state - 1; state++)
++ state < sta->sta_state; state++)
+ WARN_ON(drv_sta_state(local, sta->sdata, sta,
+ state, state + 1));
+ }
+diff --git a/net/wireless/util.c b/net/wireless/util.c
+index 957f2562..b5b6890 100644
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -936,6 +936,7 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
+ enum nl80211_iftype iftype)
+ {
+ struct wireless_dev *wdev_iter;
++ u32 used_iftypes = BIT(iftype);
+ int num[NUM_NL80211_IFTYPES];
+ int total = 1;
+ int i, j;
+@@ -969,12 +970,14 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
+
+ num[wdev_iter->iftype]++;
+ total++;
++ used_iftypes |= BIT(wdev_iter->iftype);
+ }
+ mutex_unlock(&rdev->devlist_mtx);
+
+ for (i = 0; i < rdev->wiphy.n_iface_combinations; i++) {
+ const struct ieee80211_iface_combination *c;
+ struct ieee80211_iface_limit *limits;
++ u32 all_iftypes = 0;
+
+ c = &rdev->wiphy.iface_combinations[i];
+
+@@ -989,6 +992,7 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
+ if (rdev->wiphy.software_iftypes & BIT(iftype))
+ continue;
+ for (j = 0; j < c->n_limits; j++) {
++ all_iftypes |= limits[j].types;
+ if (!(limits[j].types & BIT(iftype)))
+ continue;
+ if (limits[j].max < num[iftype])
+@@ -996,7 +1000,20 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev,
+ limits[j].max -= num[iftype];
+ }
+ }
+- /* yay, it fits */
++
++ /*
++ * Finally check that all iftypes that we're currently
++ * using are actually part of this combination. If they
++ * aren't then we can't use this combination and have
++ * to continue to the next.
++ */
++ if ((all_iftypes & used_iftypes) != used_iftypes)
++ goto cont;
++
++ /*
++ * This combination covered all interface types and
++ * supported the requested numbers, so we're good.
++ */
+ kfree(limits);
+ return 0;
+ cont:
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 7810913..e56c2c8 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -6606,6 +6606,7 @@ enum {
+ ALC662_FIXUP_ASUS_MODE7,
+ ALC662_FIXUP_ASUS_MODE8,
+ ALC662_FIXUP_NO_JACK_DETECT,
++ ALC662_FIXUP_ZOTAC_Z68,
+ };
+
+ static const struct alc_fixup alc662_fixups[] = {
+@@ -6755,6 +6756,13 @@ static const struct alc_fixup alc662_fixups[] = {
+ .type = ALC_FIXUP_FUNC,
+ .v.func = alc_fixup_no_jack_detect,
+ },
++ [ALC662_FIXUP_ZOTAC_Z68] = {
++ .type = ALC_FIXUP_PINS,
++ .v.pins = (const struct alc_pincfg[]) {
++ { 0x1b, 0x02214020 }, /* Front HP */
++ { }
++ }
++ },
+ };
+
+ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
+@@ -6768,6 +6776,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
+ SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
+ SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
+ SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
++ SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
+ SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
+
+ #if 0
+diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
+index 2de12eb..f351b93 100644
+--- a/sound/soc/codecs/wm8994.c
++++ b/sound/soc/codecs/wm8994.c
+@@ -46,6 +46,39 @@
+ #define WM8994_NUM_DRC 3
+ #define WM8994_NUM_EQ 3
+
++static struct {
++ unsigned int reg;
++ unsigned int mask;
++} wm8994_vu_bits[] = {
++ { WM8994_LEFT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
++ { WM8994_RIGHT_LINE_INPUT_1_2_VOLUME, WM8994_IN1_VU },
++ { WM8994_LEFT_LINE_INPUT_3_4_VOLUME, WM8994_IN2_VU },
++ { WM8994_RIGHT_LINE_INPUT_3_4_VOLUME, WM8994_IN2_VU },
++ { WM8994_SPEAKER_VOLUME_LEFT, WM8994_SPKOUT_VU },
++ { WM8994_SPEAKER_VOLUME_RIGHT, WM8994_SPKOUT_VU },
++ { WM8994_LEFT_OUTPUT_VOLUME, WM8994_HPOUT1_VU },
++ { WM8994_RIGHT_OUTPUT_VOLUME, WM8994_HPOUT1_VU },
++ { WM8994_LEFT_OPGA_VOLUME, WM8994_MIXOUT_VU },
++ { WM8994_RIGHT_OPGA_VOLUME, WM8994_MIXOUT_VU },
++
++ { WM8994_AIF1_DAC1_LEFT_VOLUME, WM8994_AIF1DAC1_VU },
++ { WM8994_AIF1_DAC1_RIGHT_VOLUME, WM8994_AIF1DAC1_VU },
++ { WM8994_AIF1_DAC2_LEFT_VOLUME, WM8994_AIF1DAC2_VU },
++ { WM8994_AIF1_DAC2_RIGHT_VOLUME, WM8994_AIF1DAC2_VU },
++ { WM8994_AIF2_DAC_LEFT_VOLUME, WM8994_AIF2DAC_VU },
++ { WM8994_AIF2_DAC_RIGHT_VOLUME, WM8994_AIF2DAC_VU },
++ { WM8994_AIF1_ADC1_LEFT_VOLUME, WM8994_AIF1ADC1_VU },
++ { WM8994_AIF1_ADC1_RIGHT_VOLUME, WM8994_AIF1ADC1_VU },
++ { WM8994_AIF1_ADC2_LEFT_VOLUME, WM8994_AIF1ADC2_VU },
++ { WM8994_AIF1_ADC2_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
++ { WM8994_AIF2_ADC_LEFT_VOLUME, WM8994_AIF2ADC_VU },
++ { WM8994_AIF2_ADC_RIGHT_VOLUME, WM8994_AIF1ADC2_VU },
++ { WM8994_DAC1_LEFT_VOLUME, WM8994_DAC1_VU },
++ { WM8994_DAC1_RIGHT_VOLUME, WM8994_DAC1_VU },
++ { WM8994_DAC2_LEFT_VOLUME, WM8994_DAC2_VU },
++ { WM8994_DAC2_RIGHT_VOLUME, WM8994_DAC2_VU },
++};
++
+ static int wm8994_drc_base[] = {
+ WM8994_AIF1_DRC1_1,
+ WM8994_AIF1_DRC2_1,
+@@ -1006,6 +1039,7 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
+ struct snd_soc_codec *codec = w->codec;
+ struct wm8994 *control = codec->control_data;
+ int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA;
++ int i;
+ int dac;
+ int adc;
+ int val;
+@@ -1064,6 +1098,13 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,
+ WM8994_AIF1DAC2L_ENA);
+ break;
+
++ case SND_SOC_DAPM_POST_PMU:
++ for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
++ snd_soc_write(codec, wm8994_vu_bits[i].reg,
++ snd_soc_read(codec,
++ wm8994_vu_bits[i].reg));
++ break;
++
+ case SND_SOC_DAPM_PRE_PMD:
+ case SND_SOC_DAPM_POST_PMD:
+ snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5,
+@@ -1089,6 +1130,7 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *kcontrol, int event)
+ {
+ struct snd_soc_codec *codec = w->codec;
++ int i;
+ int dac;
+ int adc;
+ int val;
+@@ -1139,6 +1181,13 @@ static int aif2clk_ev(struct snd_soc_dapm_widget *w,
+ WM8994_AIF2DACR_ENA);
+ break;
+
++ case SND_SOC_DAPM_POST_PMU:
++ for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
++ snd_soc_write(codec, wm8994_vu_bits[i].reg,
++ snd_soc_read(codec,
++ wm8994_vu_bits[i].reg));
++ break;
++
+ case SND_SOC_DAPM_PRE_PMD:
+ case SND_SOC_DAPM_POST_PMD:
+ snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_5,
+@@ -1207,17 +1256,19 @@ static int late_enable_ev(struct snd_soc_dapm_widget *w,
+ switch (event) {
+ case SND_SOC_DAPM_PRE_PMU:
+ if (wm8994->aif1clk_enable) {
+- aif1clk_ev(w, kcontrol, event);
++ aif1clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMU);
+ snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1,
+ WM8994_AIF1CLK_ENA_MASK,
+ WM8994_AIF1CLK_ENA);
++ aif1clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMU);
+ wm8994->aif1clk_enable = 0;
+ }
+ if (wm8994->aif2clk_enable) {
+- aif2clk_ev(w, kcontrol, event);
++ aif2clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMU);
+ snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1,
+ WM8994_AIF2CLK_ENA_MASK,
+ WM8994_AIF2CLK_ENA);
++ aif2clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMU);
+ wm8994->aif2clk_enable = 0;
+ }
+ break;
+@@ -1238,15 +1289,17 @@ static int late_disable_ev(struct snd_soc_dapm_widget *w,
+ switch (event) {
+ case SND_SOC_DAPM_POST_PMD:
+ if (wm8994->aif1clk_disable) {
++ aif1clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMD);
+ snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1,
+ WM8994_AIF1CLK_ENA_MASK, 0);
+- aif1clk_ev(w, kcontrol, event);
++ aif1clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMD);
+ wm8994->aif1clk_disable = 0;
+ }
+ if (wm8994->aif2clk_disable) {
++ aif2clk_ev(w, kcontrol, SND_SOC_DAPM_PRE_PMD);
+ snd_soc_update_bits(codec, WM8994_AIF2_CLOCKING_1,
+ WM8994_AIF2CLK_ENA_MASK, 0);
+- aif2clk_ev(w, kcontrol, event);
++ aif2clk_ev(w, kcontrol, SND_SOC_DAPM_POST_PMD);
+ wm8994->aif2clk_disable = 0;
+ }
+ break;
+@@ -1583,9 +1636,11 @@ SND_SOC_DAPM_POST("Late Disable PGA", late_disable_ev)
+
+ static const struct snd_soc_dapm_widget wm8994_lateclk_widgets[] = {
+ SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, aif1clk_ev,
+- SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
++ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
++ SND_SOC_DAPM_PRE_PMD),
+ SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, aif2clk_ev,
+- SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
++ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
++ SND_SOC_DAPM_PRE_PMD),
+ SND_SOC_DAPM_PGA("Direct Voice", SND_SOC_NOPM, 0, 0, NULL, 0),
+ SND_SOC_DAPM_MIXER("SPKL", WM8994_POWER_MANAGEMENT_3, 8, 0,
+ left_speaker_mixer, ARRAY_SIZE(left_speaker_mixer)),
+@@ -3939,39 +3994,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
+
+ pm_runtime_put(codec->dev);
+
+- /* Latch volume updates (right only; we always do left then right). */
+- snd_soc_update_bits(codec, WM8994_AIF1_DAC1_LEFT_VOLUME,
+- WM8994_AIF1DAC1_VU, WM8994_AIF1DAC1_VU);
+- snd_soc_update_bits(codec, WM8994_AIF1_DAC1_RIGHT_VOLUME,
+- WM8994_AIF1DAC1_VU, WM8994_AIF1DAC1_VU);
+- snd_soc_update_bits(codec, WM8994_AIF1_DAC2_LEFT_VOLUME,
+- WM8994_AIF1DAC2_VU, WM8994_AIF1DAC2_VU);
+- snd_soc_update_bits(codec, WM8994_AIF1_DAC2_RIGHT_VOLUME,
+- WM8994_AIF1DAC2_VU, WM8994_AIF1DAC2_VU);
+- snd_soc_update_bits(codec, WM8994_AIF2_DAC_LEFT_VOLUME,
+- WM8994_AIF2DAC_VU, WM8994_AIF2DAC_VU);
+- snd_soc_update_bits(codec, WM8994_AIF2_DAC_RIGHT_VOLUME,
+- WM8994_AIF2DAC_VU, WM8994_AIF2DAC_VU);
+- snd_soc_update_bits(codec, WM8994_AIF1_ADC1_LEFT_VOLUME,
+- WM8994_AIF1ADC1_VU, WM8994_AIF1ADC1_VU);
+- snd_soc_update_bits(codec, WM8994_AIF1_ADC1_RIGHT_VOLUME,
+- WM8994_AIF1ADC1_VU, WM8994_AIF1ADC1_VU);
+- snd_soc_update_bits(codec, WM8994_AIF1_ADC2_LEFT_VOLUME,
+- WM8994_AIF1ADC2_VU, WM8994_AIF1ADC2_VU);
+- snd_soc_update_bits(codec, WM8994_AIF1_ADC2_RIGHT_VOLUME,
+- WM8994_AIF1ADC2_VU, WM8994_AIF1ADC2_VU);
+- snd_soc_update_bits(codec, WM8994_AIF2_ADC_LEFT_VOLUME,
+- WM8994_AIF2ADC_VU, WM8994_AIF1ADC2_VU);
+- snd_soc_update_bits(codec, WM8994_AIF2_ADC_RIGHT_VOLUME,
+- WM8994_AIF2ADC_VU, WM8994_AIF1ADC2_VU);
+- snd_soc_update_bits(codec, WM8994_DAC1_LEFT_VOLUME,
+- WM8994_DAC1_VU, WM8994_DAC1_VU);
+- snd_soc_update_bits(codec, WM8994_DAC1_RIGHT_VOLUME,
+- WM8994_DAC1_VU, WM8994_DAC1_VU);
+- snd_soc_update_bits(codec, WM8994_DAC2_LEFT_VOLUME,
+- WM8994_DAC2_VU, WM8994_DAC2_VU);
+- snd_soc_update_bits(codec, WM8994_DAC2_RIGHT_VOLUME,
+- WM8994_DAC2_VU, WM8994_DAC2_VU);
++ /* Latch volume update bits */
++ for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
++ snd_soc_update_bits(codec, wm8994_vu_bits[i].reg,
++ wm8994_vu_bits[i].mask,
++ wm8994_vu_bits[i].mask);
+
+ /* Set the low bit of the 3D stereo depth so TLV matches */
+ snd_soc_update_bits(codec, WM8994_AIF1_DAC1_FILTERS_2,
diff --git a/3.4.2/4420_grsecurity-2.9.1-3.4.2-201206160836.patch b/3.4.3/4420_grsecurity-2.9.1-3.4.3-201206171836.patch
index 7ce88db..57ad302 100644
--- a/3.4.2/4420_grsecurity-2.9.1-3.4.2-201206160836.patch
+++ b/3.4.3/4420_grsecurity-2.9.1-3.4.3-201206171836.patch
@@ -227,7 +227,7 @@ index c1601e5..08557ce 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index 901a955..dbc701b 100644
+index a0804c6..f487027 100644
--- a/Makefile
+++ b/Makefile
@@ -245,8 +245,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -4147,7 +4147,7 @@ index 8f880bc..c5bd2f3 100644
addi r3,r1,STACK_FRAME_OVERHEAD
lwz r4,_DAR(r1)
diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c
-index 0b6d796..d760ddb 100644
+index 2e3200c..72095ce 100644
--- a/arch/powerpc/kernel/module_32.c
+++ b/arch/powerpc/kernel/module_32.c
@@ -162,7 +162,7 @@ int module_frob_arch_sections(Elf32_Ehdr *hdr,
@@ -8070,7 +8070,7 @@ index 5b577d5..3c1fed4 100644
movq r1,r2; \
movq r3,r4; \
diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S
-index be6d9e3..21fbbca 100644
+index 3470624..201259d 100644
--- a/arch/x86/crypto/aesni-intel_asm.S
+++ b/arch/x86/crypto/aesni-intel_asm.S
@@ -31,6 +31,7 @@
@@ -8225,7 +8225,7 @@ index be6d9e3..21fbbca 100644
/*
* void aesni_cbc_dec(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src,
-@@ -2498,7 +2523,9 @@ ENTRY(aesni_cbc_dec)
+@@ -2500,7 +2525,9 @@ ENTRY(aesni_cbc_dec)
popl LEN
popl IVP
#endif
@@ -8235,7 +8235,7 @@ index be6d9e3..21fbbca 100644
#ifdef __x86_64__
.align 16
-@@ -2524,6 +2551,7 @@ _aesni_inc_init:
+@@ -2526,6 +2553,7 @@ _aesni_inc_init:
mov $1, TCTR_LOW
MOVQ_R64_XMM TCTR_LOW INC
MOVQ_R64_XMM CTR TCTR_LOW
@@ -8243,7 +8243,7 @@ index be6d9e3..21fbbca 100644
ret
/*
-@@ -2552,6 +2580,7 @@ _aesni_inc:
+@@ -2554,6 +2582,7 @@ _aesni_inc:
.Linc_low:
movaps CTR, IV
PSHUFB_XMM BSWAP_MASK IV
@@ -8251,7 +8251,7 @@ index be6d9e3..21fbbca 100644
ret
/*
-@@ -2612,5 +2641,7 @@ ENTRY(aesni_ctr_enc)
+@@ -2614,5 +2643,7 @@ ENTRY(aesni_ctr_enc)
.Lctr_enc_ret:
movups IV, (IVP)
.Lctr_enc_just_ret:
@@ -27650,10 +27650,10 @@ index 0734086..3ad3e4c 100644
/*
* Buggy BIOS check
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
-index 23763a1..6375e67 100644
+index d31ee55..8363a8b 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
-@@ -4736,7 +4736,7 @@ void ata_qc_free(struct ata_queued_cmd *qc)
+@@ -4742,7 +4742,7 @@ void ata_qc_free(struct ata_queued_cmd *qc)
struct ata_port *ap;
unsigned int tag;
@@ -27662,7 +27662,7 @@ index 23763a1..6375e67 100644
ap = qc->ap;
qc->flags = 0;
-@@ -4752,7 +4752,7 @@ void __ata_qc_complete(struct ata_queued_cmd *qc)
+@@ -4758,7 +4758,7 @@ void __ata_qc_complete(struct ata_queued_cmd *qc)
struct ata_port *ap;
struct ata_link *link;
@@ -27671,7 +27671,7 @@ index 23763a1..6375e67 100644
WARN_ON_ONCE(!(qc->flags & ATA_QCFLAG_ACTIVE));
ap = qc->ap;
link = qc->dev->link;
-@@ -5816,6 +5816,7 @@ static void ata_finalize_port_ops(struct ata_port_operations *ops)
+@@ -5822,6 +5822,7 @@ static void ata_finalize_port_ops(struct ata_port_operations *ops)
return;
spin_lock(&lock);
@@ -27679,7 +27679,7 @@ index 23763a1..6375e67 100644
for (cur = ops->inherits; cur; cur = cur->inherits) {
void **inherit = (void **)cur;
-@@ -5829,8 +5830,9 @@ static void ata_finalize_port_ops(struct ata_port_operations *ops)
+@@ -5835,8 +5836,9 @@ static void ata_finalize_port_ops(struct ata_port_operations *ops)
if (IS_ERR(*pp))
*pp = NULL;
@@ -42519,10 +42519,10 @@ index 4106264..8157ede 100644
WARN_ON(trans->transid != btrfs_header_generation(parent));
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
-index 61b16c6..b492c09 100644
+index 0df0d1f..4bdcbfe 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
-@@ -7071,7 +7071,7 @@ fail:
+@@ -7074,7 +7074,7 @@ fail:
return -ENOMEM;
}
@@ -42531,7 +42531,7 @@ index 61b16c6..b492c09 100644
struct dentry *dentry, struct kstat *stat)
{
struct inode *inode = dentry->d_inode;
-@@ -7085,6 +7085,14 @@ static int btrfs_getattr(struct vfsmount *mnt,
+@@ -7088,6 +7088,14 @@ static int btrfs_getattr(struct vfsmount *mnt,
return 0;
}
@@ -44186,7 +44186,7 @@ index baac1b1..1499b62 100644
}
return 1;
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
-index 4bbd07a..a37bee6 100644
+index 8da837b..ed3835b 100644
--- a/fs/ext4/balloc.c
+++ b/fs/ext4/balloc.c
@@ -463,8 +463,8 @@ static int ext4_has_free_clusters(struct ext4_sb_info *sbi,
@@ -45963,10 +45963,10 @@ index 7df2b5e..5804aa7 100644
if (!ret)
ret = -EPIPE;
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
-index df5ac04..08cee2a 100644
+index bc43832..0cfe5a6 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
-@@ -1180,7 +1180,7 @@ static char *read_link(struct dentry *dentry)
+@@ -1181,7 +1181,7 @@ static char *read_link(struct dentry *dentry)
return link;
}
@@ -61522,10 +61522,10 @@ index 72cbf08..dd0201d 100644
int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu);
diff --git a/include/linux/libata.h b/include/linux/libata.h
-index e926df7..1713bd8 100644
+index 6e887c7..4539601 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
-@@ -909,7 +909,7 @@ struct ata_port_operations {
+@@ -910,7 +910,7 @@ struct ata_port_operations {
* fields must be pointers.
*/
const struct ata_port_operations *inherits;
@@ -61997,7 +61997,7 @@ index b2be02e..72d2f78 100644
or 0. */
int apply_relocate(Elf_Shdr *sechdrs,
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
-index ea36486..91e70f4 100644
+index 944bc18..042d291 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -286,7 +286,7 @@ static inline void __kernel_param_unlock(void)
@@ -64257,7 +64257,7 @@ index 8216c30..25e8e32 100644
next_state = Reset;
return 0;
diff --git a/init/main.c b/init/main.c
-index cb54cd3..8773e3c 100644
+index b08c5f7..09f865e 100644
--- a/init/main.c
+++ b/init/main.c
@@ -95,6 +95,8 @@ static inline void mark_rodata_ro(void) { }
@@ -67912,7 +67912,7 @@ index 0984a21..939f183 100644
#ifdef CONFIG_RT_GROUP_SCHED
/*
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
-index e5212ae..2fcf98d 100644
+index 2000e06..79cf3d8 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3907,6 +3907,8 @@ int can_nice(const struct task_struct *p, const int nice)
@@ -68671,7 +68671,7 @@ index f113755..ec24223 100644
cpumask_clear_cpu(cpu, tick_get_broadcast_mask());
tick_broadcast_clear_oneshot(cpu);
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
-index d66b213..6947686 100644
+index d42574df..247414c 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -14,6 +14,7 @@
@@ -75525,7 +75525,7 @@ index db8fae5..ff070cd 100644
/* number of interfaces with corresponding FIF_ flags */
int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll,
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
-index c20051b..2accbc4 100644
+index 48f937e..4ccd7b8 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -222,7 +222,7 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up)
@@ -75573,7 +75573,7 @@ index c20051b..2accbc4 100644
switch (sdata->vif.type) {
case NL80211_IFTYPE_AP_VLAN:
-@@ -550,7 +550,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
+@@ -562,7 +562,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
ieee80211_recalc_ps(local, -1);
@@ -75653,7 +75653,7 @@ index c97a065..ff61928 100644
return p;
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
-index 3862c96..3258ddc 100644
+index eb9d7c0..d34b832 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -1179,7 +1179,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
@@ -97776,10 +97776,10 @@ index 0000000..c2eca90
+};
diff --git a/tools/gcc/size_overflow_plugin.c b/tools/gcc/size_overflow_plugin.c
new file mode 100644
-index 0000000..64846cb
+index 0000000..273e66a
--- /dev/null
+++ b/tools/gcc/size_overflow_plugin.c
-@@ -0,0 +1,1224 @@
+@@ -0,0 +1,1203 @@
+/*
+ * Copyright 2011, 2012 by Emese Revfy <re.emese@gmail.com>
+ * Licensed under the GPL v2, or (at your option) v3
@@ -97792,7 +97792,7 @@ index 0000000..64846cb
+ * The recomputed argument is checked against TYPE_MAX and an event is logged on overflow and the triggering process is killed.
+ *
+ * Usage:
-+ * $ gcc -I`gcc -print-file-name=plugin`/include -fPIC -shared -O2 -o size_overflow_plugin.so size_overflow_plugin.c
++ * $ gcc -I`gcc -print-file-name=plugin`/include/c-family -I`gcc -print-file-name=plugin`/include -fPIC -shared -O2 -ggdb -Wall -W -Wno-missing-field-initializers -o size_overflow_plugin.so size_overflow_plugin.c
+ * $ gcc -fplugin=size_overflow_plugin.so test.c -O2
+ */
+
@@ -97846,8 +97846,8 @@ index 0000000..64846cb
+static unsigned int handle_function(void);
+
+static struct plugin_info size_overflow_plugin_info = {
-+ .version = "20120612beta",
-+ .help = "no-size_overflow\tturn off size overflow checking\n",
++ .version = "20120617beta",
++ .help = "no-size-overflow\tturn off size overflow checking\n",
+};
+
+static tree handle_size_overflow_attribute(tree *node, tree __unused name, tree args, int __unused flags, bool *no_add_attrs)
@@ -97871,7 +97871,7 @@ index 0000000..64846cb
+ .decl_required = false,
+ .type_required = true,
+ .function_type_required = true,
-+ .handler = handle_size_overflow_attribute,
++ .handler = handle_size_overflow_attribute
+#if BUILDING_GCC_VERSION >= 4007
+ .affects_type_identity = false
+#endif
@@ -98135,11 +98135,17 @@ index 0000000..64846cb
+
+static tree cast_a_tree(tree type, tree var)
+{
++ gcc_assert(type != NULL_TREE && var != NULL_TREE);
+ gcc_assert(fold_convertible_p(type, var));
+
+ return fold_convert(type, var);
+}
+
++static tree signed_cast(tree var)
++{
++ return cast_a_tree(signed_size_overflow_type, var);
++}
++
+static gimple build_cast_stmt(tree type, tree var, tree new_var, location_t loc)
+{
+ gimple assign;
@@ -98238,7 +98244,7 @@ index 0000000..64846cb
+
+ if (rhs1 != NULL_TREE) {
+ if (!gimple_assign_cast_p(oldstmt))
-+ rhs1 = cast_a_tree(signed_size_overflow_type, rhs1);
++ rhs1 = signed_cast(rhs1);
+ gimple_assign_set_rhs1(stmt, rhs1);
+ }
+
@@ -98276,13 +98282,6 @@ index 0000000..64846cb
+ return phi;
+}
+
-+static tree signed_cast_constant(tree node)
-+{
-+ gcc_assert(is_gimple_constant(node));
-+
-+ return cast_a_tree(signed_size_overflow_type, node);
-+}
-+
+static basic_block create_a_first_bb(void)
+{
+ basic_block first_bb;
@@ -98378,7 +98377,7 @@ index 0000000..64846cb
+
+ arg = gimple_phi_arg_def(oldstmt, i);
+ if (is_gimple_constant(arg))
-+ arg = signed_cast_constant(arg);
++ arg = signed_cast(arg);
+ lhs = build_new_phi_arg(visited, potentionally_overflowed, arg, new_var);
+ if (lhs == NULL_TREE)
+ lhs = gimple_get_lhs(cast_old_phi_arg(oldstmt, arg, new_var, i));
@@ -98411,7 +98410,7 @@ index 0000000..64846cb
+ tree rhs1 = gimple_assign_rhs1(def_stmt);
+
+ if (is_gimple_constant(rhs1))
-+ return dup_assign(visited, potentionally_overflowed, def_stmt, signed_cast_constant(rhs1), NULL_TREE, NULL_TREE);
++ return dup_assign(visited, potentionally_overflowed, def_stmt, signed_cast(rhs1), NULL_TREE, NULL_TREE);
+
+ gcc_assert(TREE_CODE(rhs1) != COND_EXPR);
+ switch (TREE_CODE(rhs1)) {
@@ -98540,19 +98539,6 @@ index 0000000..64846cb
+// print_the_code_insertions(stmt);
+}
+
-+static tree get_type_for_check(tree rhs)
-+{
-+ tree def_rhs;
-+ gimple def_stmt = get_def_stmt(rhs);
-+
-+ if (!gimple_assign_cast_p(def_stmt))
-+ return TREE_TYPE(rhs);
-+ def_rhs = gimple_assign_rhs1(def_stmt);
-+ if (TREE_CODE(TREE_TYPE(def_rhs)) == INTEGER_TYPE)
-+ return TREE_TYPE(def_rhs);
-+ return TREE_TYPE(rhs);
-+}
-+
+static gimple cast_to_unsigned_size_overflow_type(gimple stmt, tree cast_rhs)
+{
+ gimple ucast_stmt;
@@ -98567,61 +98553,54 @@ index 0000000..64846cb
+
+static void check_size_overflow(gimple stmt, tree cast_rhs, tree rhs, bool *potentionally_overflowed)
+{
-+ tree type_max, type_min, rhs_type;
++ tree type_max, type_min, rhs_type = TREE_TYPE(rhs);
+ gimple ucast_stmt;
+
+ if (!*potentionally_overflowed)
+ return;
+
-+ rhs_type = get_type_for_check(rhs);
-+
+ if (TYPE_UNSIGNED(rhs_type)) {
+ ucast_stmt = cast_to_unsigned_size_overflow_type(stmt, cast_rhs);
+ type_max = cast_a_tree(unsigned_size_overflow_type, TYPE_MAX_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, GT_EXPR, gimple_get_lhs(ucast_stmt), type_max);
+ } else {
-+ type_max = cast_a_tree(signed_size_overflow_type, TYPE_MAX_VALUE(rhs_type));
++ type_max = signed_cast(TYPE_MAX_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, GT_EXPR, cast_rhs, type_max);
+
-+ type_min = cast_a_tree(signed_size_overflow_type, TYPE_MIN_VALUE(rhs_type));
++ type_min = signed_cast(TYPE_MIN_VALUE(rhs_type));
+ insert_check_size_overflow(stmt, LT_EXPR, cast_rhs, type_min);
+ }
+}
+
-+static tree change_assign_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple stmt, tree orig_rhs)
++static tree change_assign_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple stmt, tree orig_rhs, tree new_rhs)
+{
+ gimple assign;
+ gimple_stmt_iterator gsi = gsi_for_stmt(stmt);
-+ tree new_rhs, origtype = TREE_TYPE(orig_rhs);
++ tree origtype = TREE_TYPE(orig_rhs);
+
+ gcc_assert(gimple_code(stmt) == GIMPLE_ASSIGN);
+
-+ new_rhs = expand(visited, potentionally_overflowed, orig_rhs);
-+ if (new_rhs == NULL_TREE)
-+ return NULL_TREE;
-+
+ assign = build_cast_stmt(origtype, new_rhs, CREATE_NEW_VAR, gimple_location(stmt));
+ gsi_insert_before(&gsi, assign, GSI_SAME_STMT);
+ update_stmt(assign);
+ return gimple_get_lhs(assign);
+}
+
-+static tree handle_const_assign(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple def_stmt, tree var, tree rhs, tree new_rhs1, tree new_rhs2, void (*gimple_assign_set_rhs)(gimple, tree))
++static tree handle_const_assign(struct pointer_set_t *visited, bool *potentionally_overflowed, gimple def_stmt, tree var, tree orig_rhs, tree var_rhs, tree new_rhs1, tree new_rhs2, void (*gimple_assign_set_rhs)(gimple, tree))
+{
-+ tree new_rhs, cast_rhs;
++ tree new_rhs;
+
+ if (gimple_assign_rhs_code(def_stmt) == MIN_EXPR)
+ return dup_assign(visited, potentionally_overflowed, def_stmt, new_rhs1, new_rhs2, NULL_TREE);
+
-+ new_rhs = change_assign_rhs(visited, potentionally_overflowed, def_stmt, rhs);
-+ if (new_rhs != NULL_TREE) {
-+ gimple_assign_set_rhs(def_stmt, new_rhs);
-+ update_stmt(def_stmt);
++ if (var_rhs == NULL_TREE)
++ return create_assign(visited, potentionally_overflowed, def_stmt, var, AFTER_STMT);
+
-+ cast_rhs = gimple_assign_rhs1(get_def_stmt(new_rhs));
++ new_rhs = change_assign_rhs(visited, potentionally_overflowed, def_stmt, orig_rhs, var_rhs);
++ gimple_assign_set_rhs(def_stmt, new_rhs);
++ update_stmt(def_stmt);
+
-+ check_size_overflow(def_stmt, cast_rhs, rhs, potentionally_overflowed);
-+ }
++ check_size_overflow(def_stmt, var_rhs, orig_rhs, potentionally_overflowed);
+ return create_assign(visited, potentionally_overflowed, def_stmt, var, AFTER_STMT);
+}
+
@@ -98662,10 +98641,10 @@ index 0000000..64846cb
+ new_rhs2 = expand(visited, potentionally_overflowed, rhs2);
+
+ if (is_gimple_constant(rhs2))
-+ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs1, new_rhs1, signed_cast_constant(rhs2), &gimple_assign_set_rhs1);
++ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs1, new_rhs1, new_rhs1, signed_cast(rhs2), &gimple_assign_set_rhs1);
+
+ if (is_gimple_constant(rhs1))
-+ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs2, signed_cast_constant(rhs1), new_rhs2, &gimple_assign_set_rhs2);
++ return handle_const_assign(visited, potentionally_overflowed, def_stmt, var, rhs2, new_rhs2, signed_cast(rhs1), new_rhs2, &gimple_assign_set_rhs2);
+
+ return dup_assign(visited, potentionally_overflowed, def_stmt, new_rhs1, new_rhs2, NULL_TREE);
+}
@@ -98674,7 +98653,7 @@ index 0000000..64846cb
+static tree get_new_rhs(struct pointer_set_t *visited, bool *potentionally_overflowed, tree rhs)
+{
+ if (is_gimple_constant(rhs))
-+ return signed_cast_constant(rhs);
++ return signed_cast(rhs);
+ if (TREE_CODE(rhs) != SSA_NAME)
+ return NULL_TREE;
+ return expand(visited, potentionally_overflowed, rhs);
diff --git a/3.4.2/4430_grsec-remove-localversion-grsec.patch b/3.4.3/4430_grsec-remove-localversion-grsec.patch
index 31cf878..31cf878 100644
--- a/3.4.2/4430_grsec-remove-localversion-grsec.patch
+++ b/3.4.3/4430_grsec-remove-localversion-grsec.patch
diff --git a/3.4.2/4435_grsec-mute-warnings.patch b/3.4.3/4435_grsec-mute-warnings.patch
index e85abd6..e85abd6 100644
--- a/3.4.2/4435_grsec-mute-warnings.patch
+++ b/3.4.3/4435_grsec-mute-warnings.patch
diff --git a/3.4.2/4440_grsec-remove-protected-paths.patch b/3.4.3/4440_grsec-remove-protected-paths.patch
index 637934a..637934a 100644
--- a/3.4.2/4440_grsec-remove-protected-paths.patch
+++ b/3.4.3/4440_grsec-remove-protected-paths.patch
diff --git a/3.4.2/4445_grsec-pax-without-grsec.patch b/3.4.3/4445_grsec-pax-without-grsec.patch
index 35255c2..35255c2 100644
--- a/3.4.2/4445_grsec-pax-without-grsec.patch
+++ b/3.4.3/4445_grsec-pax-without-grsec.patch
diff --git a/3.4.2/4450_grsec-kconfig-default-gids.patch b/3.4.3/4450_grsec-kconfig-default-gids.patch
index 123f877..123f877 100644
--- a/3.4.2/4450_grsec-kconfig-default-gids.patch
+++ b/3.4.3/4450_grsec-kconfig-default-gids.patch
diff --git a/3.4.2/4455_grsec-kconfig-gentoo.patch b/3.4.3/4455_grsec-kconfig-gentoo.patch
index b9dc3e5..b9dc3e5 100644
--- a/3.4.2/4455_grsec-kconfig-gentoo.patch
+++ b/3.4.3/4455_grsec-kconfig-gentoo.patch
diff --git a/3.4.2/4460-grsec-kconfig-proc-user.patch b/3.4.3/4460-grsec-kconfig-proc-user.patch
index b2b3188..b2b3188 100644
--- a/3.4.2/4460-grsec-kconfig-proc-user.patch
+++ b/3.4.3/4460-grsec-kconfig-proc-user.patch
diff --git a/3.4.2/4465_selinux-avc_audit-log-curr_ip.patch b/3.4.3/4465_selinux-avc_audit-log-curr_ip.patch
index 5a9d80c..5a9d80c 100644
--- a/3.4.2/4465_selinux-avc_audit-log-curr_ip.patch
+++ b/3.4.3/4465_selinux-avc_audit-log-curr_ip.patch
diff --git a/3.4.2/4470_disable-compat_vdso.patch b/3.4.3/4470_disable-compat_vdso.patch
index c40f44f..c40f44f 100644
--- a/3.4.2/4470_disable-compat_vdso.patch
+++ b/3.4.3/4470_disable-compat_vdso.patch