summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2012-04-15 21:27:48 -0400
committerAnthony G. Basile <blueness@gentoo.org>2012-04-15 21:27:48 -0400
commitf00b97377fe058dfc52e661fd9681339aed4abac (patch)
tree9533751d461b6ec31699777204e509ca0c71931a
parentGrsec/PaX: 2.9-{2.6.32.59,3.2.14,3.3.1}-201204081846 (diff)
downloadhardened-patchset-20120413.tar.gz
hardened-patchset-20120413.tar.bz2
hardened-patchset-20120413.zip
Grsec/PaX: 2.9-{2.6.32.59,3.2.15,3.3.2}-20120413171520120413
-rw-r--r--2.6.32/0000_README2
-rw-r--r--2.6.32/4420_grsecurity-2.9-2.6.32.59-201204131714.patch (renamed from 2.6.32/4420_grsecurity-2.9-2.6.32.59-201204091727.patch)86
-rw-r--r--3.2.15/0000_README (renamed from 3.2.14/0000_README)6
-rw-r--r--3.2.15/1014_linux-3.2.15.patch2169
-rw-r--r--3.2.15/4420_grsecurity-2.9-3.2.15-201204131715.patch (renamed from 3.2.14/4420_grsecurity-2.9-3.2.14-201204091728.patch)145
-rw-r--r--3.2.15/4430_grsec-remove-localversion-grsec.patch (renamed from 3.2.14/4430_grsec-remove-localversion-grsec.patch)0
-rw-r--r--3.2.15/4435_grsec-mute-warnings.patch (renamed from 3.2.14/4435_grsec-mute-warnings.patch)0
-rw-r--r--3.2.15/4440_grsec-remove-protected-paths.patch (renamed from 3.2.14/4440_grsec-remove-protected-paths.patch)0
-rw-r--r--3.2.15/4445_grsec-pax-without-grsec.patch (renamed from 3.2.14/4445_grsec-pax-without-grsec.patch)0
-rw-r--r--3.2.15/4450_grsec-kconfig-default-gids.patch (renamed from 3.2.14/4450_grsec-kconfig-default-gids.patch)0
-rw-r--r--3.2.15/4455_grsec-kconfig-gentoo.patch (renamed from 3.2.14/4455_grsec-kconfig-gentoo.patch)0
-rw-r--r--3.2.15/4460-grsec-kconfig-proc-user.patch (renamed from 3.2.14/4460-grsec-kconfig-proc-user.patch)0
-rw-r--r--3.2.15/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.2.14/4465_selinux-avc_audit-log-curr_ip.patch)0
-rw-r--r--3.2.15/4470_disable-compat_vdso.patch (renamed from 3.2.14/4470_disable-compat_vdso.patch)0
-rw-r--r--3.3.2/0000_README (renamed from 3.3.1/0000_README)2
-rw-r--r--3.3.2/4420_grsecurity-2.9-3.3.2-201204131715.patch (renamed from 3.3.1/4420_grsecurity-2.9-3.3.1-201204091729.patch)137
-rw-r--r--3.3.2/4430_grsec-remove-localversion-grsec.patch (renamed from 3.3.1/4430_grsec-remove-localversion-grsec.patch)0
-rw-r--r--3.3.2/4435_grsec-mute-warnings.patch (renamed from 3.3.1/4435_grsec-mute-warnings.patch)0
-rw-r--r--3.3.2/4440_grsec-remove-protected-paths.patch (renamed from 3.3.1/4440_grsec-remove-protected-paths.patch)0
-rw-r--r--3.3.2/4445_grsec-pax-without-grsec.patch (renamed from 3.3.1/4445_grsec-pax-without-grsec.patch)0
-rw-r--r--3.3.2/4450_grsec-kconfig-default-gids.patch (renamed from 3.3.1/4450_grsec-kconfig-default-gids.patch)0
-rw-r--r--3.3.2/4455_grsec-kconfig-gentoo.patch (renamed from 3.3.1/4455_grsec-kconfig-gentoo.patch)0
-rw-r--r--3.3.2/4460-grsec-kconfig-proc-user.patch (renamed from 3.3.1/4460-grsec-kconfig-proc-user.patch)0
-rw-r--r--3.3.2/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.3.1/4465_selinux-avc_audit-log-curr_ip.patch)0
-rw-r--r--3.3.2/4470_disable-compat_vdso.patch (renamed from 3.3.1/4470_disable-compat_vdso.patch)0
25 files changed, 2369 insertions, 178 deletions
diff --git a/2.6.32/0000_README b/2.6.32/0000_README
index 0ae8b42..044094c 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-2.6.32.59-201204091727.patch
+Patch: 4420_grsecurity-2.9-2.6.32.59-201204131714.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/2.6.32/4420_grsecurity-2.9-2.6.32.59-201204091727.patch b/2.6.32/4420_grsecurity-2.9-2.6.32.59-201204131714.patch
index e32341f..3c1b659 100644
--- a/2.6.32/4420_grsecurity-2.9-2.6.32.59-201204091727.patch
+++ b/2.6.32/4420_grsecurity-2.9-2.6.32.59-201204131714.patch
@@ -11425,7 +11425,7 @@ index 4fe681d..bb6d40c 100644
#define flush_insn_slot(p) do { } while (0)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
-index 08bc2ff..acafd8f 100644
+index 08bc2ff..bb80e65 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -534,9 +534,9 @@ struct kvm_x86_ops {
@@ -11452,15 +11452,6 @@ index 08bc2ff..acafd8f 100644
u8 kvm_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn);
extern bool tdp_enabled;
-@@ -619,7 +619,7 @@ void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw);
- void kvm_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l);
-
- int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata);
--int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data);
-+int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) __size_overflow(3);
-
- void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr);
- void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code);
@@ -643,7 +643,7 @@ unsigned long segment_base(u16 selector);
void kvm_mmu_flush_tlb(struct kvm_vcpu *vcpu);
void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
@@ -22655,7 +22646,7 @@ index 7c6e63e..1b7dac1 100644
.disabled_by_bios = is_disabled,
.hardware_setup = svm_hardware_setup,
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
-index e6d925f..8cdd779 100644
+index e6d925f..e7a4af8 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -570,7 +570,11 @@ static void reload_tss(void)
@@ -22670,15 +22661,7 @@ index e6d925f..8cdd779 100644
load_TR_desc();
}
-@@ -1035,6 +1039,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
- * Returns 0 on success, non-0 otherwise.
- * Assumes vcpu_load() was already called.
- */
-+static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) __size_overflow(3);
- static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
- {
- struct vcpu_vmx *vmx = to_vmx(vcpu);
-@@ -1410,8 +1415,11 @@ static __init int hardware_setup(void)
+@@ -1410,8 +1414,11 @@ static __init int hardware_setup(void)
if (!cpu_has_vmx_flexpriority())
flexpriority_enabled = 0;
@@ -22692,7 +22675,7 @@ index e6d925f..8cdd779 100644
if (enable_ept && !cpu_has_vmx_ept_2m_page())
kvm_disable_largepages();
-@@ -2362,7 +2370,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)
+@@ -2362,7 +2369,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)
vmcs_writel(HOST_IDTR_BASE, dt.base); /* 22.2.4 */
asm("mov $.Lkvm_vmx_return, %0" : "=r"(kvm_vmx_return));
@@ -22701,7 +22684,7 @@ index e6d925f..8cdd779 100644
vmcs_write32(VM_EXIT_MSR_STORE_COUNT, 0);
vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, 0);
vmcs_write32(VM_ENTRY_MSR_LOAD_COUNT, 0);
-@@ -3718,6 +3726,12 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+@@ -3718,6 +3725,12 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
"jmp .Lkvm_vmx_return \n\t"
".Llaunched: " __ex(ASM_VMX_VMRESUME) "\n\t"
".Lkvm_vmx_return: "
@@ -22714,7 +22697,7 @@ index e6d925f..8cdd779 100644
/* Save guest registers, load host registers, keep flags */
"xchg %0, (%%"R"sp) \n\t"
"mov %%"R"ax, %c[rax](%0) \n\t"
-@@ -3764,8 +3778,13 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+@@ -3764,8 +3777,13 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
[r15]"i"(offsetof(struct vcpu_vmx, vcpu.arch.regs[VCPU_REGS_R15])),
#endif
[cr2]"i"(offsetof(struct vcpu_vmx, vcpu.arch.cr2))
@@ -22729,7 +22712,7 @@ index e6d925f..8cdd779 100644
#ifdef CONFIG_X86_64
, "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
#endif
-@@ -3782,7 +3801,16 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+@@ -3782,7 +3800,16 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
if (vmx->rmode.irq.pending)
fixup_rmode_irq(vmx);
@@ -22747,7 +22730,7 @@ index e6d925f..8cdd779 100644
vmx->launched = 1;
vmx_complete_interrupts(vmx);
-@@ -3957,7 +3985,7 @@ static bool vmx_gb_page_enable(void)
+@@ -3957,7 +3984,7 @@ static bool vmx_gb_page_enable(void)
return false;
}
@@ -33356,7 +33339,7 @@ index 62f282e..e45c45c 100644
cdev_init(&ptmx_cdev, &ptmx_fops);
if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
diff --git a/drivers/char/random.c b/drivers/char/random.c
-index 3a19e2d..6ed09d3 100644
+index 3a19e2d..1b8116a3 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -254,8 +254,13 @@
@@ -33400,6 +33383,25 @@ index 3a19e2d..6ed09d3 100644
static int max_write_thresh = INPUT_POOL_WORDS * 32;
static char sysctl_bootid[16];
+@@ -1231,10 +1243,15 @@ static int proc_do_uuid(ctl_table *table, int write,
+ uuid = table->data;
+ if (!uuid) {
+ uuid = tmp_uuid;
+- uuid[8] = 0;
+- }
+- if (uuid[8] == 0)
+ generate_random_uuid(uuid);
++ } else {
++ static DEFINE_SPINLOCK(bootid_spinlock);
++
++ spin_lock(&bootid_spinlock);
++ if (!uuid[8])
++ generate_random_uuid(uuid);
++ spin_unlock(&bootid_spinlock);
++ }
+
+ sprintf(buf, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-"
+ "%02x%02x%02x%02x%02x%02x",
diff --git a/drivers/char/rocket.c b/drivers/char/rocket.c
index 0e29a23..0efc2c2 100644
--- a/drivers/char/rocket.c
@@ -91064,7 +91066,7 @@ index 3f2f04f..4e53ded 100644
/* If set, cpu_up and cpu_down will return -EBUSY and do nothing.
* Should always be manipulated under cpu_add_remove_lock
diff --git a/kernel/cred.c b/kernel/cred.c
-index 0b5b5fc..f7fe51a 100644
+index 0b5b5fc..3fe945c 100644
--- a/kernel/cred.c
+++ b/kernel/cred.c
@@ -160,6 +160,8 @@ static void put_cred_rcu(struct rcu_head *rcu)
@@ -91137,7 +91139,7 @@ index 0b5b5fc..f7fe51a 100644
#ifdef CONFIG_KEYS
tgcred = kmalloc(sizeof(*tgcred), GFP_KERNEL);
if (!tgcred)
-@@ -441,6 +462,8 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags)
+@@ -441,8 +462,12 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags)
struct cred *new;
int ret;
@@ -91145,8 +91147,12 @@ index 0b5b5fc..f7fe51a 100644
+
mutex_init(&p->cred_guard_mutex);
++ p->replacement_session_keyring = NULL;
++
if (
-@@ -523,11 +546,13 @@ error_put:
+ #ifdef CONFIG_KEYS
+ !p->cred->thread_keyring &&
+@@ -523,11 +548,13 @@ error_put:
* Always returns 0 thus allowing this function to be tail-called at the end
* of, say, sys_setgid().
*/
@@ -91161,7 +91167,7 @@ index 0b5b5fc..f7fe51a 100644
kdebug("commit_creds(%p{%d,%d})", new,
atomic_read(&new->usage),
read_cred_subscribers(new));
-@@ -544,6 +569,8 @@ int commit_creds(struct cred *new)
+@@ -544,6 +571,8 @@ int commit_creds(struct cred *new)
get_cred(new); /* we will require a ref for the subj creds too */
@@ -91170,7 +91176,7 @@ index 0b5b5fc..f7fe51a 100644
/* dumpability changes */
if (old->euid != new->euid ||
old->egid != new->egid ||
-@@ -563,10 +590,8 @@ int commit_creds(struct cred *new)
+@@ -563,10 +592,8 @@ int commit_creds(struct cred *new)
key_fsgid_changed(task);
/* do it
@@ -91183,7 +91189,7 @@ index 0b5b5fc..f7fe51a 100644
*/
alter_cred_subscribers(new, 2);
if (new->user != old->user)
-@@ -595,8 +620,96 @@ int commit_creds(struct cred *new)
+@@ -595,8 +622,96 @@ int commit_creds(struct cred *new)
put_cred(old);
return 0;
}
@@ -91280,7 +91286,7 @@ index 0b5b5fc..f7fe51a 100644
/**
* abort_creds - Discard a set of credentials and unlock the current task
* @new: The credentials that were going to be applied
-@@ -606,6 +719,8 @@ EXPORT_SYMBOL(commit_creds);
+@@ -606,6 +721,8 @@ EXPORT_SYMBOL(commit_creds);
*/
void abort_creds(struct cred *new)
{
@@ -91289,7 +91295,7 @@ index 0b5b5fc..f7fe51a 100644
kdebug("abort_creds(%p{%d,%d})", new,
atomic_read(&new->usage),
read_cred_subscribers(new));
-@@ -629,6 +744,8 @@ const struct cred *override_creds(const struct cred *new)
+@@ -629,6 +746,8 @@ const struct cred *override_creds(const struct cred *new)
{
const struct cred *old = current->cred;
@@ -91298,7 +91304,7 @@ index 0b5b5fc..f7fe51a 100644
kdebug("override_creds(%p{%d,%d})", new,
atomic_read(&new->usage),
read_cred_subscribers(new));
-@@ -658,6 +775,8 @@ void revert_creds(const struct cred *old)
+@@ -658,6 +777,8 @@ void revert_creds(const struct cred *old)
{
const struct cred *override = current->cred;
@@ -91307,7 +91313,7 @@ index 0b5b5fc..f7fe51a 100644
kdebug("revert_creds(%p{%d,%d})", old,
atomic_read(&old->usage),
read_cred_subscribers(old));
-@@ -704,6 +823,8 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)
+@@ -704,6 +825,8 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)
const struct cred *old;
struct cred *new;
@@ -91316,7 +91322,7 @@ index 0b5b5fc..f7fe51a 100644
new = kmem_cache_alloc(cred_jar, GFP_KERNEL);
if (!new)
return NULL;
-@@ -758,6 +879,8 @@ EXPORT_SYMBOL(prepare_kernel_cred);
+@@ -758,6 +881,8 @@ EXPORT_SYMBOL(prepare_kernel_cred);
*/
int set_security_override(struct cred *new, u32 secid)
{
@@ -91325,7 +91331,7 @@ index 0b5b5fc..f7fe51a 100644
return security_kernel_act_as(new, secid);
}
EXPORT_SYMBOL(set_security_override);
-@@ -777,6 +900,8 @@ int set_security_override_from_ctx(struct cred *new, const char *secctx)
+@@ -777,6 +902,8 @@ int set_security_override_from_ctx(struct cred *new, const char *secctx)
u32 secid;
int ret;
@@ -93079,7 +93085,7 @@ index 67578ca..4115fbf 100644
static inline void mutex_clear_owner(struct mutex *lock)
diff --git a/kernel/panic.c b/kernel/panic.c
-index 96b45d0..ff70a46 100644
+index 96b45d0..7677a03 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -71,7 +71,11 @@ NORET_TYPE void panic(const char * fmt, ...)
@@ -93090,7 +93096,7 @@ index 96b45d0..ff70a46 100644
+ /*
+ * Avoid nested stack-dumping if a panic occurs during oops processing
+ */
-+ if (!oops_in_progress)
++ if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)
+ dump_stack();
#endif
diff --git a/3.2.14/0000_README b/3.2.15/0000_README
index 89c9544..0b6d426 100644
--- a/3.2.14/0000_README
+++ b/3.2.15/0000_README
@@ -2,7 +2,11 @@ README
-----------------------------------------------------------------------------
Individual Patch Descriptions:
-----------------------------------------------------------------------------
-Patch: 4420_grsecurity-2.9-3.2.14-201204091728.patch
+Patch: 1014_linux-3.2.15.patch
+From: http://www.kernel.org
+Desc: Linux 3.2.15
+
+Patch: 4420_grsecurity-2.9-3.2.15-201204131715.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.2.15/1014_linux-3.2.15.patch b/3.2.15/1014_linux-3.2.15.patch
new file mode 100644
index 0000000..b836a63
--- /dev/null
+++ b/3.2.15/1014_linux-3.2.15.patch
@@ -0,0 +1,2169 @@
+diff --git a/Makefile b/Makefile
+index afe4c7d..6195122 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 2
+-SUBLEVEL = 14
++SUBLEVEL = 15
+ EXTRAVERSION =
+ NAME = Saber-toothed Squirrel
+
+diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
+index dbc59fa..379cdc7 100644
+--- a/arch/arm/mach-tegra/Kconfig
++++ b/arch/arm/mach-tegra/Kconfig
+@@ -61,11 +61,6 @@ config MACH_SEABOARD
+ config MACH_TEGRA_DT
+ bool "Generic Tegra board (FDT support)"
+ select USE_OF
+- select ARM_ERRATA_743622
+- select ARM_ERRATA_751472
+- select ARM_ERRATA_754322
+- select ARM_ERRATA_764369
+- select PL310_ERRATA_769419 if CACHE_L2X0
+ help
+ Support for generic nVidia Tegra boards using Flattened Device Tree
+
+diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c
+index c247de0..1918d76 100644
+--- a/arch/m68k/mac/config.c
++++ b/arch/m68k/mac/config.c
+@@ -950,6 +950,9 @@ int __init mac_platform_init(void)
+ {
+ u8 *swim_base;
+
++ if (!MACH_IS_MAC)
++ return -ENODEV;
++
+ /*
+ * Serial devices
+ */
+diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h
+index 431793e..34baa0e 100644
+--- a/arch/x86/include/asm/timer.h
++++ b/arch/x86/include/asm/timer.h
+@@ -57,14 +57,10 @@ DECLARE_PER_CPU(unsigned long long, cyc2ns_offset);
+
+ static inline unsigned long long __cycles_2_ns(unsigned long long cyc)
+ {
+- unsigned long long quot;
+- unsigned long long rem;
+ int cpu = smp_processor_id();
+ unsigned long long ns = per_cpu(cyc2ns_offset, cpu);
+- quot = (cyc >> CYC2NS_SCALE_FACTOR);
+- rem = cyc & ((1ULL << CYC2NS_SCALE_FACTOR) - 1);
+- ns += quot * per_cpu(cyc2ns, cpu) +
+- ((rem * per_cpu(cyc2ns, cpu)) >> CYC2NS_SCALE_FACTOR);
++ ns += mult_frac(cyc, per_cpu(cyc2ns, cpu),
++ (1UL << CYC2NS_SCALE_FACTOR));
+ return ns;
+ }
+
+diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
+index a25e276..6d939d7 100644
+--- a/arch/x86/kernel/apic/io_apic.c
++++ b/arch/x86/kernel/apic/io_apic.c
+@@ -3963,36 +3963,18 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi)
+ static __init int bad_ioapic(unsigned long address)
+ {
+ if (nr_ioapics >= MAX_IO_APICS) {
+- pr_warn("WARNING: Max # of I/O APICs (%d) exceeded (found %d), skipping\n",
+- MAX_IO_APICS, nr_ioapics);
++ printk(KERN_WARNING "WARNING: Max # of I/O APICs (%d) exceeded "
++ "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics);
+ return 1;
+ }
+ if (!address) {
+- pr_warn("WARNING: Bogus (zero) I/O APIC address found in table, skipping!\n");
++ printk(KERN_WARNING "WARNING: Bogus (zero) I/O APIC address"
++ " found in table, skipping!\n");
+ return 1;
+ }
+ return 0;
+ }
+
+-static __init int bad_ioapic_register(int idx)
+-{
+- union IO_APIC_reg_00 reg_00;
+- union IO_APIC_reg_01 reg_01;
+- union IO_APIC_reg_02 reg_02;
+-
+- reg_00.raw = io_apic_read(idx, 0);
+- reg_01.raw = io_apic_read(idx, 1);
+- reg_02.raw = io_apic_read(idx, 2);
+-
+- if (reg_00.raw == -1 && reg_01.raw == -1 && reg_02.raw == -1) {
+- pr_warn("I/O APIC 0x%x registers return all ones, skipping!\n",
+- mpc_ioapic_addr(idx));
+- return 1;
+- }
+-
+- return 0;
+-}
+-
+ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
+ {
+ int idx = 0;
+@@ -4009,12 +3991,6 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
+ ioapics[idx].mp_config.apicaddr = address;
+
+ set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
+-
+- if (bad_ioapic_register(idx)) {
+- clear_fixmap(FIX_IO_APIC_BASE_0 + idx);
+- return;
+- }
+-
+ ioapics[idx].mp_config.apicid = io_apic_unique_id(id);
+ ioapics[idx].mp_config.apicver = io_apic_get_version(idx);
+
+@@ -4035,10 +4011,10 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
+ if (gsi_cfg->gsi_end >= gsi_top)
+ gsi_top = gsi_cfg->gsi_end + 1;
+
+- pr_info("IOAPIC[%d]: apic_id %d, version %d, address 0x%x, GSI %d-%d\n",
+- idx, mpc_ioapic_id(idx),
+- mpc_ioapic_ver(idx), mpc_ioapic_addr(idx),
+- gsi_cfg->gsi_base, gsi_cfg->gsi_end);
++ printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, "
++ "GSI %d-%d\n", idx, mpc_ioapic_id(idx),
++ mpc_ioapic_ver(idx), mpc_ioapic_addr(idx),
++ gsi_cfg->gsi_base, gsi_cfg->gsi_end);
+
+ nr_ioapics++;
+ }
+diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
+index faba577..2f45c4c 100644
+--- a/arch/x86/kernel/kgdb.c
++++ b/arch/x86/kernel/kgdb.c
+@@ -43,6 +43,8 @@
+ #include <linux/smp.h>
+ #include <linux/nmi.h>
+ #include <linux/hw_breakpoint.h>
++#include <linux/uaccess.h>
++#include <linux/memory.h>
+
+ #include <asm/debugreg.h>
+ #include <asm/apicdef.h>
+@@ -740,6 +742,64 @@ void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long ip)
+ regs->ip = ip;
+ }
+
++int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
++{
++ int err;
++ char opc[BREAK_INSTR_SIZE];
++
++ bpt->type = BP_BREAKPOINT;
++ err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr,
++ BREAK_INSTR_SIZE);
++ if (err)
++ return err;
++ err = probe_kernel_write((char *)bpt->bpt_addr,
++ arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE);
++#ifdef CONFIG_DEBUG_RODATA
++ if (!err)
++ return err;
++ /*
++ * It is safe to call text_poke() because normal kernel execution
++ * is stopped on all cores, so long as the text_mutex is not locked.
++ */
++ if (mutex_is_locked(&text_mutex))
++ return -EBUSY;
++ text_poke((void *)bpt->bpt_addr, arch_kgdb_ops.gdb_bpt_instr,
++ BREAK_INSTR_SIZE);
++ err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE);
++ if (err)
++ return err;
++ if (memcmp(opc, arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE))
++ return -EINVAL;
++ bpt->type = BP_POKE_BREAKPOINT;
++#endif /* CONFIG_DEBUG_RODATA */
++ return err;
++}
++
++int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)
++{
++#ifdef CONFIG_DEBUG_RODATA
++ int err;
++ char opc[BREAK_INSTR_SIZE];
++
++ if (bpt->type != BP_POKE_BREAKPOINT)
++ goto knl_write;
++ /*
++ * It is safe to call text_poke() because normal kernel execution
++ * is stopped on all cores, so long as the text_mutex is not locked.
++ */
++ if (mutex_is_locked(&text_mutex))
++ goto knl_write;
++ text_poke((void *)bpt->bpt_addr, bpt->saved_instr, BREAK_INSTR_SIZE);
++ err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE);
++ if (err || memcmp(opc, bpt->saved_instr, BREAK_INSTR_SIZE))
++ goto knl_write;
++ return err;
++knl_write:
++#endif /* CONFIG_DEBUG_RODATA */
++ return probe_kernel_write((char *)bpt->bpt_addr,
++ (char *)bpt->saved_instr, BREAK_INSTR_SIZE);
++}
++
+ struct kgdb_arch arch_kgdb_ops = {
+ /* Breakpoint instruction: */
+ .gdb_bpt_instr = { 0xcc },
+diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
+index 3fe298a..1ec515b 100644
+--- a/arch/x86/kernel/tsc.c
++++ b/arch/x86/kernel/tsc.c
+@@ -622,7 +622,8 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)
+
+ if (cpu_khz) {
+ *scale = (NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR)/cpu_khz;
+- *offset = ns_now - (tsc_now * *scale >> CYC2NS_SCALE_FACTOR);
++ *offset = ns_now - mult_frac(tsc_now, *scale,
++ (1UL << CYC2NS_SCALE_FACTOR));
+ }
+
+ sched_clock_idle_wakeup_event(0);
+diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
+index 5671752..5a5b6e4 100644
+--- a/arch/x86/net/bpf_jit_comp.c
++++ b/arch/x86/net/bpf_jit_comp.c
+@@ -289,7 +289,7 @@ void bpf_jit_compile(struct sk_filter *fp)
+ EMIT2(0x24, K & 0xFF); /* and imm8,%al */
+ } else if (K >= 0xFFFF0000) {
+ EMIT2(0x66, 0x25); /* and imm16,%ax */
+- EMIT2(K, 2);
++ EMIT(K, 2);
+ } else {
+ EMIT1_off32(0x25, K); /* and imm32,%eax */
+ }
+diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
+index f8348ab..0ed97d8 100644
+--- a/arch/x86/pci/acpi.c
++++ b/arch/x86/pci/acpi.c
+@@ -54,6 +54,16 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = {
+ DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
+ },
+ },
++ /* https://bugzilla.kernel.org/show_bug.cgi?id=42619 */
++ {
++ .callback = set_use_crs,
++ .ident = "MSI MS-7253",
++ .matches = {
++ DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
++ DMI_MATCH(DMI_BOARD_NAME, "MS-7253"),
++ DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
++ },
++ },
+ {}
+ };
+
+diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c
+index 6f5588e..4c531b4 100644
+--- a/drivers/acpi/acpica/tbfadt.c
++++ b/drivers/acpi/acpica/tbfadt.c
+@@ -350,10 +350,6 @@ static void acpi_tb_convert_fadt(void)
+ u32 address32;
+ u32 i;
+
+- /* Update the local FADT table header length */
+-
+- acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
+-
+ /*
+ * Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary.
+ * Later code will always use the X 64-bit field. Also, check for an
+@@ -395,6 +391,10 @@ static void acpi_tb_convert_fadt(void)
+ acpi_gbl_FADT.boot_flags = 0;
+ }
+
++ /* Update the local FADT table header length */
++
++ acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
++
+ /*
+ * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X"
+ * generic address structures as necessary. Later code will always use
+diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
+index 870550d..4da7d9d 100644
+--- a/drivers/acpi/processor_thermal.c
++++ b/drivers/acpi/processor_thermal.c
+@@ -58,6 +58,27 @@ ACPI_MODULE_NAME("processor_thermal");
+ static DEFINE_PER_CPU(unsigned int, cpufreq_thermal_reduction_pctg);
+ static unsigned int acpi_thermal_cpufreq_is_init = 0;
+
++#define reduction_pctg(cpu) \
++ per_cpu(cpufreq_thermal_reduction_pctg, phys_package_first_cpu(cpu))
++
++/*
++ * Emulate "per package data" using per cpu data (which should really be
++ * provided elsewhere)
++ *
++ * Note we can lose a CPU on cpu hotunplug, in this case we forget the state
++ * temporarily. Fortunately that's not a big issue here (I hope)
++ */
++static int phys_package_first_cpu(int cpu)
++{
++ int i;
++ int id = topology_physical_package_id(cpu);
++
++ for_each_online_cpu(i)
++ if (topology_physical_package_id(i) == id)
++ return i;
++ return 0;
++}
++
+ static int cpu_has_cpufreq(unsigned int cpu)
+ {
+ struct cpufreq_policy policy;
+@@ -77,7 +98,7 @@ static int acpi_thermal_cpufreq_notifier(struct notifier_block *nb,
+
+ max_freq = (
+ policy->cpuinfo.max_freq *
+- (100 - per_cpu(cpufreq_thermal_reduction_pctg, policy->cpu) * 20)
++ (100 - reduction_pctg(policy->cpu) * 20)
+ ) / 100;
+
+ cpufreq_verify_within_limits(policy, 0, max_freq);
+@@ -103,16 +124,28 @@ static int cpufreq_get_cur_state(unsigned int cpu)
+ if (!cpu_has_cpufreq(cpu))
+ return 0;
+
+- return per_cpu(cpufreq_thermal_reduction_pctg, cpu);
++ return reduction_pctg(cpu);
+ }
+
+ static int cpufreq_set_cur_state(unsigned int cpu, int state)
+ {
++ int i;
++
+ if (!cpu_has_cpufreq(cpu))
+ return 0;
+
+- per_cpu(cpufreq_thermal_reduction_pctg, cpu) = state;
+- cpufreq_update_policy(cpu);
++ reduction_pctg(cpu) = state;
++
++ /*
++ * Update all the CPUs in the same package because they all
++ * contribute to the temperature and often share the same
++ * frequency.
++ */
++ for_each_online_cpu(i) {
++ if (topology_physical_package_id(i) ==
++ topology_physical_package_id(cpu))
++ cpufreq_update_policy(i);
++ }
+ return 0;
+ }
+
+@@ -120,10 +153,6 @@ void acpi_thermal_cpufreq_init(void)
+ {
+ int i;
+
+- for (i = 0; i < nr_cpu_ids; i++)
+- if (cpu_present(i))
+- per_cpu(cpufreq_thermal_reduction_pctg, i) = 0;
+-
+ i = cpufreq_register_notifier(&acpi_thermal_cpufreq_notifier_block,
+ CPUFREQ_POLICY_NOTIFIER);
+ if (!i)
+diff --git a/drivers/dma/ioat/dma.c b/drivers/dma/ioat/dma.c
+index a4d6cb0..6595180 100644
+--- a/drivers/dma/ioat/dma.c
++++ b/drivers/dma/ioat/dma.c
+@@ -548,9 +548,9 @@ void ioat_dma_unmap(struct ioat_chan_common *chan, enum dma_ctrl_flags flags,
+ PCI_DMA_TODEVICE, flags, 0);
+ }
+
+-unsigned long ioat_get_current_completion(struct ioat_chan_common *chan)
++dma_addr_t ioat_get_current_completion(struct ioat_chan_common *chan)
+ {
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+ u64 completion;
+
+ completion = *chan->completion;
+@@ -571,7 +571,7 @@ unsigned long ioat_get_current_completion(struct ioat_chan_common *chan)
+ }
+
+ bool ioat_cleanup_preamble(struct ioat_chan_common *chan,
+- unsigned long *phys_complete)
++ dma_addr_t *phys_complete)
+ {
+ *phys_complete = ioat_get_current_completion(chan);
+ if (*phys_complete == chan->last_completion)
+@@ -582,14 +582,14 @@ bool ioat_cleanup_preamble(struct ioat_chan_common *chan,
+ return true;
+ }
+
+-static void __cleanup(struct ioat_dma_chan *ioat, unsigned long phys_complete)
++static void __cleanup(struct ioat_dma_chan *ioat, dma_addr_t phys_complete)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+ struct list_head *_desc, *n;
+ struct dma_async_tx_descriptor *tx;
+
+- dev_dbg(to_dev(chan), "%s: phys_complete: %lx\n",
+- __func__, phys_complete);
++ dev_dbg(to_dev(chan), "%s: phys_complete: %llx\n",
++ __func__, (unsigned long long) phys_complete);
+ list_for_each_safe(_desc, n, &ioat->used_desc) {
+ struct ioat_desc_sw *desc;
+
+@@ -655,7 +655,7 @@ static void __cleanup(struct ioat_dma_chan *ioat, unsigned long phys_complete)
+ static void ioat1_cleanup(struct ioat_dma_chan *ioat)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+
+ prefetch(chan->completion);
+
+@@ -701,7 +701,7 @@ static void ioat1_timer_event(unsigned long data)
+ mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT);
+ spin_unlock_bh(&ioat->desc_lock);
+ } else if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) {
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+
+ spin_lock_bh(&ioat->desc_lock);
+ /* if we haven't made progress and we have already
+diff --git a/drivers/dma/ioat/dma.h b/drivers/dma/ioat/dma.h
+index 5216c8a..8bebddd 100644
+--- a/drivers/dma/ioat/dma.h
++++ b/drivers/dma/ioat/dma.h
+@@ -88,7 +88,7 @@ struct ioatdma_device {
+ struct ioat_chan_common {
+ struct dma_chan common;
+ void __iomem *reg_base;
+- unsigned long last_completion;
++ dma_addr_t last_completion;
+ spinlock_t cleanup_lock;
+ dma_cookie_t completed_cookie;
+ unsigned long state;
+@@ -333,7 +333,7 @@ int __devinit ioat_dma_self_test(struct ioatdma_device *device);
+ void __devexit ioat_dma_remove(struct ioatdma_device *device);
+ struct dca_provider * __devinit ioat_dca_init(struct pci_dev *pdev,
+ void __iomem *iobase);
+-unsigned long ioat_get_current_completion(struct ioat_chan_common *chan);
++dma_addr_t ioat_get_current_completion(struct ioat_chan_common *chan);
+ void ioat_init_channel(struct ioatdma_device *device,
+ struct ioat_chan_common *chan, int idx);
+ enum dma_status ioat_dma_tx_status(struct dma_chan *c, dma_cookie_t cookie,
+@@ -341,7 +341,7 @@ enum dma_status ioat_dma_tx_status(struct dma_chan *c, dma_cookie_t cookie,
+ void ioat_dma_unmap(struct ioat_chan_common *chan, enum dma_ctrl_flags flags,
+ size_t len, struct ioat_dma_descriptor *hw);
+ bool ioat_cleanup_preamble(struct ioat_chan_common *chan,
+- unsigned long *phys_complete);
++ dma_addr_t *phys_complete);
+ void ioat_kobject_add(struct ioatdma_device *device, struct kobj_type *type);
+ void ioat_kobject_del(struct ioatdma_device *device);
+ extern const struct sysfs_ops ioat_sysfs_ops;
+diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c
+index 5d65f83..cb8864d 100644
+--- a/drivers/dma/ioat/dma_v2.c
++++ b/drivers/dma/ioat/dma_v2.c
+@@ -126,7 +126,7 @@ static void ioat2_start_null_desc(struct ioat2_dma_chan *ioat)
+ spin_unlock_bh(&ioat->prep_lock);
+ }
+
+-static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete)
++static void __cleanup(struct ioat2_dma_chan *ioat, dma_addr_t phys_complete)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+ struct dma_async_tx_descriptor *tx;
+@@ -178,7 +178,7 @@ static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete)
+ static void ioat2_cleanup(struct ioat2_dma_chan *ioat)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+
+ spin_lock_bh(&chan->cleanup_lock);
+ if (ioat_cleanup_preamble(chan, &phys_complete))
+@@ -259,7 +259,7 @@ int ioat2_reset_sync(struct ioat_chan_common *chan, unsigned long tmo)
+ static void ioat2_restart_channel(struct ioat2_dma_chan *ioat)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+
+ ioat2_quiesce(chan, 0);
+ if (ioat_cleanup_preamble(chan, &phys_complete))
+@@ -274,7 +274,7 @@ void ioat2_timer_event(unsigned long data)
+ struct ioat_chan_common *chan = &ioat->base;
+
+ if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) {
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+ u64 status;
+
+ status = ioat_chansts(chan);
+diff --git a/drivers/dma/ioat/dma_v3.c b/drivers/dma/ioat/dma_v3.c
+index f519c93..2dbf32b 100644
+--- a/drivers/dma/ioat/dma_v3.c
++++ b/drivers/dma/ioat/dma_v3.c
+@@ -256,7 +256,7 @@ static bool desc_has_ext(struct ioat_ring_ent *desc)
+ * The difference from the dma_v2.c __cleanup() is that this routine
+ * handles extended descriptors and dma-unmapping raid operations.
+ */
+-static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete)
++static void __cleanup(struct ioat2_dma_chan *ioat, dma_addr_t phys_complete)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+ struct ioat_ring_ent *desc;
+@@ -314,7 +314,7 @@ static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete)
+ static void ioat3_cleanup(struct ioat2_dma_chan *ioat)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+
+ spin_lock_bh(&chan->cleanup_lock);
+ if (ioat_cleanup_preamble(chan, &phys_complete))
+@@ -333,7 +333,7 @@ static void ioat3_cleanup_event(unsigned long data)
+ static void ioat3_restart_channel(struct ioat2_dma_chan *ioat)
+ {
+ struct ioat_chan_common *chan = &ioat->base;
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+
+ ioat2_quiesce(chan, 0);
+ if (ioat_cleanup_preamble(chan, &phys_complete))
+@@ -348,7 +348,7 @@ static void ioat3_timer_event(unsigned long data)
+ struct ioat_chan_common *chan = &ioat->base;
+
+ if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) {
+- unsigned long phys_complete;
++ dma_addr_t phys_complete;
+ u64 status;
+
+ status = ioat_chansts(chan);
+diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
+index 80fe39d..dd58373 100644
+--- a/drivers/gpu/drm/drm_fb_helper.c
++++ b/drivers/gpu/drm/drm_fb_helper.c
+@@ -610,9 +610,13 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
+ return -EINVAL;
+
+ /* Need to resize the fb object !!! */
+- if (var->bits_per_pixel > fb->bits_per_pixel || var->xres > fb->width || var->yres > fb->height) {
++ if (var->bits_per_pixel > fb->bits_per_pixel ||
++ var->xres > fb->width || var->yres > fb->height ||
++ var->xres_virtual > fb->width || var->yres_virtual > fb->height) {
+ DRM_DEBUG("fb userspace requested width/height/bpp is greater than current fb "
+- "object %dx%d-%d > %dx%d-%d\n", var->xres, var->yres, var->bits_per_pixel,
++ "request %dx%d-%d (virtual %dx%d) > %dx%d-%d\n",
++ var->xres, var->yres, var->bits_per_pixel,
++ var->xres_virtual, var->yres_virtual,
+ fb->width, fb->height, fb->bits_per_pixel);
+ return -EINVAL;
+ }
+diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
+index d04597d..e52b705 100644
+--- a/drivers/gpu/drm/i915/i915_drv.c
++++ b/drivers/gpu/drm/i915/i915_drv.c
+@@ -508,7 +508,9 @@ static int i915_drm_thaw(struct drm_device *dev)
+ drm_irq_install(dev);
+
+ /* Resume the modeset for every activated CRTC */
++ mutex_lock(&dev->mode_config.mutex);
+ drm_helper_resume_force_mode(dev);
++ mutex_unlock(&dev->mode_config.mutex);
+
+ if (IS_IRONLAKE_M(dev))
+ ironlake_enable_rc6(dev);
+diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
+index 1608d2a..2f99fd4 100644
+--- a/drivers/gpu/drm/i915/i915_reg.h
++++ b/drivers/gpu/drm/i915/i915_reg.h
+@@ -2312,6 +2312,7 @@
+ #define PIPECONF_DISABLE 0
+ #define PIPECONF_DOUBLE_WIDE (1<<30)
+ #define I965_PIPECONF_ACTIVE (1<<30)
++#define PIPECONF_FRAME_START_DELAY_MASK (3<<27)
+ #define PIPECONF_SINGLE_WIDE 0
+ #define PIPECONF_PIPE_UNLOCKED 0
+ #define PIPECONF_PIPE_LOCKED (1<<25)
+diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
+index 63880e2..22efb08 100644
+--- a/drivers/gpu/drm/i915/intel_bios.c
++++ b/drivers/gpu/drm/i915/intel_bios.c
+@@ -24,6 +24,7 @@
+ * Eric Anholt <eric@anholt.net>
+ *
+ */
++#include <linux/dmi.h>
+ #include <drm/drm_dp_helper.h>
+ #include "drmP.h"
+ #include "drm.h"
+@@ -621,6 +622,26 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
+ dev_priv->edp.bpp = 18;
+ }
+
++static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
++{
++ DRM_DEBUG_KMS("Falling back to manually reading VBT from "
++ "VBIOS ROM for %s\n",
++ id->ident);
++ return 1;
++}
++
++static const struct dmi_system_id intel_no_opregion_vbt[] = {
++ {
++ .callback = intel_no_opregion_vbt_callback,
++ .ident = "ThinkCentre A57",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++ DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"),
++ },
++ },
++ { }
++};
++
+ /**
+ * intel_parse_bios - find VBT and initialize settings from the BIOS
+ * @dev: DRM device
+@@ -641,7 +662,7 @@ intel_parse_bios(struct drm_device *dev)
+ init_vbt_defaults(dev_priv);
+
+ /* XXX Should this validation be moved to intel_opregion.c? */
+- if (dev_priv->opregion.vbt) {
++ if (!dmi_check_system(intel_no_opregion_vbt) && dev_priv->opregion.vbt) {
+ struct vbt_header *vbt = dev_priv->opregion.vbt;
+ if (memcmp(vbt->signature, "$VBT", 4) == 0) {
+ DRM_DEBUG_KMS("Using VBT from OpRegion: %20s\n",
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index 9ec9755..9011f48 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -7278,6 +7278,12 @@ static void intel_sanitize_modesetting(struct drm_device *dev,
+ struct drm_i915_private *dev_priv = dev->dev_private;
+ u32 reg, val;
+
++ /* Clear any frame start delays used for debugging left by the BIOS */
++ for_each_pipe(pipe) {
++ reg = PIPECONF(pipe);
++ I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
++ }
++
+ if (HAS_PCH_SPLIT(dev))
+ return;
+
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index b83f745..583c2d0 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -731,6 +731,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
+ DMI_MATCH(DMI_BOARD_NAME, "AT5NM10T-I"),
+ },
+ },
++ {
++ .callback = intel_no_lvds_dmi_callback,
++ .ident = "MSI Wind Box DC500",
++ .matches = {
++ DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
++ DMI_MATCH(DMI_BOARD_NAME, "MS-7469"),
++ },
++ },
+
+ { } /* terminating entry */
+ };
+diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
+index 14cc88a..3a05cdb 100644
+--- a/drivers/gpu/drm/radeon/atom.c
++++ b/drivers/gpu/drm/radeon/atom.c
+@@ -1304,8 +1304,11 @@ struct atom_context *atom_parse(struct card_info *card, void *bios)
+
+ int atom_asic_init(struct atom_context *ctx)
+ {
++ struct radeon_device *rdev = ctx->card->dev->dev_private;
+ int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR);
+ uint32_t ps[16];
++ int ret;
++
+ memset(ps, 0, 64);
+
+ ps[0] = cpu_to_le32(CU32(hwi + ATOM_FWI_DEFSCLK_PTR));
+@@ -1315,7 +1318,17 @@ int atom_asic_init(struct atom_context *ctx)
+
+ if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT))
+ return 1;
+- return atom_execute_table(ctx, ATOM_CMD_INIT, ps);
++ ret = atom_execute_table(ctx, ATOM_CMD_INIT, ps);
++ if (ret)
++ return ret;
++
++ memset(ps, 0, 64);
++
++ if (rdev->family < CHIP_R600) {
++ if (CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_SPDFANCNTL))
++ atom_execute_table(ctx, ATOM_CMD_SPDFANCNTL, ps);
++ }
++ return ret;
+ }
+
+ void atom_destroy(struct atom_context *ctx)
+diff --git a/drivers/gpu/drm/radeon/atom.h b/drivers/gpu/drm/radeon/atom.h
+index 93cfe20..25fea63 100644
+--- a/drivers/gpu/drm/radeon/atom.h
++++ b/drivers/gpu/drm/radeon/atom.h
+@@ -44,6 +44,7 @@
+ #define ATOM_CMD_SETSCLK 0x0A
+ #define ATOM_CMD_SETMCLK 0x0B
+ #define ATOM_CMD_SETPCLK 0x0C
++#define ATOM_CMD_SPDFANCNTL 0x39
+
+ #define ATOM_DATA_FWI_PTR 0xC
+ #define ATOM_DATA_IIO_PTR 0x32
+diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
+index 5c74179..20d5852 100644
+--- a/drivers/iommu/amd_iommu_init.c
++++ b/drivers/iommu/amd_iommu_init.c
+@@ -1033,8 +1033,9 @@ static int iommu_setup_msi(struct amd_iommu *iommu)
+ {
+ int r;
+
+- if (pci_enable_msi(iommu->dev))
+- return 1;
++ r = pci_enable_msi(iommu->dev);
++ if (r)
++ return r;
+
+ r = request_threaded_irq(iommu->dev->irq,
+ amd_iommu_int_handler,
+@@ -1044,24 +1045,33 @@ static int iommu_setup_msi(struct amd_iommu *iommu)
+
+ if (r) {
+ pci_disable_msi(iommu->dev);
+- return 1;
++ return r;
+ }
+
+ iommu->int_enabled = true;
+- iommu_feature_enable(iommu, CONTROL_EVT_INT_EN);
+
+ return 0;
+ }
+
+ static int iommu_init_msi(struct amd_iommu *iommu)
+ {
++ int ret;
++
+ if (iommu->int_enabled)
+- return 0;
++ goto enable_faults;
+
+ if (pci_find_capability(iommu->dev, PCI_CAP_ID_MSI))
+- return iommu_setup_msi(iommu);
++ ret = iommu_setup_msi(iommu);
++ else
++ ret = -ENODEV;
+
+- return 1;
++ if (ret)
++ return ret;
++
++enable_faults:
++ iommu_feature_enable(iommu, CONTROL_EVT_INT_EN);
++
++ return 0;
+ }
+
+ /****************************************************************************
+diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c
+index 3eee45f..83f4988 100644
+--- a/drivers/mfd/twl6030-irq.c
++++ b/drivers/mfd/twl6030-irq.c
+@@ -187,8 +187,17 @@ static int twl6030_irq_thread(void *data)
+ }
+ local_irq_enable();
+ }
+- ret = twl_i2c_write(TWL_MODULE_PIH, sts.bytes,
+- REG_INT_STS_A, 3); /* clear INT_STS_A */
++
++ /*
++ * NOTE:
++ * Simulation confirms that documentation is wrong w.r.t the
++ * interrupt status clear operation. A single *byte* write to
++ * any one of STS_A to STS_C register results in all three
++ * STS registers being reset. Since it does not matter which
++ * value is written, all three registers are cleared on a
++ * single byte write, so we just use 0x0 to clear.
++ */
++ ret = twl_i2c_write_u8(TWL_MODULE_PIH, 0x00, REG_INT_STS_A);
+ if (ret)
+ pr_warning("twl6030: I2C error in clearing PIH ISR\n");
+
+diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c
+index 3f7ad83..3aa9a96 100644
+--- a/drivers/misc/kgdbts.c
++++ b/drivers/misc/kgdbts.c
+@@ -134,12 +134,17 @@ static int force_hwbrks;
+ static int hwbreaks_ok;
+ static int hw_break_val;
+ static int hw_break_val2;
++static int cont_instead_of_sstep;
++static unsigned long cont_thread_id;
++static unsigned long sstep_thread_id;
+ #if defined(CONFIG_ARM) || defined(CONFIG_MIPS) || defined(CONFIG_SPARC)
+ static int arch_needs_sstep_emulation = 1;
+ #else
+ static int arch_needs_sstep_emulation;
+ #endif
++static unsigned long cont_addr;
+ static unsigned long sstep_addr;
++static int restart_from_top_after_write;
+ static int sstep_state;
+
+ /* Storage for the registers, in GDB format. */
+@@ -187,7 +192,8 @@ static int kgdbts_unreg_thread(void *ptr)
+ */
+ while (!final_ack)
+ msleep_interruptible(1500);
+-
++ /* Pause for any other threads to exit after final ack. */
++ msleep_interruptible(1000);
+ if (configured)
+ kgdb_unregister_io_module(&kgdbts_io_ops);
+ configured = 0;
+@@ -211,7 +217,7 @@ static unsigned long lookup_addr(char *arg)
+ if (!strcmp(arg, "kgdbts_break_test"))
+ addr = (unsigned long)kgdbts_break_test;
+ else if (!strcmp(arg, "sys_open"))
+- addr = (unsigned long)sys_open;
++ addr = (unsigned long)do_sys_open;
+ else if (!strcmp(arg, "do_fork"))
+ addr = (unsigned long)do_fork;
+ else if (!strcmp(arg, "hw_break_val"))
+@@ -283,6 +289,16 @@ static void hw_break_val_write(void)
+ hw_break_val++;
+ }
+
++static int get_thread_id_continue(char *put_str, char *arg)
++{
++ char *ptr = &put_str[11];
++
++ if (put_str[1] != 'T' || put_str[2] != '0')
++ return 1;
++ kgdb_hex2long(&ptr, &cont_thread_id);
++ return 0;
++}
++
+ static int check_and_rewind_pc(char *put_str, char *arg)
+ {
+ unsigned long addr = lookup_addr(arg);
+@@ -299,13 +315,21 @@ static int check_and_rewind_pc(char *put_str, char *arg)
+ if (addr + BREAK_INSTR_SIZE == ip)
+ offset = -BREAK_INSTR_SIZE;
+ #endif
+- if (strcmp(arg, "silent") && ip + offset != addr) {
++
++ if (arch_needs_sstep_emulation && sstep_addr &&
++ ip + offset == sstep_addr &&
++ ((!strcmp(arg, "sys_open") || !strcmp(arg, "do_fork")))) {
++ /* This is special case for emulated single step */
++ v2printk("Emul: rewind hit single step bp\n");
++ restart_from_top_after_write = 1;
++ } else if (strcmp(arg, "silent") && ip + offset != addr) {
+ eprintk("kgdbts: BP mismatch %lx expected %lx\n",
+ ip + offset, addr);
+ return 1;
+ }
+ /* Readjust the instruction pointer if needed */
+ ip += offset;
++ cont_addr = ip;
+ #ifdef GDB_ADJUSTS_BREAK_OFFSET
+ instruction_pointer_set(&kgdbts_regs, ip);
+ #endif
+@@ -315,6 +339,8 @@ static int check_and_rewind_pc(char *put_str, char *arg)
+ static int check_single_step(char *put_str, char *arg)
+ {
+ unsigned long addr = lookup_addr(arg);
++ static int matched_id;
++
+ /*
+ * From an arch indepent point of view the instruction pointer
+ * should be on a different instruction
+@@ -324,6 +350,29 @@ static int check_single_step(char *put_str, char *arg)
+ gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs);
+ v2printk("Singlestep stopped at IP: %lx\n",
+ instruction_pointer(&kgdbts_regs));
++
++ if (sstep_thread_id != cont_thread_id) {
++ /*
++ * Ensure we stopped in the same thread id as before, else the
++ * debugger should continue until the original thread that was
++ * single stepped is scheduled again, emulating gdb's behavior.
++ */
++ v2printk("ThrID does not match: %lx\n", cont_thread_id);
++ if (arch_needs_sstep_emulation) {
++ if (matched_id &&
++ instruction_pointer(&kgdbts_regs) != addr)
++ goto continue_test;
++ matched_id++;
++ ts.idx -= 2;
++ sstep_state = 0;
++ return 0;
++ }
++ cont_instead_of_sstep = 1;
++ ts.idx -= 4;
++ return 0;
++ }
++continue_test:
++ matched_id = 0;
+ if (instruction_pointer(&kgdbts_regs) == addr) {
+ eprintk("kgdbts: SingleStep failed at %lx\n",
+ instruction_pointer(&kgdbts_regs));
+@@ -365,10 +414,40 @@ static int got_break(char *put_str, char *arg)
+ return 1;
+ }
+
++static void get_cont_catch(char *arg)
++{
++ /* Always send detach because the test is completed at this point */
++ fill_get_buf("D");
++}
++
++static int put_cont_catch(char *put_str, char *arg)
++{
++ /* This is at the end of the test and we catch any and all input */
++ v2printk("kgdbts: cleanup task: %lx\n", sstep_thread_id);
++ ts.idx--;
++ return 0;
++}
++
++static int emul_reset(char *put_str, char *arg)
++{
++ if (strncmp(put_str, "$OK", 3))
++ return 1;
++ if (restart_from_top_after_write) {
++ restart_from_top_after_write = 0;
++ ts.idx = -1;
++ }
++ return 0;
++}
++
+ static void emul_sstep_get(char *arg)
+ {
+ if (!arch_needs_sstep_emulation) {
+- fill_get_buf(arg);
++ if (cont_instead_of_sstep) {
++ cont_instead_of_sstep = 0;
++ fill_get_buf("c");
++ } else {
++ fill_get_buf(arg);
++ }
+ return;
+ }
+ switch (sstep_state) {
+@@ -398,9 +477,11 @@ static void emul_sstep_get(char *arg)
+ static int emul_sstep_put(char *put_str, char *arg)
+ {
+ if (!arch_needs_sstep_emulation) {
+- if (!strncmp(put_str+1, arg, 2))
+- return 0;
+- return 1;
++ char *ptr = &put_str[11];
++ if (put_str[1] != 'T' || put_str[2] != '0')
++ return 1;
++ kgdb_hex2long(&ptr, &sstep_thread_id);
++ return 0;
+ }
+ switch (sstep_state) {
+ case 1:
+@@ -411,8 +492,7 @@ static int emul_sstep_put(char *put_str, char *arg)
+ v2printk("Stopped at IP: %lx\n",
+ instruction_pointer(&kgdbts_regs));
+ /* Want to stop at IP + break instruction size by default */
+- sstep_addr = instruction_pointer(&kgdbts_regs) +
+- BREAK_INSTR_SIZE;
++ sstep_addr = cont_addr + BREAK_INSTR_SIZE;
+ break;
+ case 2:
+ if (strncmp(put_str, "$OK", 3)) {
+@@ -424,6 +504,9 @@ static int emul_sstep_put(char *put_str, char *arg)
+ if (strncmp(put_str, "$T0", 3)) {
+ eprintk("kgdbts: failed continue sstep\n");
+ return 1;
++ } else {
++ char *ptr = &put_str[11];
++ kgdb_hex2long(&ptr, &sstep_thread_id);
+ }
+ break;
+ case 4:
+@@ -502,10 +585,10 @@ static struct test_struct bad_read_test[] = {
+ static struct test_struct singlestep_break_test[] = {
+ { "?", "S0*" }, /* Clear break points */
+ { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
+- { "c", "T0*", }, /* Continue */
++ { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
++ { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */
+ { "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
+ { "write", "OK", write_regs }, /* Write registers */
+- { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */
+ { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
+ { "g", "kgdbts_break_test", NULL, check_single_step },
+ { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
+@@ -523,16 +606,16 @@ static struct test_struct singlestep_break_test[] = {
+ static struct test_struct do_fork_test[] = {
+ { "?", "S0*" }, /* Clear break points */
+ { "do_fork", "OK", sw_break, }, /* set sw breakpoint */
+- { "c", "T0*", }, /* Continue */
+- { "g", "do_fork", NULL, check_and_rewind_pc }, /* check location */
+- { "write", "OK", write_regs }, /* Write registers */
++ { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
+ { "do_fork", "OK", sw_rem_break }, /*remove breakpoint */
++ { "g", "do_fork", NULL, check_and_rewind_pc }, /* check location */
++ { "write", "OK", write_regs, emul_reset }, /* Write registers */
+ { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
+ { "g", "do_fork", NULL, check_single_step },
+ { "do_fork", "OK", sw_break, }, /* set sw breakpoint */
+ { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */
+ { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */
+- { "", "" },
++ { "", "", get_cont_catch, put_cont_catch },
+ };
+
+ /* Test for hitting a breakpoint at sys_open for what ever the number
+@@ -541,16 +624,16 @@ static struct test_struct do_fork_test[] = {
+ static struct test_struct sys_open_test[] = {
+ { "?", "S0*" }, /* Clear break points */
+ { "sys_open", "OK", sw_break, }, /* set sw breakpoint */
+- { "c", "T0*", }, /* Continue */
+- { "g", "sys_open", NULL, check_and_rewind_pc }, /* check location */
+- { "write", "OK", write_regs }, /* Write registers */
++ { "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
+ { "sys_open", "OK", sw_rem_break }, /*remove breakpoint */
++ { "g", "sys_open", NULL, check_and_rewind_pc }, /* check location */
++ { "write", "OK", write_regs, emul_reset }, /* Write registers */
+ { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
+ { "g", "sys_open", NULL, check_single_step },
+ { "sys_open", "OK", sw_break, }, /* set sw breakpoint */
+ { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */
+ { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */
+- { "", "" },
++ { "", "", get_cont_catch, put_cont_catch },
+ };
+
+ /*
+@@ -693,8 +776,8 @@ static int run_simple_test(int is_get_char, int chr)
+ /* This callback is a put char which is when kgdb sends data to
+ * this I/O module.
+ */
+- if (ts.tst[ts.idx].get[0] == '\0' &&
+- ts.tst[ts.idx].put[0] == '\0') {
++ if (ts.tst[ts.idx].get[0] == '\0' && ts.tst[ts.idx].put[0] == '\0' &&
++ !ts.tst[ts.idx].get_handler) {
+ eprintk("kgdbts: ERROR: beyond end of test on"
+ " '%s' line %i\n", ts.name, ts.idx);
+ return 0;
+@@ -907,6 +990,17 @@ static void kgdbts_run_tests(void)
+ if (ptr)
+ sstep_test = simple_strtol(ptr+1, NULL, 10);
+
++ /* All HW break point tests */
++ if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) {
++ hwbreaks_ok = 1;
++ v1printk("kgdbts:RUN hw breakpoint test\n");
++ run_breakpoint_test(1);
++ v1printk("kgdbts:RUN hw write breakpoint test\n");
++ run_hw_break_test(1);
++ v1printk("kgdbts:RUN access write breakpoint test\n");
++ run_hw_break_test(0);
++ }
++
+ /* required internal KGDB tests */
+ v1printk("kgdbts:RUN plant and detach test\n");
+ run_plant_and_detach_test(0);
+@@ -924,35 +1018,11 @@ static void kgdbts_run_tests(void)
+
+ /* ===Optional tests=== */
+
+- /* All HW break point tests */
+- if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) {
+- hwbreaks_ok = 1;
+- v1printk("kgdbts:RUN hw breakpoint test\n");
+- run_breakpoint_test(1);
+- v1printk("kgdbts:RUN hw write breakpoint test\n");
+- run_hw_break_test(1);
+- v1printk("kgdbts:RUN access write breakpoint test\n");
+- run_hw_break_test(0);
+- }
+-
+ if (nmi_sleep) {
+ v1printk("kgdbts:RUN NMI sleep %i seconds test\n", nmi_sleep);
+ run_nmi_sleep_test(nmi_sleep);
+ }
+
+-#ifdef CONFIG_DEBUG_RODATA
+- /* Until there is an api to write to read-only text segments, use
+- * HW breakpoints for the remainder of any tests, else print a
+- * failure message if hw breakpoints do not work.
+- */
+- if (!(arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT && hwbreaks_ok)) {
+- eprintk("kgdbts: HW breakpoints do not work,"
+- "skipping remaining tests\n");
+- return;
+- }
+- force_hwbrks = 1;
+-#endif /* CONFIG_DEBUG_RODATA */
+-
+ /* If the do_fork test is run it will be the last test that is
+ * executed because a kernel thread will be spawned at the very
+ * end to unregister the debug hooks.
+diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
+index 9896933..0932024 100644
+--- a/drivers/mmc/host/atmel-mci.c
++++ b/drivers/mmc/host/atmel-mci.c
+@@ -480,7 +480,14 @@ err:
+ static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host,
+ unsigned int ns)
+ {
+- return (ns * (host->bus_hz / 1000000) + 999) / 1000;
++ /*
++ * It is easier here to use us instead of ns for the timeout,
++ * it prevents from overflows during calculation.
++ */
++ unsigned int us = DIV_ROUND_UP(ns, 1000);
++
++ /* Maximum clock frequency is host->bus_hz/2 */
++ return us * (DIV_ROUND_UP(host->bus_hz, 2000000));
+ }
+
+ static void atmci_set_timeout(struct atmel_mci *host,
+diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c
+index a81312c..31acb70 100644
+--- a/drivers/mmc/host/sdhci-dove.c
++++ b/drivers/mmc/host/sdhci-dove.c
+@@ -20,6 +20,7 @@
+ */
+
+ #include <linux/io.h>
++#include <linux/module.h>
+ #include <linux/mmc/host.h>
+
+ #include "sdhci-pltfm.h"
+diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
+index b78f231..8cd983c 100644
+--- a/drivers/mtd/devices/block2mtd.c
++++ b/drivers/mtd/devices/block2mtd.c
+@@ -284,6 +284,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
+ dev->mtd.erasesize = erase_size;
+ dev->mtd.writesize = 1;
++ dev->mtd.writebufsize = PAGE_SIZE;
+ dev->mtd.type = MTD_RAM;
+ dev->mtd.flags = MTD_CAP_RAM;
+ dev->mtd.erase = block2mtd_erase;
+diff --git a/drivers/mtd/devices/lart.c b/drivers/mtd/devices/lart.c
+index 3a11ea6..5f12668 100644
+--- a/drivers/mtd/devices/lart.c
++++ b/drivers/mtd/devices/lart.c
+@@ -630,6 +630,7 @@ static int __init lart_flash_init (void)
+ mtd.name = module_name;
+ mtd.type = MTD_NORFLASH;
+ mtd.writesize = 1;
++ mtd.writebufsize = 4;
+ mtd.flags = MTD_CAP_NORFLASH;
+ mtd.size = FLASH_BLOCKSIZE_PARAM * FLASH_NUMBLOCKS_16m_PARAM + FLASH_BLOCKSIZE_MAIN * FLASH_NUMBLOCKS_16m_MAIN;
+ mtd.erasesize = FLASH_BLOCKSIZE_MAIN;
+diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c
+index 884904d..9f9982f 100644
+--- a/drivers/mtd/devices/m25p80.c
++++ b/drivers/mtd/devices/m25p80.c
+@@ -932,6 +932,7 @@ static int __devinit m25p_probe(struct spi_device *spi)
+ ppdata.of_node = spi->dev.of_node;
+ flash->mtd.dev.parent = &spi->dev;
+ flash->page_size = info->page_size;
++ flash->mtd.writebufsize = flash->page_size;
+
+ if (info->addr_width)
+ flash->addr_width = info->addr_width;
+diff --git a/drivers/mtd/devices/sst25l.c b/drivers/mtd/devices/sst25l.c
+index d38ef3b..9c35250 100644
+--- a/drivers/mtd/devices/sst25l.c
++++ b/drivers/mtd/devices/sst25l.c
+@@ -402,6 +402,7 @@ static int __devinit sst25l_probe(struct spi_device *spi)
+ flash->mtd.flags = MTD_CAP_NORFLASH;
+ flash->mtd.erasesize = flash_info->erase_size;
+ flash->mtd.writesize = flash_info->page_size;
++ flash->mtd.writebufsize = flash_info->page_size;
+ flash->mtd.size = flash_info->page_size * flash_info->nr_pages;
+ flash->mtd.erase = sst25l_erase;
+ flash->mtd.read = sst25l_read;
+diff --git a/drivers/mtd/maps/ixp4xx.c b/drivers/mtd/maps/ixp4xx.c
+index 3040901..696372f 100644
+--- a/drivers/mtd/maps/ixp4xx.c
++++ b/drivers/mtd/maps/ixp4xx.c
+@@ -182,6 +182,9 @@ static int ixp4xx_flash_probe(struct platform_device *dev)
+ {
+ struct flash_platform_data *plat = dev->dev.platform_data;
+ struct ixp4xx_flash_info *info;
++ struct mtd_part_parser_data ppdata = {
++ .origin = dev->resource->start,
++ };
+ int err = -1;
+
+ if (!plat)
+@@ -247,7 +250,7 @@ static int ixp4xx_flash_probe(struct platform_device *dev)
+ /* Use the fast version */
+ info->map.write = ixp4xx_write16;
+
+- err = mtd_device_parse_register(info->mtd, probes, dev->resource->start,
++ err = mtd_device_parse_register(info->mtd, probes, &ppdata,
+ plat->parts, plat->nr_parts);
+ if (err) {
+ printk(KERN_ERR "Could not parse partitions\n");
+diff --git a/drivers/mtd/maps/lantiq-flash.c b/drivers/mtd/maps/lantiq-flash.c
+index 4f10e27..764d468 100644
+--- a/drivers/mtd/maps/lantiq-flash.c
++++ b/drivers/mtd/maps/lantiq-flash.c
+@@ -45,6 +45,7 @@ struct ltq_mtd {
+ };
+
+ static char ltq_map_name[] = "ltq_nor";
++static const char *ltq_probe_types[] __devinitconst = { "cmdlinepart", NULL };
+
+ static map_word
+ ltq_read16(struct map_info *map, unsigned long adr)
+@@ -168,7 +169,7 @@ ltq_mtd_probe(struct platform_device *pdev)
+ cfi->addr_unlock1 ^= 1;
+ cfi->addr_unlock2 ^= 1;
+
+- err = mtd_device_parse_register(ltq_mtd->mtd, NULL, 0,
++ err = mtd_device_parse_register(ltq_mtd->mtd, ltq_probe_types, 0,
+ ltq_mtd_data->parts, ltq_mtd_data->nr_parts);
+ if (err) {
+ dev_err(&pdev->dev, "failed to add partitions\n");
+diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+index 493ec2f..f39f83e 100644
+--- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
++++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c
+@@ -1124,7 +1124,7 @@ static int gpmi_block_markbad(struct mtd_info *mtd, loff_t ofs)
+ chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
+
+ /* Do we have a flash based bad block table ? */
+- if (chip->options & NAND_BBT_USE_FLASH)
++ if (chip->bbt_options & NAND_BBT_USE_FLASH)
+ ret = nand_update_bbt(mtd, ofs);
+ else {
+ chipnr = (int)(ofs >> chip->chip_shift);
+diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
+index bf40741..3d55883 100644
+--- a/drivers/net/ethernet/broadcom/tg3.c
++++ b/drivers/net/ethernet/broadcom/tg3.c
+@@ -2794,7 +2794,9 @@ static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power)
+ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
+ (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 &&
+- (tp->phy_flags & TG3_PHYFLG_MII_SERDES)))
++ (tp->phy_flags & TG3_PHYFLG_MII_SERDES)) ||
++ (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 &&
++ !tp->pci_fn))
+ return;
+
+ if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX ||
+diff --git a/drivers/net/ethernet/freescale/fsl_pq_mdio.c b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
+index 4d9f84b..ada234a 100644
+--- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c
++++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
+@@ -356,16 +356,15 @@ static int fsl_pq_mdio_probe(struct platform_device *ofdev)
+
+ if (prop)
+ tbiaddr = *prop;
+- }
+-
+- if (tbiaddr == -1) {
+- err = -EBUSY;
+
+- goto err_free_irqs;
++ if (tbiaddr == -1) {
++ err = -EBUSY;
++ goto err_free_irqs;
++ } else {
++ out_be32(tbipa, tbiaddr);
++ }
+ }
+
+- out_be32(tbipa, tbiaddr);
+-
+ err = of_mdiobus_register(new_bus, np);
+ if (err) {
+ printk (KERN_ERR "%s: Cannot register as MDIO bus\n",
+diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
+index f612b35..7eb8a00 100644
+--- a/drivers/net/ethernet/marvell/sky2.c
++++ b/drivers/net/ethernet/marvell/sky2.c
+@@ -1766,13 +1766,14 @@ static int sky2_open(struct net_device *dev)
+
+ sky2_hw_up(sky2);
+
++ /* Enable interrupts from phy/mac for port */
++ imask = sky2_read32(hw, B0_IMSK);
++
+ if (hw->chip_id == CHIP_ID_YUKON_OPT ||
+ hw->chip_id == CHIP_ID_YUKON_PRM ||
+ hw->chip_id == CHIP_ID_YUKON_OP_2)
+ imask |= Y2_IS_PHY_QLNK; /* enable PHY Quick Link */
+
+- /* Enable interrupts from phy/mac for port */
+- imask = sky2_read32(hw, B0_IMSK);
+ imask |= portirq_msk[port];
+ sky2_write32(hw, B0_IMSK, imask);
+ sky2_read32(hw, B0_IMSK);
+diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
+index 0cf2351..697cae3 100644
+--- a/drivers/net/ethernet/realtek/r8169.c
++++ b/drivers/net/ethernet/realtek/r8169.c
+@@ -6194,6 +6194,9 @@ static void rtl_shutdown(struct pci_dev *pdev)
+ {
+ struct net_device *dev = pci_get_drvdata(pdev);
+ struct rtl8169_private *tp = netdev_priv(dev);
++ struct device *d = &pdev->dev;
++
++ pm_runtime_get_sync(d);
+
+ rtl8169_net_suspend(dev);
+
+@@ -6215,6 +6218,8 @@ static void rtl_shutdown(struct pci_dev *pdev)
+ pci_wake_from_d3(pdev, true);
+ pci_set_power_state(pdev, PCI_D3hot);
+ }
++
++ pm_runtime_put_noidle(d);
+ }
+
+ static struct pci_driver rtl8169_pci_driver = {
+diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c
+index 882f53f..82d43b2 100644
+--- a/drivers/net/usb/cdc_eem.c
++++ b/drivers/net/usb/cdc_eem.c
+@@ -93,6 +93,7 @@ static int eem_bind(struct usbnet *dev, struct usb_interface *intf)
+ /* no jumbogram (16K) support for now */
+
+ dev->net->hard_header_len += EEM_HEAD + ETH_FCS_LEN;
++ dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
+
+ return 0;
+ }
+diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c
+index 246b3bb..c1e6a44 100644
+--- a/drivers/net/usb/zaurus.c
++++ b/drivers/net/usb/zaurus.c
+@@ -332,6 +332,11 @@ static const struct usb_device_id products [] = {
+ .driver_info = ZAURUS_PXA_INFO,
+ },
+ {
++ /* Motorola Rokr E6 */
++ USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6027, USB_CLASS_COMM,
++ USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
++ .driver_info = (unsigned long) &bogus_mdlm_info,
++}, {
+ /* Motorola MOTOMAGX phones */
+ USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,
+ USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
+index 1f07558..f20678a 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
+@@ -1968,7 +1968,7 @@ void rtl92c_phy_set_io(struct ieee80211_hw *hw)
+ break;
+ case IO_CMD_PAUSE_DM_BY_SCAN:
+ rtlphy->initgain_backup.xaagccore1 = dm_digtable.cur_igvalue;
+- dm_digtable.cur_igvalue = 0x17;
++ dm_digtable.cur_igvalue = 0x37;
+ rtl92c_dm_write_dig(hw);
+ break;
+ default:
+diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
+index 0883349..2cf4c5f 100644
+--- a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c
+@@ -3192,7 +3192,7 @@ static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
+ break;
+ case IO_CMD_PAUSE_DM_BY_SCAN:
+ rtlphy->initgain_backup.xaagccore1 = de_digtable.cur_igvalue;
+- de_digtable.cur_igvalue = 0x17;
++ de_digtable.cur_igvalue = 0x37;
+ rtl92d_dm_write_dig(hw);
+ break;
+ default:
+diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c
+index 1e5290b..110e4af 100644
+--- a/drivers/platform/x86/acer-wmi.c
++++ b/drivers/platform/x86/acer-wmi.c
+@@ -692,6 +692,7 @@ static const struct acpi_device_id norfkill_ids[] = {
+ { "VPC2004", 0},
+ { "IBM0068", 0},
+ { "LEN0068", 0},
++ { "SNY5001", 0}, /* sony-laptop in charge */
+ { "", 0},
+ };
+
+diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
+index b00c176..d21e8f5 100644
+--- a/drivers/pnp/pnpacpi/core.c
++++ b/drivers/pnp/pnpacpi/core.c
+@@ -321,9 +321,14 @@ static int __init acpi_pnp_match(struct device *dev, void *_pnp)
+ {
+ struct acpi_device *acpi = to_acpi_device(dev);
+ struct pnp_dev *pnp = _pnp;
++ struct device *physical_device;
++
++ physical_device = acpi_get_physical_device(acpi->handle);
++ if (physical_device)
++ put_device(physical_device);
+
+ /* true means it matched */
+- return !acpi_get_physical_device(acpi->handle)
++ return !physical_device
+ && compare_pnp_id(pnp->id, acpi_device_hid(acpi));
+ }
+
+diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
+index cdb774b..5660916 100644
+--- a/drivers/target/target_core_transport.c
++++ b/drivers/target/target_core_transport.c
+@@ -2666,7 +2666,7 @@ static int transport_generic_cmd_sequencer(
+ cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
+
+ if (target_check_write_same_discard(&cdb[10], dev) < 0)
+- goto out_invalid_cdb_field;
++ goto out_unsupported_cdb;
+ if (!passthrough)
+ cmd->execute_task = target_emulate_write_same;
+ break;
+@@ -2949,7 +2949,7 @@ static int transport_generic_cmd_sequencer(
+ cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
+
+ if (target_check_write_same_discard(&cdb[1], dev) < 0)
+- goto out_invalid_cdb_field;
++ goto out_unsupported_cdb;
+ if (!passthrough)
+ cmd->execute_task = target_emulate_write_same;
+ break;
+@@ -2972,7 +2972,7 @@ static int transport_generic_cmd_sequencer(
+ * of byte 1 bit 3 UNMAP instead of original reserved field
+ */
+ if (target_check_write_same_discard(&cdb[1], dev) < 0)
+- goto out_invalid_cdb_field;
++ goto out_unsupported_cdb;
+ if (!passthrough)
+ cmd->execute_task = target_emulate_write_same;
+ break;
+diff --git a/drivers/target/tcm_fc/tcm_fc.h b/drivers/target/tcm_fc/tcm_fc.h
+index e05c551..be7ed12 100644
+--- a/drivers/target/tcm_fc/tcm_fc.h
++++ b/drivers/target/tcm_fc/tcm_fc.h
+@@ -124,6 +124,7 @@ struct ft_cmd {
+ /* Local sense buffer */
+ unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER];
+ u32 was_ddp_setup:1; /* Set only if ddp is setup */
++ u32 aborted:1; /* Set if aborted by reset or timeout */
+ struct scatterlist *sg; /* Set only if DDP is setup */
+ u32 sg_cnt; /* No. of item in scatterlist */
+ };
+diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c
+index 754b669..d95cfe2 100644
+--- a/drivers/target/tcm_fc/tfc_cmd.c
++++ b/drivers/target/tcm_fc/tfc_cmd.c
+@@ -130,6 +130,8 @@ int ft_queue_status(struct se_cmd *se_cmd)
+ struct fc_exch *ep;
+ size_t len;
+
++ if (cmd->aborted)
++ return 0;
+ ft_dump_cmd(cmd, __func__);
+ ep = fc_seq_exch(cmd->seq);
+ lport = ep->lp;
+@@ -196,6 +198,8 @@ int ft_write_pending(struct se_cmd *se_cmd)
+
+ ft_dump_cmd(cmd, __func__);
+
++ if (cmd->aborted)
++ return 0;
+ ep = fc_seq_exch(cmd->seq);
+ lport = ep->lp;
+ fp = fc_frame_alloc(lport, sizeof(*txrdy));
+@@ -266,10 +270,10 @@ static void ft_recv_seq(struct fc_seq *sp, struct fc_frame *fp, void *arg)
+ struct ft_cmd *cmd = arg;
+ struct fc_frame_header *fh;
+
+- if (IS_ERR(fp)) {
++ if (unlikely(IS_ERR(fp))) {
+ /* XXX need to find cmd if queued */
+ cmd->seq = NULL;
+- transport_generic_free_cmd(&cmd->se_cmd, 0);
++ cmd->aborted = true;
+ return;
+ }
+
+@@ -447,6 +451,8 @@ int ft_queue_tm_resp(struct se_cmd *se_cmd)
+ struct se_tmr_req *tmr = se_cmd->se_tmr_req;
+ enum fcp_resp_rsp_codes code;
+
++ if (cmd->aborted)
++ return 0;
+ switch (tmr->response) {
+ case TMR_FUNCTION_COMPLETE:
+ code = FCP_TMF_CMPL;
+diff --git a/drivers/target/tcm_fc/tfc_conf.c b/drivers/target/tcm_fc/tfc_conf.c
+index 9402b73..7962325 100644
+--- a/drivers/target/tcm_fc/tfc_conf.c
++++ b/drivers/target/tcm_fc/tfc_conf.c
+@@ -304,6 +304,7 @@ static struct se_portal_group *ft_add_tpg(
+ {
+ struct ft_lport_acl *lacl;
+ struct ft_tpg *tpg;
++ struct workqueue_struct *wq;
+ unsigned long index;
+ int ret;
+
+@@ -325,18 +326,20 @@ static struct se_portal_group *ft_add_tpg(
+ tpg->lport_acl = lacl;
+ INIT_LIST_HEAD(&tpg->lun_list);
+
+- ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg,
+- tpg, TRANSPORT_TPG_TYPE_NORMAL);
+- if (ret < 0) {
++ wq = alloc_workqueue("tcm_fc", 0, 1);
++ if (!wq) {
+ kfree(tpg);
+ return NULL;
+ }
+
+- tpg->workqueue = alloc_workqueue("tcm_fc", 0, 1);
+- if (!tpg->workqueue) {
++ ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg,
++ tpg, TRANSPORT_TPG_TYPE_NORMAL);
++ if (ret < 0) {
++ destroy_workqueue(wq);
+ kfree(tpg);
+ return NULL;
+ }
++ tpg->workqueue = wq;
+
+ mutex_lock(&ft_lport_lock);
+ list_add_tail(&tpg->list, &lacl->tpg_list);
+diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c
+index 1369b1c..ada131c 100644
+--- a/drivers/target/tcm_fc/tfc_io.c
++++ b/drivers/target/tcm_fc/tfc_io.c
+@@ -84,6 +84,8 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
+ void *from;
+ void *to = NULL;
+
++ if (cmd->aborted)
++ return 0;
+ ep = fc_seq_exch(cmd->seq);
+ lport = ep->lp;
+ cmd->seq = lport->tt.seq_start_next(cmd->seq);
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index 159fcc5..0f7dc22 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -835,13 +835,21 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock)
+ if ((flock->fl_flags & FL_POSIX) == 0)
+ return rc;
+
++try_again:
+ mutex_lock(&cinode->lock_mutex);
+ if (!cinode->can_cache_brlcks) {
+ mutex_unlock(&cinode->lock_mutex);
+ return rc;
+ }
+- rc = posix_lock_file_wait(file, flock);
++
++ rc = posix_lock_file(file, flock, NULL);
+ mutex_unlock(&cinode->lock_mutex);
++ if (rc == FILE_LOCK_DEFERRED) {
++ rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next);
++ if (!rc)
++ goto try_again;
++ locks_delete_block(flock);
++ }
+ return rc;
+ }
+
+diff --git a/fs/locks.c b/fs/locks.c
+index 637694b..0d68f1f 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -510,12 +510,13 @@ static void __locks_delete_block(struct file_lock *waiter)
+
+ /*
+ */
+-static void locks_delete_block(struct file_lock *waiter)
++void locks_delete_block(struct file_lock *waiter)
+ {
+ lock_flocks();
+ __locks_delete_block(waiter);
+ unlock_flocks();
+ }
++EXPORT_SYMBOL(locks_delete_block);
+
+ /* Insert waiter into blocker's block list.
+ * We use a circular list so that processes can be easily woken up in
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index d945700..757293b 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -3618,7 +3618,7 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
+ if (acl_len > buflen)
+ goto out_free;
+ _copy_from_pages(buf, pages, res.acl_data_offset,
+- res.acl_len);
++ acl_len);
+ }
+ ret = acl_len;
+ out_free:
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index 10b2288..11f1951 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -1203,6 +1203,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **);
+ extern int lease_modify(struct file_lock **, int);
+ extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
+ extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
++extern void locks_delete_block(struct file_lock *waiter);
+ extern void lock_flocks(void);
+ extern void unlock_flocks(void);
+ #else /* !CONFIG_FILE_LOCKING */
+@@ -1347,6 +1348,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start,
+ return 1;
+ }
+
++static inline void locks_delete_block(struct file_lock *waiter)
++{
++}
++
+ static inline void lock_flocks(void)
+ {
+ }
+diff --git a/include/linux/kernel.h b/include/linux/kernel.h
+index e8b1597..a70783d 100644
+--- a/include/linux/kernel.h
++++ b/include/linux/kernel.h
+@@ -85,6 +85,19 @@
+ } \
+ )
+
++/*
++ * Multiplies an integer by a fraction, while avoiding unnecessary
++ * overflow or loss of precision.
++ */
++#define mult_frac(x, numer, denom)( \
++{ \
++ typeof(x) quot = (x) / (denom); \
++ typeof(x) rem = (x) % (denom); \
++ (quot * (numer)) + ((rem * (numer)) / (denom)); \
++} \
++)
++
++
+ #define _RET_IP_ (unsigned long)__builtin_return_address(0)
+ #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
+
+diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h
+index fa39183..c4d2fc1 100644
+--- a/include/linux/kgdb.h
++++ b/include/linux/kgdb.h
+@@ -63,7 +63,8 @@ enum kgdb_bptype {
+ BP_HARDWARE_BREAKPOINT,
+ BP_WRITE_WATCHPOINT,
+ BP_READ_WATCHPOINT,
+- BP_ACCESS_WATCHPOINT
++ BP_ACCESS_WATCHPOINT,
++ BP_POKE_BREAKPOINT,
+ };
+
+ enum kgdb_bpstate {
+@@ -207,8 +208,8 @@ extern void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc);
+
+ /* Optional functions. */
+ extern int kgdb_validate_break_address(unsigned long addr);
+-extern int kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr);
+-extern int kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle);
++extern int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt);
++extern int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt);
+
+ /**
+ * kgdb_arch_late - Perform any architecture specific initalization.
+diff --git a/kernel/cred.c b/kernel/cred.c
+index 5791612..48c6fd3 100644
+--- a/kernel/cred.c
++++ b/kernel/cred.c
+@@ -385,6 +385,8 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags)
+ struct cred *new;
+ int ret;
+
++ p->replacement_session_keyring = NULL;
++
+ if (
+ #ifdef CONFIG_KEYS
+ !p->cred->thread_keyring &&
+diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c
+index 0d7c087..7fda904 100644
+--- a/kernel/debug/debug_core.c
++++ b/kernel/debug/debug_core.c
+@@ -157,37 +157,39 @@ early_param("nokgdbroundup", opt_nokgdbroundup);
+ * Weak aliases for breakpoint management,
+ * can be overriden by architectures when needed:
+ */
+-int __weak kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr)
++int __weak kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
+ {
+ int err;
+
+- err = probe_kernel_read(saved_instr, (char *)addr, BREAK_INSTR_SIZE);
++ err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr,
++ BREAK_INSTR_SIZE);
+ if (err)
+ return err;
+-
+- return probe_kernel_write((char *)addr, arch_kgdb_ops.gdb_bpt_instr,
+- BREAK_INSTR_SIZE);
++ err = probe_kernel_write((char *)bpt->bpt_addr,
++ arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE);
++ return err;
+ }
+
+-int __weak kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle)
++int __weak kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)
+ {
+- return probe_kernel_write((char *)addr,
+- (char *)bundle, BREAK_INSTR_SIZE);
++ return probe_kernel_write((char *)bpt->bpt_addr,
++ (char *)bpt->saved_instr, BREAK_INSTR_SIZE);
+ }
+
+ int __weak kgdb_validate_break_address(unsigned long addr)
+ {
+- char tmp_variable[BREAK_INSTR_SIZE];
++ struct kgdb_bkpt tmp;
+ int err;
+- /* Validate setting the breakpoint and then removing it. In the
++ /* Validate setting the breakpoint and then removing it. If the
+ * remove fails, the kernel needs to emit a bad message because we
+ * are deep trouble not being able to put things back the way we
+ * found them.
+ */
+- err = kgdb_arch_set_breakpoint(addr, tmp_variable);
++ tmp.bpt_addr = addr;
++ err = kgdb_arch_set_breakpoint(&tmp);
+ if (err)
+ return err;
+- err = kgdb_arch_remove_breakpoint(addr, tmp_variable);
++ err = kgdb_arch_remove_breakpoint(&tmp);
+ if (err)
+ printk(KERN_ERR "KGDB: Critical breakpoint error, kernel "
+ "memory destroyed at: %lx", addr);
+@@ -231,7 +233,6 @@ static void kgdb_flush_swbreak_addr(unsigned long addr)
+ */
+ int dbg_activate_sw_breakpoints(void)
+ {
+- unsigned long addr;
+ int error;
+ int ret = 0;
+ int i;
+@@ -240,16 +241,15 @@ int dbg_activate_sw_breakpoints(void)
+ if (kgdb_break[i].state != BP_SET)
+ continue;
+
+- addr = kgdb_break[i].bpt_addr;
+- error = kgdb_arch_set_breakpoint(addr,
+- kgdb_break[i].saved_instr);
++ error = kgdb_arch_set_breakpoint(&kgdb_break[i]);
+ if (error) {
+ ret = error;
+- printk(KERN_INFO "KGDB: BP install failed: %lx", addr);
++ printk(KERN_INFO "KGDB: BP install failed: %lx",
++ kgdb_break[i].bpt_addr);
+ continue;
+ }
+
+- kgdb_flush_swbreak_addr(addr);
++ kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr);
+ kgdb_break[i].state = BP_ACTIVE;
+ }
+ return ret;
+@@ -298,7 +298,6 @@ int dbg_set_sw_break(unsigned long addr)
+
+ int dbg_deactivate_sw_breakpoints(void)
+ {
+- unsigned long addr;
+ int error;
+ int ret = 0;
+ int i;
+@@ -306,15 +305,14 @@ int dbg_deactivate_sw_breakpoints(void)
+ for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
+ if (kgdb_break[i].state != BP_ACTIVE)
+ continue;
+- addr = kgdb_break[i].bpt_addr;
+- error = kgdb_arch_remove_breakpoint(addr,
+- kgdb_break[i].saved_instr);
++ error = kgdb_arch_remove_breakpoint(&kgdb_break[i]);
+ if (error) {
+- printk(KERN_INFO "KGDB: BP remove failed: %lx\n", addr);
++ printk(KERN_INFO "KGDB: BP remove failed: %lx\n",
++ kgdb_break[i].bpt_addr);
+ ret = error;
+ }
+
+- kgdb_flush_swbreak_addr(addr);
++ kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr);
+ kgdb_break[i].state = BP_SET;
+ }
+ return ret;
+@@ -348,7 +346,6 @@ int kgdb_isremovedbreak(unsigned long addr)
+
+ int dbg_remove_all_break(void)
+ {
+- unsigned long addr;
+ int error;
+ int i;
+
+@@ -356,12 +353,10 @@ int dbg_remove_all_break(void)
+ for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {
+ if (kgdb_break[i].state != BP_ACTIVE)
+ goto setundefined;
+- addr = kgdb_break[i].bpt_addr;
+- error = kgdb_arch_remove_breakpoint(addr,
+- kgdb_break[i].saved_instr);
++ error = kgdb_arch_remove_breakpoint(&kgdb_break[i]);
+ if (error)
+ printk(KERN_ERR "KGDB: breakpoint remove failed: %lx\n",
+- addr);
++ kgdb_break[i].bpt_addr);
+ setundefined:
+ kgdb_break[i].state = BP_UNDEFINED;
+ }
+diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c
+index 4742090..c3c8975 100644
+--- a/kernel/irq/migration.c
++++ b/kernel/irq/migration.c
+@@ -43,12 +43,16 @@ void irq_move_masked_irq(struct irq_data *idata)
+ * masking the irqs.
+ */
+ if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask)
+- < nr_cpu_ids))
+- if (!chip->irq_set_affinity(&desc->irq_data,
+- desc->pending_mask, false)) {
++ < nr_cpu_ids)) {
++ int ret = chip->irq_set_affinity(&desc->irq_data,
++ desc->pending_mask, false);
++ switch (ret) {
++ case IRQ_SET_MASK_OK:
+ cpumask_copy(desc->irq_data.affinity, desc->pending_mask);
++ case IRQ_SET_MASK_OK_NOCOPY:
+ irq_set_thread_affinity(desc);
+ }
++ }
+
+ cpumask_clear(desc->pending_mask);
+ }
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index ae27196..ea7ec7f 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -166,7 +166,7 @@ static int proc_taint(struct ctl_table *table, int write,
+ #endif
+
+ #ifdef CONFIG_PRINTK
+-static int proc_dmesg_restrict(struct ctl_table *table, int write,
++static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
+ void __user *buffer, size_t *lenp, loff_t *ppos);
+ #endif
+
+@@ -713,7 +713,7 @@ static struct ctl_table kern_table[] = {
+ .data = &dmesg_restrict,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = proc_dointvec_minmax,
++ .proc_handler = proc_dointvec_minmax_sysadmin,
+ .extra1 = &zero,
+ .extra2 = &one,
+ },
+@@ -722,7 +722,7 @@ static struct ctl_table kern_table[] = {
+ .data = &kptr_restrict,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+- .proc_handler = proc_dmesg_restrict,
++ .proc_handler = proc_dointvec_minmax_sysadmin,
+ .extra1 = &zero,
+ .extra2 = &two,
+ },
+@@ -2422,7 +2422,7 @@ static int proc_taint(struct ctl_table *table, int write,
+ }
+
+ #ifdef CONFIG_PRINTK
+-static int proc_dmesg_restrict(struct ctl_table *table, int write,
++static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,
+ void __user *buffer, size_t *lenp, loff_t *ppos)
+ {
+ if (write && !capable(CAP_SYS_ADMIN))
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index f2bd275..697e49d 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -1642,6 +1642,7 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu,
+ int cpu_file = iter->cpu_file;
+ u64 next_ts = 0, ts;
+ int next_cpu = -1;
++ int next_size = 0;
+ int cpu;
+
+ /*
+@@ -1673,9 +1674,12 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu,
+ next_cpu = cpu;
+ next_ts = ts;
+ next_lost = lost_events;
++ next_size = iter->ent_size;
+ }
+ }
+
++ iter->ent_size = next_size;
++
+ if (ent_cpu)
+ *ent_cpu = next_cpu;
+
+diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h
+index 9336590..205dcac 100644
+--- a/kernel/trace/trace_entries.h
++++ b/kernel/trace/trace_entries.h
+@@ -156,6 +156,12 @@ FTRACE_ENTRY_DUP(wakeup, ctx_switch_entry,
+
+ #define FTRACE_STACK_ENTRIES 8
+
++#ifndef CONFIG_64BIT
++# define IP_FMT "%08lx"
++#else
++# define IP_FMT "%016lx"
++#endif
++
+ FTRACE_ENTRY(kernel_stack, stack_entry,
+
+ TRACE_STACK,
+@@ -165,8 +171,9 @@ FTRACE_ENTRY(kernel_stack, stack_entry,
+ __dynamic_array(unsigned long, caller )
+ ),
+
+- F_printk("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n"
+- "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n",
++ F_printk("\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n"
++ "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n"
++ "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n",
+ __entry->caller[0], __entry->caller[1], __entry->caller[2],
+ __entry->caller[3], __entry->caller[4], __entry->caller[5],
+ __entry->caller[6], __entry->caller[7])
+@@ -181,8 +188,9 @@ FTRACE_ENTRY(user_stack, userstack_entry,
+ __array( unsigned long, caller, FTRACE_STACK_ENTRIES )
+ ),
+
+- F_printk("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n"
+- "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n",
++ F_printk("\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n"
++ "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n"
++ "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n",
+ __entry->caller[0], __entry->caller[1], __entry->caller[2],
+ __entry->caller[3], __entry->caller[4], __entry->caller[5],
+ __entry->caller[6], __entry->caller[7])
+diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c
+index bbeec31..ad4000c 100644
+--- a/kernel/trace/trace_export.c
++++ b/kernel/trace/trace_export.c
+@@ -150,7 +150,7 @@ ftrace_define_fields_##name(struct ftrace_event_call *event_call) \
+ #define __dynamic_array(type, item)
+
+ #undef F_printk
+-#define F_printk(fmt, args...) #fmt ", " __stringify(args)
++#define F_printk(fmt, args...) __stringify(fmt) ", " __stringify(args)
+
+ #undef FTRACE_ENTRY
+ #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print) \
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index c1c597e..98bfbd5 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -608,6 +608,10 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
+
+ if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
+ struct hci_cp_auth_requested cp;
++
++ /* encrypt must be pending if auth is also pending */
++ set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
++
+ cp.handle = cpu_to_le16(conn->handle);
+ hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
+ sizeof(cp), &cp);
+diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
+index 41c2310..aea1559 100644
+--- a/net/mac80211/agg-rx.c
++++ b/net/mac80211/agg-rx.c
+@@ -49,6 +49,8 @@ static void ieee80211_free_tid_rx(struct rcu_head *h)
+ container_of(h, struct tid_ampdu_rx, rcu_head);
+ int i;
+
++ del_timer_sync(&tid_rx->reorder_timer);
++
+ for (i = 0; i < tid_rx->buf_size; i++)
+ dev_kfree_skb(tid_rx->reorder_buf[i]);
+ kfree(tid_rx->reorder_buf);
+@@ -88,7 +90,6 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
+ tid, 0, reason);
+
+ del_timer_sync(&tid_rx->session_timer);
+- del_timer_sync(&tid_rx->reorder_timer);
+
+ call_rcu(&tid_rx->rcu_head, ieee80211_free_tid_rx);
+ }
+diff --git a/net/rose/rose_dev.c b/net/rose/rose_dev.c
+index 178ff4f..2679507 100644
+--- a/net/rose/rose_dev.c
++++ b/net/rose/rose_dev.c
+@@ -96,11 +96,11 @@ static int rose_set_mac_address(struct net_device *dev, void *addr)
+ struct sockaddr *sa = addr;
+ int err;
+
+- if (!memcpy(dev->dev_addr, sa->sa_data, dev->addr_len))
++ if (!memcmp(dev->dev_addr, sa->sa_data, dev->addr_len))
+ return 0;
+
+ if (dev->flags & IFF_UP) {
+- err = rose_add_loopback_node((rose_address *)dev->dev_addr);
++ err = rose_add_loopback_node((rose_address *)sa->sa_data);
+ if (err)
+ return err;
+
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
+index 2bd594e..619228d 100644
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -132,8 +132,10 @@ static struct module *new_module(char *modname)
+ /* strip trailing .o */
+ s = strrchr(p, '.');
+ if (s != NULL)
+- if (strcmp(s, ".o") == 0)
++ if (strcmp(s, ".o") == 0) {
+ *s = '\0';
++ mod->is_dot_o = 1;
++ }
+
+ /* add to list */
+ mod->name = p;
+@@ -587,7 +589,8 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
+ unsigned int crc;
+ enum export export;
+
+- if (!is_vmlinux(mod->name) && strncmp(symname, "__ksymtab", 9) == 0)
++ if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
++ strncmp(symname, "__ksymtab", 9) == 0)
+ export = export_from_secname(info, get_secindex(info, sym));
+ else
+ export = export_from_sec(info, get_secindex(info, sym));
+@@ -849,7 +852,7 @@ static void check_section(const char *modname, struct elf_info *elf,
+
+ #define ALL_INIT_DATA_SECTIONS \
+ ".init.setup$", ".init.rodata$", \
+- ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$" \
++ ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$", \
+ ".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
+ #define ALL_EXIT_DATA_SECTIONS \
+ ".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
+diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
+index 2031119..51207e4 100644
+--- a/scripts/mod/modpost.h
++++ b/scripts/mod/modpost.h
+@@ -113,6 +113,7 @@ struct module {
+ int has_cleanup;
+ struct buffer dev_table_buf;
+ char srcversion[25];
++ int is_dot_o;
+ };
+
+ struct elf_info {
+diff --git a/security/tomoyo/mount.c b/security/tomoyo/mount.c
+index bee09d0..fe00cdf 100644
+--- a/security/tomoyo/mount.c
++++ b/security/tomoyo/mount.c
+@@ -199,30 +199,32 @@ int tomoyo_mount_permission(char *dev_name, struct path *path,
+ if (flags & MS_REMOUNT) {
+ type = tomoyo_mounts[TOMOYO_MOUNT_REMOUNT];
+ flags &= ~MS_REMOUNT;
+- }
+- if (flags & MS_MOVE) {
+- type = tomoyo_mounts[TOMOYO_MOUNT_MOVE];
+- flags &= ~MS_MOVE;
+- }
+- if (flags & MS_BIND) {
++ } else if (flags & MS_BIND) {
+ type = tomoyo_mounts[TOMOYO_MOUNT_BIND];
+ flags &= ~MS_BIND;
+- }
+- if (flags & MS_UNBINDABLE) {
+- type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_UNBINDABLE];
+- flags &= ~MS_UNBINDABLE;
+- }
+- if (flags & MS_PRIVATE) {
++ } else if (flags & MS_SHARED) {
++ if (flags & (MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))
++ return -EINVAL;
++ type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_SHARED];
++ flags &= ~MS_SHARED;
++ } else if (flags & MS_PRIVATE) {
++ if (flags & (MS_SHARED | MS_SLAVE | MS_UNBINDABLE))
++ return -EINVAL;
+ type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_PRIVATE];
+ flags &= ~MS_PRIVATE;
+- }
+- if (flags & MS_SLAVE) {
++ } else if (flags & MS_SLAVE) {
++ if (flags & (MS_SHARED | MS_PRIVATE | MS_UNBINDABLE))
++ return -EINVAL;
+ type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_SLAVE];
+ flags &= ~MS_SLAVE;
+- }
+- if (flags & MS_SHARED) {
+- type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_SHARED];
+- flags &= ~MS_SHARED;
++ } else if (flags & MS_UNBINDABLE) {
++ if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE))
++ return -EINVAL;
++ type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_UNBINDABLE];
++ flags &= ~MS_UNBINDABLE;
++ } else if (flags & MS_MOVE) {
++ type = tomoyo_mounts[TOMOYO_MOUNT_MOVE];
++ flags &= ~MS_MOVE;
+ }
+ if (!type)
+ type = "<NULL>";
+diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c
+index 12c1bde..1c4999d 100644
+--- a/sound/soc/codecs/ak4642.c
++++ b/sound/soc/codecs/ak4642.c
+@@ -144,7 +144,7 @@
+ * min : 0xFE : -115.0 dB
+ * mute: 0xFF
+ */
+-static const DECLARE_TLV_DB_SCALE(out_tlv, -11500, 50, 1);
++static const DECLARE_TLV_DB_SCALE(out_tlv, -11550, 50, 1);
+
+ static const struct snd_kcontrol_new ak4642_snd_controls[] = {
+
+diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
+index 6e502af..2f1f5f8 100644
+--- a/sound/soc/codecs/wm8994.c
++++ b/sound/soc/codecs/wm8994.c
+@@ -3190,7 +3190,7 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
+ case 2:
+ case 3:
+ wm8994->hubs.dcs_codes_l = -9;
+- wm8994->hubs.dcs_codes_r = -5;
++ wm8994->hubs.dcs_codes_r = -7;
+ break;
+ default:
+ break;
diff --git a/3.2.14/4420_grsecurity-2.9-3.2.14-201204091728.patch b/3.2.15/4420_grsecurity-2.9-3.2.15-201204131715.patch
index a915736..81cf1c0 100644
--- a/3.2.14/4420_grsecurity-2.9-3.2.14-201204091728.patch
+++ b/3.2.15/4420_grsecurity-2.9-3.2.15-201204131715.patch
@@ -195,7 +195,7 @@ index 81c287f..d456d02 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index afe4c7d..2f909af 100644
+index 6195122..55e3055 100644
--- a/Makefile
+++ b/Makefile
@@ -245,8 +245,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -10243,7 +10243,7 @@ index 5478825..839e88c 100644
#define flush_insn_slot(p) do { } while (0)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
-index b4973f4..a42170a 100644
+index b4973f4..b647162 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -459,7 +459,7 @@ struct kvm_arch {
@@ -10276,15 +10276,6 @@ index b4973f4..a42170a 100644
u8 kvm_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn);
extern bool tdp_enabled;
-@@ -730,7 +730,7 @@ void kvm_get_cs_db_l_bits(struct kvm_vcpu *vcpu, int *db, int *l);
- int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr);
-
- int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata);
--int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data);
-+int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) __size_overflow(3);
-
- unsigned long kvm_get_rflags(struct kvm_vcpu *vcpu);
- void kvm_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags);
@@ -755,7 +755,7 @@ int fx_init(struct kvm_vcpu *vcpu);
void kvm_mmu_flush_tlb(struct kvm_vcpu *vcpu);
void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
@@ -13428,7 +13419,7 @@ index f98d84c..e402a69 100644
apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x(%02x)",
smp_processor_id(), v0 , v1);
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
-index a25e276..30645d7 100644
+index 6d939d7..0697fcc 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1096,7 +1096,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
@@ -17384,10 +17375,10 @@ index 90fcf62..e682cdd 100644
{
struct setup_data_node *node = file->private_data;
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
-index faba577..93b9e71 100644
+index 2f45c4c..d95504f 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
-@@ -124,11 +124,11 @@ char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs)
+@@ -126,11 +126,11 @@ char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs)
#ifdef CONFIG_X86_32
switch (regno) {
case GDB_SS:
@@ -17401,7 +17392,7 @@ index faba577..93b9e71 100644
*(unsigned long *)mem = kernel_stack_pointer(regs);
break;
case GDB_GS:
-@@ -473,12 +473,12 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,
+@@ -475,12 +475,12 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,
case 'k':
/* clear the trace bit */
linux_regs->flags &= ~X86_EFLAGS_TF;
@@ -17416,7 +17407,7 @@ index faba577..93b9e71 100644
raw_smp_processor_id());
}
-@@ -543,7 +543,7 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd)
+@@ -545,7 +545,7 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd)
switch (cmd) {
case DIE_DEBUG:
@@ -20163,7 +20154,7 @@ index 94a4672..1700ed1 100644
local_irq_disable();
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
-index 4ea7678..c715f2f 100644
+index 4ea7678..b3a7084 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -1305,7 +1305,11 @@ static void reload_tss(void)
@@ -20178,15 +20169,7 @@ index 4ea7678..c715f2f 100644
load_TR_desc();
}
-@@ -2163,6 +2167,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
- * Returns 0 on success, non-0 otherwise.
- * Assumes vcpu_load() was already called.
- */
-+static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) __size_overflow(3);
- static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
- {
- struct vcpu_vmx *vmx = to_vmx(vcpu);
-@@ -2633,8 +2638,11 @@ static __init int hardware_setup(void)
+@@ -2633,8 +2637,11 @@ static __init int hardware_setup(void)
if (!cpu_has_vmx_flexpriority())
flexpriority_enabled = 0;
@@ -20200,7 +20183,7 @@ index 4ea7678..c715f2f 100644
if (enable_ept && !cpu_has_vmx_ept_2m_page())
kvm_disable_largepages();
-@@ -3648,7 +3656,7 @@ static void vmx_set_constant_host_state(void)
+@@ -3648,7 +3655,7 @@ static void vmx_set_constant_host_state(void)
vmcs_writel(HOST_IDTR_BASE, dt.address); /* 22.2.4 */
asm("mov $.Lkvm_vmx_return, %0" : "=r"(tmpl));
@@ -20209,7 +20192,7 @@ index 4ea7678..c715f2f 100644
rdmsr(MSR_IA32_SYSENTER_CS, low32, high32);
vmcs_write32(HOST_IA32_SYSENTER_CS, low32);
-@@ -6169,6 +6177,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -6169,6 +6176,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
"jmp .Lkvm_vmx_return \n\t"
".Llaunched: " __ex(ASM_VMX_VMRESUME) "\n\t"
".Lkvm_vmx_return: "
@@ -20222,7 +20205,7 @@ index 4ea7678..c715f2f 100644
/* Save guest registers, load host registers, keep flags */
"mov %0, %c[wordsize](%%"R"sp) \n\t"
"pop %0 \n\t"
-@@ -6217,6 +6231,11 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -6217,6 +6230,11 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
#endif
[cr2]"i"(offsetof(struct vcpu_vmx, vcpu.arch.cr2)),
[wordsize]"i"(sizeof(ulong))
@@ -20234,7 +20217,7 @@ index 4ea7678..c715f2f 100644
: "cc", "memory"
, R"ax", R"bx", R"di", R"si"
#ifdef CONFIG_X86_64
-@@ -6245,7 +6264,16 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
+@@ -6245,7 +6263,16 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
}
}
@@ -25750,7 +25733,7 @@ index 6687022..ceabcfa 100644
+ pax_force_retaddr
ret
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
-index 5671752..6838cd1 100644
+index 5a5b6e4..201d42e 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -117,6 +117,10 @@ static inline void bpf_flush_icache(void *start, void *end)
@@ -29351,7 +29334,7 @@ index da3cfee..a5a6606 100644
*ppos = i;
diff --git a/drivers/char/random.c b/drivers/char/random.c
-index 6035ab8..bdfe4fd 100644
+index 6035ab8..d45e4d4 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -261,8 +261,13 @@
@@ -29404,6 +29387,25 @@ index 6035ab8..bdfe4fd 100644
static int max_write_thresh = INPUT_POOL_WORDS * 32;
static char sysctl_bootid[16];
+@@ -1250,10 +1262,15 @@ static int proc_do_uuid(ctl_table *table, int write,
+ uuid = table->data;
+ if (!uuid) {
+ uuid = tmp_uuid;
+- uuid[8] = 0;
+- }
+- if (uuid[8] == 0)
+ generate_random_uuid(uuid);
++ } else {
++ static DEFINE_SPINLOCK(bootid_spinlock);
++
++ spin_lock(&bootid_spinlock);
++ if (!uuid[8])
++ generate_random_uuid(uuid);
++ spin_unlock(&bootid_spinlock);
++ }
+
+ sprintf(buf, "%pU", uuid);
+
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
index 1ee8ce7..b778bef 100644
--- a/drivers/char/sonypi.c
@@ -30501,7 +30503,7 @@ index d47a53b..61154c2 100644
INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
INIT_WORK(&dev_priv->error_work, i915_error_work_func);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index 9ec9755..6d1cf2d 100644
+index 9011f48..00bf0d4 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2230,7 +2230,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
@@ -35196,7 +35198,7 @@ index 4a518a3..936b334 100644
#define VXGE_HW_VIRTUAL_PATH_HANDLE(vpath) \
((struct __vxge_hw_vpath_handle *)(vpath)->vpath_handles.next)
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
-index 0cf2351..56c4cef 100644
+index 697cae3..580b636 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -698,17 +698,17 @@ struct rtl8169_private {
@@ -37944,7 +37946,7 @@ index 6845228..df77141 100644
core_tmr_handle_tas_abort(tmr_nacl, cmd, tas, fe_count);
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
-index cdb774b..8753593 100644
+index 5660916..f6dab21 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1343,7 +1343,7 @@ struct se_device *transport_add_device_to_core_hba(
@@ -46892,10 +46894,10 @@ index 8392cb8..80d6193 100644
memcpy(c->data, &cookie, 4);
c->len=4;
diff --git a/fs/locks.c b/fs/locks.c
-index 637694b..f84a121 100644
+index 0d68f1f..f216b79 100644
--- a/fs/locks.c
+++ b/fs/locks.c
-@@ -2074,16 +2074,16 @@ void locks_remove_flock(struct file *filp)
+@@ -2075,16 +2075,16 @@ void locks_remove_flock(struct file *filp)
return;
if (filp->f_op && filp->f_op->flock) {
@@ -61091,10 +61093,10 @@ index 84ccf8e..2e9b14c 100644
};
diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 10b2288..09180e4 100644
+index 11f1951..e3c18da 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
-@@ -1609,7 +1609,8 @@ struct file_operations {
+@@ -1614,7 +1614,8 @@ struct file_operations {
int (*setlease)(struct file *, long, struct file_lock **);
long (*fallocate)(struct file *file, int mode, loff_t offset,
loff_t len);
@@ -62466,7 +62468,7 @@ index 3875719..4cd454c 100644
/* This macro allows us to keep printk typechecking */
static __printf(1, 2)
diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h
-index fa39183..40160be 100644
+index c4d2fc1..5df9c19 100644
--- a/include/linux/kgdb.h
+++ b/include/linux/kgdb.h
@@ -53,7 +53,7 @@ extern int kgdb_connected;
@@ -62478,7 +62480,7 @@ index fa39183..40160be 100644
extern struct task_struct *kgdb_usethread;
extern struct task_struct *kgdb_contthread;
-@@ -251,7 +251,7 @@ struct kgdb_arch {
+@@ -252,7 +252,7 @@ struct kgdb_arch {
void (*disable_hw_break)(struct pt_regs *regs);
void (*remove_all_hw_break)(void);
void (*correct_hw_break)(void);
@@ -62487,7 +62489,7 @@ index fa39183..40160be 100644
/**
* struct kgdb_io - Describe the interface for an I/O driver to talk with KGDB.
-@@ -276,7 +276,7 @@ struct kgdb_io {
+@@ -277,7 +277,7 @@ struct kgdb_io {
void (*pre_exception) (void);
void (*post_exception) (void);
int is_console;
@@ -65994,7 +65996,7 @@ index 42e8fa0..9e7406b 100644
return -ENOMEM;
diff --git a/kernel/cred.c b/kernel/cred.c
-index 5791612..a3c04dc 100644
+index 48c6fd3..3342f00 100644
--- a/kernel/cred.c
+++ b/kernel/cred.c
@@ -204,6 +204,15 @@ void exit_creds(struct task_struct *tsk)
@@ -66013,7 +66015,7 @@ index 5791612..a3c04dc 100644
}
/**
-@@ -470,7 +479,7 @@ error_put:
+@@ -472,7 +481,7 @@ error_put:
* Always returns 0 thus allowing this function to be tail-called at the end
* of, say, sys_setgid().
*/
@@ -66022,7 +66024,7 @@ index 5791612..a3c04dc 100644
{
struct task_struct *task = current;
const struct cred *old = task->real_cred;
-@@ -489,6 +498,8 @@ int commit_creds(struct cred *new)
+@@ -491,6 +500,8 @@ int commit_creds(struct cred *new)
get_cred(new); /* we will require a ref for the subj creds too */
@@ -66031,7 +66033,7 @@ index 5791612..a3c04dc 100644
/* dumpability changes */
if (old->euid != new->euid ||
old->egid != new->egid ||
-@@ -538,6 +549,92 @@ int commit_creds(struct cred *new)
+@@ -540,6 +551,92 @@ int commit_creds(struct cred *new)
put_cred(old);
return 0;
}
@@ -66125,7 +66127,7 @@ index 5791612..a3c04dc 100644
/**
diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c
-index 0d7c087..01b8cef 100644
+index 7fda904..59f620c 100644
--- a/kernel/debug/debug_core.c
+++ b/kernel/debug/debug_core.c
@@ -119,7 +119,7 @@ static DEFINE_RAW_SPINLOCK(dbg_slave_lock);
@@ -66146,7 +66148,7 @@ index 0d7c087..01b8cef 100644
/*
* If you are debugging a problem where roundup (the collection of
-@@ -542,7 +542,7 @@ return_normal:
+@@ -537,7 +537,7 @@ return_normal:
* kernel will only try for the value of sstep_tries before
* giving up and continuing on.
*/
@@ -66155,7 +66157,7 @@ index 0d7c087..01b8cef 100644
(kgdb_info[cpu].task &&
kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) {
atomic_set(&kgdb_active, -1);
-@@ -636,8 +636,8 @@ cpu_master_loop:
+@@ -631,8 +631,8 @@ cpu_master_loop:
}
kgdb_restore:
@@ -66166,7 +66168,7 @@ index 0d7c087..01b8cef 100644
if (kgdb_info[sstep_cpu].task)
kgdb_sstep_pid = kgdb_info[sstep_cpu].task->pid;
else
-@@ -834,18 +834,18 @@ static void kgdb_unregister_callbacks(void)
+@@ -829,18 +829,18 @@ static void kgdb_unregister_callbacks(void)
static void kgdb_tasklet_bpt(unsigned long ing)
{
kgdb_breakpoint();
@@ -68059,7 +68061,7 @@ index b452599..5d68f4e 100644
atomic_set(&pd->refcnt, 0);
pd->pinst = pinst;
diff --git a/kernel/panic.c b/kernel/panic.c
-index 3458469..342c500 100644
+index 3458469..3492363 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
@@ -78,7 +78,11 @@ NORET_TYPE void panic(const char * fmt, ...)
@@ -68070,7 +68072,7 @@ index 3458469..342c500 100644
+ /*
+ * Avoid nested stack-dumping if a panic occurs during oops processing
+ */
-+ if (!oops_in_progress)
++ if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)
+ dump_stack();
#endif
@@ -69553,7 +69555,7 @@ index 481611f..0754d86 100644
break;
}
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
-index ae27196..7506d69 100644
+index ea7ec7f..57501f0 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -86,6 +86,13 @@
@@ -69641,7 +69643,7 @@ index ae27196..7506d69 100644
.data = &kptr_restrict,
.maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = proc_dmesg_restrict,
+ .proc_handler = proc_dointvec_minmax_sysadmin,
+#ifdef CONFIG_GRKERNSEC_HIDESYM
+ .extra1 = &two,
+#else
@@ -70109,10 +70111,10 @@ index 25b4f4d..6f4772d 100644
struct ftrace_func_probe *entry;
struct ftrace_page *pg;
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index f2bd275..adaf3a2 100644
+index 697e49d..7f77a66 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
-@@ -4201,10 +4201,9 @@ static const struct file_operations tracing_dyn_info_fops = {
+@@ -4205,10 +4205,9 @@ static const struct file_operations tracing_dyn_info_fops = {
};
#endif
@@ -70124,7 +70126,7 @@ index f2bd275..adaf3a2 100644
static int once;
if (d_tracer)
-@@ -4224,10 +4223,9 @@ struct dentry *tracing_init_dentry(void)
+@@ -4228,10 +4227,9 @@ struct dentry *tracing_init_dentry(void)
return d_tracer;
}
@@ -75114,7 +75116,7 @@ index 07d1c1d..7e9bea9 100644
frag2->seqno = htons(seqno);
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
-index c1c597e..05ebb40 100644
+index 98bfbd5..47ccdd6 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -234,7 +234,7 @@ void hci_le_ltk_reply(struct hci_conn *conn, u8 ltk[16])
@@ -79045,19 +79047,10 @@ index f936d1f..a66d95f 100644
sprintf(alias, "dmi*");
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
-index 2bd594e..faa7615 100644
+index 619228d..274ce0e 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
-@@ -849,7 +849,7 @@ static void check_section(const char *modname, struct elf_info *elf,
-
- #define ALL_INIT_DATA_SECTIONS \
- ".init.setup$", ".init.rodata$", \
-- ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$" \
-+ ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$", \
- ".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
- #define ALL_EXIT_DATA_SECTIONS \
- ".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
-@@ -919,6 +919,7 @@ enum mismatch {
+@@ -922,6 +922,7 @@ enum mismatch {
ANY_INIT_TO_ANY_EXIT,
ANY_EXIT_TO_ANY_INIT,
EXPORT_TO_INIT_EXIT,
@@ -79065,7 +79058,7 @@ index 2bd594e..faa7615 100644
};
struct sectioncheck {
-@@ -1027,6 +1028,12 @@ const struct sectioncheck sectioncheck[] = {
+@@ -1030,6 +1031,12 @@ const struct sectioncheck sectioncheck[] = {
.tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
.mismatch = EXPORT_TO_INIT_EXIT,
.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
@@ -79078,7 +79071,7 @@ index 2bd594e..faa7615 100644
}
};
-@@ -1149,10 +1156,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
+@@ -1152,10 +1159,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
continue;
if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
continue;
@@ -79091,7 +79084,7 @@ index 2bd594e..faa7615 100644
if (d < 0)
d = addr - sym->st_value;
if (d < distance) {
-@@ -1431,6 +1438,14 @@ static void report_sec_mismatch(const char *modname,
+@@ -1434,6 +1441,14 @@ static void report_sec_mismatch(const char *modname,
tosym, prl_to, prl_to, tosym);
free(prl_to);
break;
@@ -79106,7 +79099,7 @@ index 2bd594e..faa7615 100644
}
fprintf(stderr, "\n");
}
-@@ -1656,7 +1671,7 @@ static void section_rel(const char *modname, struct elf_info *elf,
+@@ -1659,7 +1674,7 @@ static void section_rel(const char *modname, struct elf_info *elf,
static void check_sec_ref(struct module *mod, const char *modname,
struct elf_info *elf)
{
@@ -79115,7 +79108,7 @@ index 2bd594e..faa7615 100644
Elf_Shdr *sechdrs = elf->sechdrs;
/* Walk through all sections */
-@@ -1754,7 +1769,7 @@ void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
+@@ -1757,7 +1772,7 @@ void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
va_end(ap);
}
@@ -79124,7 +79117,7 @@ index 2bd594e..faa7615 100644
{
if (buf->size - buf->pos < len) {
buf->size += len + SZ;
-@@ -1972,7 +1987,7 @@ static void write_if_changed(struct buffer *b, const char *fname)
+@@ -1975,7 +1990,7 @@ static void write_if_changed(struct buffer *b, const char *fname)
if (fstat(fileno(file), &st) < 0)
goto close_write;
@@ -79134,7 +79127,7 @@ index 2bd594e..faa7615 100644
tmp = NOFAIL(malloc(b->pos));
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
-index 2031119..b5433af 100644
+index 51207e4..f7d603d 100644
--- a/scripts/mod/modpost.h
+++ b/scripts/mod/modpost.h
@@ -92,15 +92,15 @@ void *do_nofail(void *ptr, const char *expr);
diff --git a/3.2.14/4430_grsec-remove-localversion-grsec.patch b/3.2.15/4430_grsec-remove-localversion-grsec.patch
index 31cf878..31cf878 100644
--- a/3.2.14/4430_grsec-remove-localversion-grsec.patch
+++ b/3.2.15/4430_grsec-remove-localversion-grsec.patch
diff --git a/3.2.14/4435_grsec-mute-warnings.patch b/3.2.15/4435_grsec-mute-warnings.patch
index e85abd6..e85abd6 100644
--- a/3.2.14/4435_grsec-mute-warnings.patch
+++ b/3.2.15/4435_grsec-mute-warnings.patch
diff --git a/3.2.14/4440_grsec-remove-protected-paths.patch b/3.2.15/4440_grsec-remove-protected-paths.patch
index 637934a..637934a 100644
--- a/3.2.14/4440_grsec-remove-protected-paths.patch
+++ b/3.2.15/4440_grsec-remove-protected-paths.patch
diff --git a/3.2.14/4445_grsec-pax-without-grsec.patch b/3.2.15/4445_grsec-pax-without-grsec.patch
index 58301c0..58301c0 100644
--- a/3.2.14/4445_grsec-pax-without-grsec.patch
+++ b/3.2.15/4445_grsec-pax-without-grsec.patch
diff --git a/3.2.14/4450_grsec-kconfig-default-gids.patch b/3.2.15/4450_grsec-kconfig-default-gids.patch
index 123f877..123f877 100644
--- a/3.2.14/4450_grsec-kconfig-default-gids.patch
+++ b/3.2.15/4450_grsec-kconfig-default-gids.patch
diff --git a/3.2.14/4455_grsec-kconfig-gentoo.patch b/3.2.15/4455_grsec-kconfig-gentoo.patch
index 2527bad..2527bad 100644
--- a/3.2.14/4455_grsec-kconfig-gentoo.patch
+++ b/3.2.15/4455_grsec-kconfig-gentoo.patch
diff --git a/3.2.14/4460-grsec-kconfig-proc-user.patch b/3.2.15/4460-grsec-kconfig-proc-user.patch
index b2b3188..b2b3188 100644
--- a/3.2.14/4460-grsec-kconfig-proc-user.patch
+++ b/3.2.15/4460-grsec-kconfig-proc-user.patch
diff --git a/3.2.14/4465_selinux-avc_audit-log-curr_ip.patch b/3.2.15/4465_selinux-avc_audit-log-curr_ip.patch
index 5a9d80c..5a9d80c 100644
--- a/3.2.14/4465_selinux-avc_audit-log-curr_ip.patch
+++ b/3.2.15/4465_selinux-avc_audit-log-curr_ip.patch
diff --git a/3.2.14/4470_disable-compat_vdso.patch b/3.2.15/4470_disable-compat_vdso.patch
index 4742d01..4742d01 100644
--- a/3.2.14/4470_disable-compat_vdso.patch
+++ b/3.2.15/4470_disable-compat_vdso.patch
diff --git a/3.3.1/0000_README b/3.3.2/0000_README
index 7b3630b..6f6bc4c 100644
--- a/3.3.1/0000_README
+++ b/3.3.2/0000_README
@@ -2,7 +2,7 @@ README
-----------------------------------------------------------------------------
Individual Patch Descriptions:
-----------------------------------------------------------------------------
-Patch: 4420_grsecurity-2.9-3.3.1-201204091729.patch
+Patch: 4420_grsecurity-2.9-3.3.2-201204131715.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.3.1/4420_grsecurity-2.9-3.3.1-201204091729.patch b/3.3.2/4420_grsecurity-2.9-3.3.2-201204131715.patch
index 50d2854..ab58d80 100644
--- a/3.3.1/4420_grsecurity-2.9-3.3.1-201204091729.patch
+++ b/3.3.2/4420_grsecurity-2.9-3.3.2-201204131715.patch
@@ -195,7 +195,7 @@ index d99fd9c..8689fef 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index 026a227..990f035 100644
+index ddcb70a..32da20d 100644
--- a/Makefile
+++ b/Makefile
@@ -245,8 +245,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -13394,7 +13394,7 @@ index 2eec05b..fef012b 100644
apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x(%02x)",
smp_processor_id(), v0 , v1);
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
-index 6d10a66..f4687b8 100644
+index fb07275..e06bb59 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1096,7 +1096,7 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin,
@@ -17368,10 +17368,10 @@ index 90fcf62..e682cdd 100644
{
struct setup_data_node *node = file->private_data;
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c
-index faba577..93b9e71 100644
+index 2f45c4c..d95504f 100644
--- a/arch/x86/kernel/kgdb.c
+++ b/arch/x86/kernel/kgdb.c
-@@ -124,11 +124,11 @@ char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs)
+@@ -126,11 +126,11 @@ char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs)
#ifdef CONFIG_X86_32
switch (regno) {
case GDB_SS:
@@ -17385,7 +17385,7 @@ index faba577..93b9e71 100644
*(unsigned long *)mem = kernel_stack_pointer(regs);
break;
case GDB_GS:
-@@ -473,12 +473,12 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,
+@@ -475,12 +475,12 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,
case 'k':
/* clear the trace bit */
linux_regs->flags &= ~X86_EFLAGS_TF;
@@ -17400,7 +17400,7 @@ index faba577..93b9e71 100644
raw_smp_processor_id());
}
-@@ -543,7 +543,7 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd)
+@@ -545,7 +545,7 @@ static int __kgdb_notify(struct die_args *args, unsigned long cmd)
switch (cmd) {
case DIE_DEBUG:
@@ -25667,7 +25667,7 @@ index 6687022..ceabcfa 100644
+ pax_force_retaddr
ret
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
-index 5671752..6838cd1 100644
+index 5a5b6e4..201d42e 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -117,6 +117,10 @@ static inline void bpf_flush_icache(void *start, void *end)
@@ -29301,7 +29301,7 @@ index da3cfee..a5a6606 100644
*ppos = i;
diff --git a/drivers/char/random.c b/drivers/char/random.c
-index 54ca8b2..d58cb51 100644
+index 54ca8b2..4a092ed 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -261,8 +261,13 @@
@@ -29354,6 +29354,25 @@ index 54ca8b2..d58cb51 100644
static int max_write_thresh = INPUT_POOL_WORDS * 32;
static char sysctl_bootid[16];
+@@ -1260,10 +1272,15 @@ static int proc_do_uuid(ctl_table *table, int write,
+ uuid = table->data;
+ if (!uuid) {
+ uuid = tmp_uuid;
+- uuid[8] = 0;
+- }
+- if (uuid[8] == 0)
+ generate_random_uuid(uuid);
++ } else {
++ static DEFINE_SPINLOCK(bootid_spinlock);
++
++ spin_lock(&bootid_spinlock);
++ if (!uuid[8])
++ generate_random_uuid(uuid);
++ spin_unlock(&bootid_spinlock);
++ }
+
+ sprintf(buf, "%pU", uuid);
+
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
index 1ee8ce7..b778bef 100644
--- a/drivers/char/sonypi.c
@@ -30346,7 +30365,7 @@ index 5bd4361..0241a42 100644
INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
INIT_WORK(&dev_priv->error_work, i915_error_work_func);
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index 397087c..9178d0d 100644
+index 2163818..e536c3d 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2238,7 +2238,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
@@ -34529,7 +34548,7 @@ index 6ebdc40..9edf5d8 100644
.vendor = PCI_VENDOR_ID_RICOH,
.device = PCI_DEVICE_ID_RICOH_R5C822,
diff --git a/drivers/mtd/devices/doc2000.c b/drivers/mtd/devices/doc2000.c
-index b1cdf64..ce6e438 100644
+index 87a431c..4959b43 100644
--- a/drivers/mtd/devices/doc2000.c
+++ b/drivers/mtd/devices/doc2000.c
@@ -764,7 +764,7 @@ static int doc_write(struct mtd_info *mtd, loff_t to, size_t len,
@@ -34542,7 +34561,7 @@ index b1cdf64..ce6e438 100644
"ECC needs a full sector write (adr: %lx size %lx)\n",
(long) to, (long) len);
diff --git a/drivers/mtd/devices/doc2001.c b/drivers/mtd/devices/doc2001.c
-index 7543b98..7069947 100644
+index 9eacf67..4534b5b 100644
--- a/drivers/mtd/devices/doc2001.c
+++ b/drivers/mtd/devices/doc2001.c
@@ -384,7 +384,7 @@ static int doc_read (struct mtd_info *mtd, loff_t from, size_t len,
@@ -35731,10 +35750,10 @@ index af00e2c..ab04d34 100644
struct brcms_phy {
struct brcms_phy_pub pubpi_ro;
diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c
-index a7dfba8..e28eacd 100644
+index a2ec369..36fdf14 100644
--- a/drivers/net/wireless/iwlegacy/3945-mac.c
+++ b/drivers/net/wireless/iwlegacy/3945-mac.c
-@@ -3647,7 +3647,9 @@ il3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+@@ -3646,7 +3646,9 @@ il3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
*/
if (il3945_mod_params.disable_hw_scan) {
D_INFO("Disabling hw_scan\n");
@@ -46582,10 +46601,10 @@ index 8392cb8..80d6193 100644
memcpy(c->data, &cookie, 4);
c->len=4;
diff --git a/fs/locks.c b/fs/locks.c
-index 637694b..f84a121 100644
+index 0d68f1f..f216b79 100644
--- a/fs/locks.c
+++ b/fs/locks.c
-@@ -2074,16 +2074,16 @@ void locks_remove_flock(struct file *filp)
+@@ -2075,16 +2075,16 @@ void locks_remove_flock(struct file *filp)
return;
if (filp->f_op && filp->f_op->flock) {
@@ -60704,10 +60723,10 @@ index 84ccf8e..2e9b14c 100644
};
diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 69cd5bb..58425c2 100644
+index f4b6e06..d6ba573 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
-@@ -1623,7 +1623,8 @@ struct file_operations {
+@@ -1628,7 +1628,8 @@ struct file_operations {
int (*setlease)(struct file *, long, struct file_lock **);
long (*fallocate)(struct file *file, int mode, loff_t offset,
loff_t len);
@@ -62103,7 +62122,7 @@ index 3875719..4cd454c 100644
/* This macro allows us to keep printk typechecking */
static __printf(1, 2)
diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h
-index fa39183..40160be 100644
+index c4d2fc1..5df9c19 100644
--- a/include/linux/kgdb.h
+++ b/include/linux/kgdb.h
@@ -53,7 +53,7 @@ extern int kgdb_connected;
@@ -62115,7 +62134,7 @@ index fa39183..40160be 100644
extern struct task_struct *kgdb_usethread;
extern struct task_struct *kgdb_contthread;
-@@ -251,7 +251,7 @@ struct kgdb_arch {
+@@ -252,7 +252,7 @@ struct kgdb_arch {
void (*disable_hw_break)(struct pt_regs *regs);
void (*remove_all_hw_break)(void);
void (*correct_hw_break)(void);
@@ -62124,7 +62143,7 @@ index fa39183..40160be 100644
/**
* struct kgdb_io - Describe the interface for an I/O driver to talk with KGDB.
-@@ -276,7 +276,7 @@ struct kgdb_io {
+@@ -277,7 +277,7 @@ struct kgdb_io {
void (*pre_exception) (void);
void (*post_exception) (void);
int is_console;
@@ -62134,7 +62153,7 @@ index fa39183..40160be 100644
extern struct kgdb_arch arch_kgdb_ops;
diff --git a/include/linux/kmod.h b/include/linux/kmod.h
-index 722f477..eef2a27 100644
+index 0fb48ef..1b680b2 100644
--- a/include/linux/kmod.h
+++ b/include/linux/kmod.h
@@ -34,6 +34,8 @@ extern char modprobe_path[]; /* for sysctl */
@@ -65615,7 +65634,7 @@ index 42e8fa0..9e7406b 100644
return -ENOMEM;
diff --git a/kernel/cred.c b/kernel/cred.c
-index 5791612..a3c04dc 100644
+index 48c6fd3..3342f00 100644
--- a/kernel/cred.c
+++ b/kernel/cred.c
@@ -204,6 +204,15 @@ void exit_creds(struct task_struct *tsk)
@@ -65634,7 +65653,7 @@ index 5791612..a3c04dc 100644
}
/**
-@@ -470,7 +479,7 @@ error_put:
+@@ -472,7 +481,7 @@ error_put:
* Always returns 0 thus allowing this function to be tail-called at the end
* of, say, sys_setgid().
*/
@@ -65643,7 +65662,7 @@ index 5791612..a3c04dc 100644
{
struct task_struct *task = current;
const struct cred *old = task->real_cred;
-@@ -489,6 +498,8 @@ int commit_creds(struct cred *new)
+@@ -491,6 +500,8 @@ int commit_creds(struct cred *new)
get_cred(new); /* we will require a ref for the subj creds too */
@@ -65652,7 +65671,7 @@ index 5791612..a3c04dc 100644
/* dumpability changes */
if (old->euid != new->euid ||
old->egid != new->egid ||
-@@ -538,6 +549,92 @@ int commit_creds(struct cred *new)
+@@ -540,6 +551,92 @@ int commit_creds(struct cred *new)
put_cred(old);
return 0;
}
@@ -65746,7 +65765,7 @@ index 5791612..a3c04dc 100644
/**
diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c
-index 0d7c087..01b8cef 100644
+index 7fda904..59f620c 100644
--- a/kernel/debug/debug_core.c
+++ b/kernel/debug/debug_core.c
@@ -119,7 +119,7 @@ static DEFINE_RAW_SPINLOCK(dbg_slave_lock);
@@ -65767,7 +65786,7 @@ index 0d7c087..01b8cef 100644
/*
* If you are debugging a problem where roundup (the collection of
-@@ -542,7 +542,7 @@ return_normal:
+@@ -537,7 +537,7 @@ return_normal:
* kernel will only try for the value of sstep_tries before
* giving up and continuing on.
*/
@@ -65776,7 +65795,7 @@ index 0d7c087..01b8cef 100644
(kgdb_info[cpu].task &&
kgdb_info[cpu].task->pid != kgdb_sstep_pid) && --sstep_tries) {
atomic_set(&kgdb_active, -1);
-@@ -636,8 +636,8 @@ cpu_master_loop:
+@@ -631,8 +631,8 @@ cpu_master_loop:
}
kgdb_restore:
@@ -65787,7 +65806,7 @@ index 0d7c087..01b8cef 100644
if (kgdb_info[sstep_cpu].task)
kgdb_sstep_pid = kgdb_info[sstep_cpu].task->pid;
else
-@@ -834,18 +834,18 @@ static void kgdb_unregister_callbacks(void)
+@@ -829,18 +829,18 @@ static void kgdb_unregister_callbacks(void)
static void kgdb_tasklet_bpt(unsigned long ing)
{
kgdb_breakpoint();
@@ -66594,7 +66613,7 @@ index 7b08867..3bac516 100644
/* Don't allow clients that don't understand the native
diff --git a/kernel/kmod.c b/kernel/kmod.c
-index a0a8854..642b106 100644
+index a3a46cb..f2e42f8 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -75,13 +75,12 @@ char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe";
@@ -67672,9 +67691,18 @@ index b452599..5d68f4e 100644
atomic_set(&pd->refcnt, 0);
pd->pinst = pinst;
diff --git a/kernel/panic.c b/kernel/panic.c
-index 80aed44..f291d37 100644
+index 80aed44..e83856a 100644
--- a/kernel/panic.c
+++ b/kernel/panic.c
+@@ -97,7 +97,7 @@ void panic(const char *fmt, ...)
+ /*
+ * Avoid nested stack-dumping if a panic occurs during oops processing
+ */
+- if (!oops_in_progress)
++ if (!test_taint(TAINT_DIE) && oops_in_progress <= 1)
+ dump_stack();
+ #endif
+
@@ -402,7 +402,7 @@ static void warn_slowpath_common(const char *file, int line, void *caller,
const char *board;
@@ -67891,10 +67919,10 @@ index d523593..68197a4 100644
register_sysrq_key('o', &sysrq_poweroff_op);
return 0;
diff --git a/kernel/power/process.c b/kernel/power/process.c
-index 7e42645..3d43df1 100644
+index 7aac07a..2d3c6dc 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
-@@ -32,6 +32,7 @@ static int try_to_freeze_tasks(bool user_only)
+@@ -33,6 +33,7 @@ static int try_to_freeze_tasks(bool user_only)
u64 elapsed_csecs64;
unsigned int elapsed_csecs;
bool wakeup = false;
@@ -67902,7 +67930,7 @@ index 7e42645..3d43df1 100644
do_gettimeofday(&start);
-@@ -42,6 +43,8 @@ static int try_to_freeze_tasks(bool user_only)
+@@ -43,6 +44,8 @@ static int try_to_freeze_tasks(bool user_only)
while (true) {
todo = 0;
@@ -67911,7 +67939,7 @@ index 7e42645..3d43df1 100644
read_lock(&tasklist_lock);
do_each_thread(g, p) {
if (p == current || !freeze_task(p))
-@@ -59,9 +62,13 @@ static int try_to_freeze_tasks(bool user_only)
+@@ -60,9 +63,13 @@ static int try_to_freeze_tasks(bool user_only)
* try_to_stop() after schedule() in ptrace/signal
* stop sees TIF_FREEZE.
*/
@@ -67927,7 +67955,7 @@ index 7e42645..3d43df1 100644
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
-@@ -70,7 +77,7 @@ static int try_to_freeze_tasks(bool user_only)
+@@ -71,7 +78,7 @@ static int try_to_freeze_tasks(bool user_only)
todo += wq_busy;
}
@@ -69112,7 +69140,7 @@ index 888d227..f04b318 100644
break;
}
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
-index f487f25..9056a9e 100644
+index f03a6ef..5fcc8af 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -86,6 +86,13 @@
@@ -69200,7 +69228,7 @@ index f487f25..9056a9e 100644
.data = &kptr_restrict,
.maxlen = sizeof(int),
.mode = 0644,
- .proc_handler = proc_dmesg_restrict,
+ .proc_handler = proc_dointvec_minmax_sysadmin,
+#ifdef CONFIG_GRKERNSEC_HIDESYM
+ .extra1 = &two,
+#else
@@ -69668,10 +69696,10 @@ index 683d559..d70d914 100644
struct ftrace_func_probe *entry;
struct ftrace_page *pg;
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index a3f1bc5..5e651718 100644
+index c4579f1..6a439da 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
-@@ -4254,10 +4254,9 @@ static const struct file_operations tracing_dyn_info_fops = {
+@@ -4258,10 +4258,9 @@ static const struct file_operations tracing_dyn_info_fops = {
};
#endif
@@ -69683,7 +69711,7 @@ index a3f1bc5..5e651718 100644
static int once;
if (d_tracer)
-@@ -4277,10 +4276,9 @@ struct dentry *tracing_init_dentry(void)
+@@ -4281,10 +4280,9 @@ struct dentry *tracing_init_dentry(void)
return d_tracer;
}
@@ -78481,19 +78509,10 @@ index b89efe6..2c30808 100644
sprintf(alias, "dmi*");
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
-index 9adb667..dda7076 100644
+index c4e7d15..4241aef 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
-@@ -849,7 +849,7 @@ static void check_section(const char *modname, struct elf_info *elf,
-
- #define ALL_INIT_DATA_SECTIONS \
- ".init.setup$", ".init.rodata$", \
-- ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$" \
-+ ".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$", \
- ".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
- #define ALL_EXIT_DATA_SECTIONS \
- ".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
-@@ -919,6 +919,7 @@ enum mismatch {
+@@ -922,6 +922,7 @@ enum mismatch {
ANY_INIT_TO_ANY_EXIT,
ANY_EXIT_TO_ANY_INIT,
EXPORT_TO_INIT_EXIT,
@@ -78501,7 +78520,7 @@ index 9adb667..dda7076 100644
};
struct sectioncheck {
-@@ -1027,6 +1028,12 @@ const struct sectioncheck sectioncheck[] = {
+@@ -1030,6 +1031,12 @@ const struct sectioncheck sectioncheck[] = {
.tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL },
.mismatch = EXPORT_TO_INIT_EXIT,
.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
@@ -78514,7 +78533,7 @@ index 9adb667..dda7076 100644
}
};
-@@ -1149,10 +1156,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
+@@ -1152,10 +1159,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
continue;
if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
continue;
@@ -78527,7 +78546,7 @@ index 9adb667..dda7076 100644
if (d < 0)
d = addr - sym->st_value;
if (d < distance) {
-@@ -1431,6 +1438,14 @@ static void report_sec_mismatch(const char *modname,
+@@ -1434,6 +1441,14 @@ static void report_sec_mismatch(const char *modname,
tosym, prl_to, prl_to, tosym);
free(prl_to);
break;
@@ -78542,7 +78561,7 @@ index 9adb667..dda7076 100644
}
fprintf(stderr, "\n");
}
-@@ -1665,7 +1680,7 @@ static void section_rel(const char *modname, struct elf_info *elf,
+@@ -1668,7 +1683,7 @@ static void section_rel(const char *modname, struct elf_info *elf,
static void check_sec_ref(struct module *mod, const char *modname,
struct elf_info *elf)
{
@@ -78551,7 +78570,7 @@ index 9adb667..dda7076 100644
Elf_Shdr *sechdrs = elf->sechdrs;
/* Walk through all sections */
-@@ -1763,7 +1778,7 @@ void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
+@@ -1766,7 +1781,7 @@ void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf,
va_end(ap);
}
@@ -78560,7 +78579,7 @@ index 9adb667..dda7076 100644
{
if (buf->size - buf->pos < len) {
buf->size += len + SZ;
-@@ -1981,7 +1996,7 @@ static void write_if_changed(struct buffer *b, const char *fname)
+@@ -1984,7 +1999,7 @@ static void write_if_changed(struct buffer *b, const char *fname)
if (fstat(fileno(file), &st) < 0)
goto close_write;
@@ -78570,7 +78589,7 @@ index 9adb667..dda7076 100644
tmp = NOFAIL(malloc(b->pos));
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
-index 2031119..b5433af 100644
+index 51207e4..f7d603d 100644
--- a/scripts/mod/modpost.h
+++ b/scripts/mod/modpost.h
@@ -92,15 +92,15 @@ void *do_nofail(void *ptr, const char *expr);
diff --git a/3.3.1/4430_grsec-remove-localversion-grsec.patch b/3.3.2/4430_grsec-remove-localversion-grsec.patch
index 31cf878..31cf878 100644
--- a/3.3.1/4430_grsec-remove-localversion-grsec.patch
+++ b/3.3.2/4430_grsec-remove-localversion-grsec.patch
diff --git a/3.3.1/4435_grsec-mute-warnings.patch b/3.3.2/4435_grsec-mute-warnings.patch
index e85abd6..e85abd6 100644
--- a/3.3.1/4435_grsec-mute-warnings.patch
+++ b/3.3.2/4435_grsec-mute-warnings.patch
diff --git a/3.3.1/4440_grsec-remove-protected-paths.patch b/3.3.2/4440_grsec-remove-protected-paths.patch
index 637934a..637934a 100644
--- a/3.3.1/4440_grsec-remove-protected-paths.patch
+++ b/3.3.2/4440_grsec-remove-protected-paths.patch
diff --git a/3.3.1/4445_grsec-pax-without-grsec.patch b/3.3.2/4445_grsec-pax-without-grsec.patch
index 35255c2..35255c2 100644
--- a/3.3.1/4445_grsec-pax-without-grsec.patch
+++ b/3.3.2/4445_grsec-pax-without-grsec.patch
diff --git a/3.3.1/4450_grsec-kconfig-default-gids.patch b/3.3.2/4450_grsec-kconfig-default-gids.patch
index 123f877..123f877 100644
--- a/3.3.1/4450_grsec-kconfig-default-gids.patch
+++ b/3.3.2/4450_grsec-kconfig-default-gids.patch
diff --git a/3.3.1/4455_grsec-kconfig-gentoo.patch b/3.3.2/4455_grsec-kconfig-gentoo.patch
index ef59341..ef59341 100644
--- a/3.3.1/4455_grsec-kconfig-gentoo.patch
+++ b/3.3.2/4455_grsec-kconfig-gentoo.patch
diff --git a/3.3.1/4460-grsec-kconfig-proc-user.patch b/3.3.2/4460-grsec-kconfig-proc-user.patch
index b2b3188..b2b3188 100644
--- a/3.3.1/4460-grsec-kconfig-proc-user.patch
+++ b/3.3.2/4460-grsec-kconfig-proc-user.patch
diff --git a/3.3.1/4465_selinux-avc_audit-log-curr_ip.patch b/3.3.2/4465_selinux-avc_audit-log-curr_ip.patch
index 5a9d80c..5a9d80c 100644
--- a/3.3.1/4465_selinux-avc_audit-log-curr_ip.patch
+++ b/3.3.2/4465_selinux-avc_audit-log-curr_ip.patch
diff --git a/3.3.1/4470_disable-compat_vdso.patch b/3.3.2/4470_disable-compat_vdso.patch
index c40f44f..c40f44f 100644
--- a/3.3.1/4470_disable-compat_vdso.patch
+++ b/3.3.2/4470_disable-compat_vdso.patch