diff options
author | Anthony G. Basile <blueness@gentoo.org> | 2012-04-15 21:27:48 -0400 |
---|---|---|
committer | Anthony G. Basile <blueness@gentoo.org> | 2012-04-15 21:27:48 -0400 |
commit | f00b97377fe058dfc52e661fd9681339aed4abac (patch) | |
tree | 9533751d461b6ec31699777204e509ca0c71931a | |
parent | Grsec/PaX: 2.9-{2.6.32.59,3.2.14,3.3.1}-201204081846 (diff) | |
download | hardened-patchset-f00b97377fe058dfc52e661fd9681339aed4abac.tar.gz hardened-patchset-f00b97377fe058dfc52e661fd9681339aed4abac.tar.bz2 hardened-patchset-f00b97377fe058dfc52e661fd9681339aed4abac.zip |
Grsec/PaX: 2.9-{2.6.32.59,3.2.15,3.3.2}-20120413171520120413
-rw-r--r-- | 2.6.32/0000_README | 2 | ||||
-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.patch | 2169 | ||||
-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 |