summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2013-02-16 14:27:53 -0500
committerAnthony G. Basile <blueness@gentoo.org>2013-02-16 14:27:53 -0500
commitc73573a5981eabe77337393eba7548812bf5e811 (patch)
tree174635e495d85dfcb5f320650d14f9f3924b5e21
parentFix 3.2.38/4470_disable-compat_vdso.patch (diff)
downloadhardened-patchset-20130216.tar.gz
hardened-patchset-20130216.tar.bz2
hardened-patchset-20130216.zip
Grsec/PaX: 2.9.1-{2.6.32.60,3.2.38,3.7.8}-20130216115820130216
-rw-r--r--2.6.32/4420_grsecurity-2.9.1-2.6.32.60-201302161146.patch (renamed from 2.6.32/4420_grsecurity-2.9.1-2.6.32.60-201302092140.patch)420
-rw-r--r--3.2.38/0000_README2
-rw-r--r--3.2.38/4420_grsecurity-2.9.1-3.2.38-201302151927.patch (renamed from 3.2.38/4420_grsecurity-2.9.1-3.2.38-201302092140.patch)506
-rw-r--r--3.7.8/0000_README (renamed from 3.7.6/0000_README)2
-rw-r--r--3.7.8/4420_grsecurity-2.9.1-3.7.8-201302161158.patch (renamed from 3.7.6/4420_grsecurity-2.9.1-3.7.6-201302092141.patch)1795
-rw-r--r--3.7.8/4425_grsec_remove_EI_PAX.patch (renamed from 3.7.6/4425_grsec_remove_EI_PAX.patch)0
-rw-r--r--3.7.8/4430_grsec-remove-localversion-grsec.patch (renamed from 3.7.6/4430_grsec-remove-localversion-grsec.patch)0
-rw-r--r--3.7.8/4435_grsec-mute-warnings.patch (renamed from 3.7.6/4435_grsec-mute-warnings.patch)0
-rw-r--r--3.7.8/4440_grsec-remove-protected-paths.patch (renamed from 3.7.6/4440_grsec-remove-protected-paths.patch)0
-rw-r--r--3.7.8/4450_grsec-kconfig-default-gids.patch (renamed from 3.7.6/4450_grsec-kconfig-default-gids.patch)0
-rw-r--r--3.7.8/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.7.6/4465_selinux-avc_audit-log-curr_ip.patch)0
-rw-r--r--3.7.8/4470_disable-compat_vdso.patch (renamed from 3.7.6/4470_disable-compat_vdso.patch)0
12 files changed, 1600 insertions, 1125 deletions
diff --git a/2.6.32/4420_grsecurity-2.9.1-2.6.32.60-201302092140.patch b/2.6.32/4420_grsecurity-2.9.1-2.6.32.60-201302161146.patch
index af2ad8d..beb1e7f 100644
--- a/2.6.32/4420_grsecurity-2.9.1-2.6.32.60-201302092140.patch
+++ b/2.6.32/4420_grsecurity-2.9.1-2.6.32.60-201302161146.patch
@@ -13251,7 +13251,7 @@ index 33927d2..ccde329 100644
/*
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
-index af6fd36..da3ffbb 100644
+index af6fd36..fffaf4b 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -39,6 +39,7 @@ extern struct list_head pgd_list;
@@ -13314,7 +13314,19 @@ index af6fd36..da3ffbb 100644
static inline int pte_dirty(pte_t pte)
{
return pte_flags(pte) & _PAGE_DIRTY;
-@@ -167,9 +207,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
+@@ -130,6 +170,11 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
+ return (pmd_val(pmd) & PTE_PFN_MASK) >> PAGE_SHIFT;
+ }
+
++static inline unsigned long pud_pfn(pud_t pud)
++{
++ return (pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT;
++}
++
+ #define pte_page(pte) pfn_to_page(pte_pfn(pte))
+
+ static inline int pmd_large(pmd_t pte)
+@@ -167,9 +212,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
return pte_clear_flags(pte, _PAGE_RW);
}
@@ -13345,7 +13357,7 @@ index af6fd36..da3ffbb 100644
}
static inline pte_t pte_mkdirty(pte_t pte)
-@@ -302,6 +362,15 @@ pte_t *populate_extra_pte(unsigned long vaddr);
+@@ -302,6 +367,15 @@ pte_t *populate_extra_pte(unsigned long vaddr);
#endif
#ifndef __ASSEMBLY__
@@ -13361,7 +13373,7 @@ index af6fd36..da3ffbb 100644
#include <linux/mm_types.h>
static inline int pte_none(pte_t pte)
-@@ -472,7 +541,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
+@@ -472,7 +546,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
static inline int pgd_bad(pgd_t pgd)
{
@@ -13370,7 +13382,7 @@ index af6fd36..da3ffbb 100644
}
static inline int pgd_none(pgd_t pgd)
-@@ -495,7 +564,12 @@ static inline int pgd_none(pgd_t pgd)
+@@ -495,7 +569,12 @@ static inline int pgd_none(pgd_t pgd)
* pgd_offset() returns a (pgd_t *)
* pgd_index() is used get the offset into the pgd page's array of pgd_t's;
*/
@@ -13384,7 +13396,7 @@ index af6fd36..da3ffbb 100644
/*
* a shortcut which implies the use of the kernel's pgd, instead
* of a process's
-@@ -506,6 +580,20 @@ static inline int pgd_none(pgd_t pgd)
+@@ -506,6 +585,20 @@ static inline int pgd_none(pgd_t pgd)
#define KERNEL_PGD_BOUNDARY pgd_index(PAGE_OFFSET)
#define KERNEL_PGD_PTRS (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY)
@@ -13405,7 +13417,7 @@ index af6fd36..da3ffbb 100644
#ifndef __ASSEMBLY__
extern int direct_gbpages;
-@@ -611,11 +699,23 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm,
+@@ -611,11 +704,23 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm,
* dst and src can be on the same page, but the range must not overlap,
* and must not cross a page boundary.
*/
@@ -28185,7 +28197,7 @@ index 30938c1..bda3d5d 100644
printk(KERN_INFO "Write protecting the kernel text: %luk\n",
size >> 10);
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
-index 7d095ad..f833fa2 100644
+index 7d095ad..704b879 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -123,7 +123,7 @@ static pud_t *fill_pud(pgd_t *pgd, unsigned long vaddr)
@@ -28264,7 +28276,17 @@ index 7d095ad..f833fa2 100644
/* clear_bss() already clear the empty_zero_page */
reservedpages = 0;
-@@ -861,8 +867,8 @@ int kern_addr_valid(unsigned long addr)
+@@ -839,6 +845,9 @@ int kern_addr_valid(unsigned long addr)
+ if (pud_none(*pud))
+ return 0;
+
++ if (pud_large(*pud))
++ return pfn_valid(pud_pfn(*pud));
++
+ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd))
+ return 0;
+@@ -861,8 +870,8 @@ int kern_addr_valid(unsigned long addr)
static struct vm_area_struct gate_vma = {
.vm_start = VSYSCALL_START,
.vm_end = VSYSCALL_START + (VSYSCALL_MAPPED_PAGES * PAGE_SIZE),
@@ -28275,7 +28297,7 @@ index 7d095ad..f833fa2 100644
};
struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
-@@ -896,7 +902,7 @@ int in_gate_area_no_task(unsigned long addr)
+@@ -896,7 +905,7 @@ int in_gate_area_no_task(unsigned long addr)
const char *arch_vma_name(struct vm_area_struct *vma)
{
@@ -63668,6 +63690,63 @@ index f450bc9..2b747c8 100644
result =
hso_start_serial_device(serial_table[i], GFP_NOIO);
hso_kick_transmit(dev2ser(serial_table[i]));
+diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
+index 07f69ee..32a818f 100644
+--- a/drivers/net/usb/usbnet.c
++++ b/drivers/net/usb/usbnet.c
+@@ -331,6 +331,12 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
+ unsigned long lockflags;
+ size_t size = dev->rx_urb_size;
+
++ /* prevent rx skb allocation when error ratio is high */
++ if (test_bit(EVENT_RX_KILL, &dev->flags)) {
++ usb_free_urb(urb);
++ return -ENOLINK;
++ }
++
+ if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) {
+ if (netif_msg_rx_err (dev))
+ devdbg (dev, "no rx skb");
+@@ -481,6 +487,17 @@ block:
+ break;
+ }
+
++ /* stop rx if packet error rate is high */
++ if (++dev->pkt_cnt > 30) {
++ dev->pkt_cnt = 0;
++ dev->pkt_err = 0;
++ } else {
++ if (state == rx_cleanup)
++ dev->pkt_err++;
++ if (dev->pkt_err > 20)
++ set_bit(EVENT_RX_KILL, &dev->flags);
++ }
++
+ defer_bh(dev, skb, &dev->rxq);
+
+ if (urb) {
+@@ -762,6 +779,11 @@ int usbnet_open (struct net_device *net)
+ framing);
+ }
+
++ /* reset rx error state */
++ dev->pkt_cnt = 0;
++ dev->pkt_err = 0;
++ clear_bit(EVENT_RX_KILL, &dev->flags);
++
+ // delay posting reads until we're fully open
+ tasklet_schedule (&dev->bh);
+ return retval;
+@@ -1129,6 +1151,9 @@ static void usbnet_bh (unsigned long param)
+ }
+ }
+
++ /* restart RX again after disabling due to high error rate */
++ clear_bit(EVENT_RX_KILL, &dev->flags);
++
+ // waiting for all pending urbs to complete?
+ if (dev->wait) {
+ if ((dev->txq.qlen + dev->rxq.qlen + dev->done.qlen) == 0) {
diff --git a/drivers/net/vxge/vxge-config.c b/drivers/net/vxge/vxge-config.c
index 9e94c4b..316ee65 100644
--- a/drivers/net/vxge/vxge-config.c
@@ -99343,9 +99422,18 @@ index 379eaed..3471a57 100644
mode_t mode, struct proc_dir_entry *base,
read_proc_t *read_proc, void * data)
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
-index 7456d7d..6c1cfc9 100644
+index 7456d7d..0021b34 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
+@@ -87,7 +87,7 @@ extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned
+ extern int ptrace_attach(struct task_struct *tsk);
+ extern int ptrace_detach(struct task_struct *, unsigned int);
+ extern void ptrace_disable(struct task_struct *);
+-extern int ptrace_check_attach(struct task_struct *task, int kill);
++extern int ptrace_check_attach(struct task_struct *task, bool ignore_state);
+ extern int ptrace_request(struct task_struct *child, long request, long addr, long data);
+ extern void ptrace_notify(int exit_code);
+ extern void __ptrace_link(struct task_struct *child,
@@ -96,10 +96,10 @@ extern void __ptrace_unlink(struct task_struct *child);
extern void exit_ptrace(struct task_struct *tracer);
#define PTRACE_MODE_READ 1
@@ -99504,7 +99592,7 @@ index 14a86bc..17d0700 100644
/*
* CONFIG_RELAY kernel API, kernel/relay.c
diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 71849bf..fb7ea50 100644
+index 71849bf..a612150 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -101,6 +101,7 @@ struct bio;
@@ -99776,7 +99864,25 @@ index 71849bf..fb7ea50 100644
return (obj >= stack) && (obj < (stack + THREAD_SIZE));
}
-@@ -2616,6 +2726,23 @@ static inline unsigned long rlimit_max(unsigned int limit)
+@@ -2459,7 +2569,16 @@ static inline void thread_group_cputime_free(struct signal_struct *sig)
+ extern void recalc_sigpending_and_wake(struct task_struct *t);
+ extern void recalc_sigpending(void);
+
+-extern void signal_wake_up(struct task_struct *t, int resume_stopped);
++extern void signal_wake_up_state(struct task_struct *t, unsigned int state);
++
++static inline void signal_wake_up(struct task_struct *t, bool resume)
++{
++ signal_wake_up_state(t, resume ? TASK_WAKEKILL : 0);
++}
++static inline void ptrace_signal_wake_up(struct task_struct *t, bool resume)
++{
++ signal_wake_up_state(t, resume ? __TASK_TRACED : 0);
++}
+
+ /*
+ * Wrappers for p->thread_info->cpu access. No-op on UP.
+@@ -2616,6 +2735,23 @@ static inline unsigned long rlimit_max(unsigned int limit)
return task_rlimit_max(current, limit);
}
@@ -100777,6 +100883,26 @@ index a34fa89..ef176bc 100644
unsigned long active_duration;
+diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
+index f814730..61d9ec3 100644
+--- a/include/linux/usb/usbnet.h
++++ b/include/linux/usb/usbnet.h
+@@ -33,6 +33,7 @@ struct usbnet {
+ wait_queue_head_t *wait;
+ struct mutex phy_mutex;
+ unsigned char suspend_count;
++ unsigned char pkt_cnt, pkt_err;
+
+ /* i/o info: pipes etc */
+ unsigned in, out;
+@@ -65,6 +66,7 @@ struct usbnet {
+ # define EVENT_STS_SPLIT 3
+ # define EVENT_LINK_RESET 4
+ # define EVENT_RX_PAUSED 5
++# define EVENT_RX_KILL 10
+ };
+
+ static inline struct usb_driver *driver_of(struct usb_interface *intf)
diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h
index 79b9837..b5a56f9 100644
--- a/include/linux/vermagic.h
@@ -105817,10 +105943,114 @@ index dfadc5b..7f59404 100644
}
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 05625f6..702665c 100644
+index 05625f6..741869b 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
-@@ -117,7 +117,8 @@ int ptrace_check_attach(struct task_struct *child, int kill)
+@@ -56,7 +56,7 @@ static void ptrace_untrace(struct task_struct *child)
+ child->signal->group_stop_count)
+ __set_task_state(child, TASK_STOPPED);
+ else
+- signal_wake_up(child, 1);
++ ptrace_signal_wake_up(child, true);
+ }
+ spin_unlock(&child->sighand->siglock);
+ }
+@@ -80,10 +80,54 @@ void __ptrace_unlink(struct task_struct *child)
+ ptrace_untrace(child);
+ }
+
+-/*
+- * Check that we have indeed attached to the thing..
++/* Ensure that nothing can wake it up, even SIGKILL */
++static bool ptrace_freeze_traced(struct task_struct *task)
++{
++ bool ret = false;
++
++ spin_lock_irq(&task->sighand->siglock);
++ if (task_is_traced(task) && !__fatal_signal_pending(task)) {
++ task->state = __TASK_TRACED;
++ ret = true;
++ }
++ spin_unlock_irq(&task->sighand->siglock);
++
++ return ret;
++}
++
++static void ptrace_unfreeze_traced(struct task_struct *task)
++{
++ if (task->state != __TASK_TRACED)
++ return;
++
++ WARN_ON(!task->ptrace || task->parent != current);
++
++ spin_lock_irq(&task->sighand->siglock);
++ if (__fatal_signal_pending(task))
++ wake_up_state(task, __TASK_TRACED);
++ else
++ task->state = TASK_TRACED;
++ spin_unlock_irq(&task->sighand->siglock);
++}
++
++/**
++ * ptrace_check_attach - check whether ptracee is ready for ptrace operation
++ * @child: ptracee to check for
++ * @ignore_state: don't check whether @child is currently %TASK_TRACED
++ *
++ * Check whether @child is being ptraced by %current and ready for further
++ * ptrace operations. If @ignore_state is %false, @child also should be in
++ * %TASK_TRACED state and on return the child is guaranteed to be traced
++ * and not executing. If @ignore_state is %true, @child can be in any
++ * state.
++ *
++ * CONTEXT:
++ * Grabs and releases tasklist_lock and @child->sighand->siglock.
++ *
++ * RETURNS:
++ * 0 on success, -ESRCH if %child is not ready.
+ */
+-int ptrace_check_attach(struct task_struct *child, int kill)
++int ptrace_check_attach(struct task_struct *child, bool ignore_state)
+ {
+ int ret = -ESRCH;
+
+@@ -95,29 +139,34 @@ int ptrace_check_attach(struct task_struct *child, int kill)
+ * be changed by us so it's not changing right after this.
+ */
+ read_lock(&tasklist_lock);
+- if ((child->ptrace & PT_PTRACED) && child->parent == current) {
+- ret = 0;
++ if (child->ptrace && child->parent == current) {
++ WARN_ON(child->state == __TASK_TRACED);
+ /*
+ * child->sighand can't be NULL, release_task()
+ * does ptrace_unlink() before __exit_signal().
+ */
+- spin_lock_irq(&child->sighand->siglock);
+- if (task_is_stopped(child))
+- child->state = TASK_TRACED;
+- else if (!task_is_traced(child) && !kill)
+- ret = -ESRCH;
+- spin_unlock_irq(&child->sighand->siglock);
++ if (ignore_state || ptrace_freeze_traced(child))
++ ret = 0;
+ }
+ read_unlock(&tasklist_lock);
+
+- if (!ret && !kill)
+- ret = wait_task_inactive(child, TASK_TRACED) ? 0 : -ESRCH;
++ if (!ret && !ignore_state) {
++ if (!wait_task_inactive(child, __TASK_TRACED)) {
++ /*
++ * This can only happen if may_ptrace_stop() fails and
++ * ptrace_stop() changes ->state back to TASK_RUNNING,
++ * so we should not worry about leaking __TASK_TRACED.
++ */
++ WARN_ON(child->state == __TASK_TRACED);
++ ret = -ESRCH;
++ }
++ }
+
+- /* All systems go.. */
return ret;
}
@@ -105830,7 +106060,7 @@ index 05625f6..702665c 100644
{
const struct cred *cred = current_cred(), *tcred;
-@@ -141,7 +142,9 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode)
+@@ -141,7 +190,9 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode)
cred->gid != tcred->egid ||
cred->gid != tcred->sgid ||
cred->gid != tcred->gid) &&
@@ -105841,7 +106071,7 @@ index 05625f6..702665c 100644
rcu_read_unlock();
return -EPERM;
}
-@@ -149,7 +152,9 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode)
+@@ -149,7 +200,9 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode)
smp_rmb();
if (task->mm)
dumpable = get_dumpable(task->mm);
@@ -105852,7 +106082,7 @@ index 05625f6..702665c 100644
return -EPERM;
return security_ptrace_access_check(task, mode);
-@@ -159,7 +164,16 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode)
+@@ -159,7 +212,16 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode)
{
int err;
task_lock(task);
@@ -105870,7 +106100,7 @@ index 05625f6..702665c 100644
task_unlock(task);
return !err;
}
-@@ -182,11 +196,11 @@ int ptrace_attach(struct task_struct *task)
+@@ -182,11 +244,11 @@ int ptrace_attach(struct task_struct *task)
* under ptrace.
*/
retval = -ERESTARTNOINTR;
@@ -105884,7 +106114,7 @@ index 05625f6..702665c 100644
task_unlock(task);
if (retval)
goto unlock_creds;
-@@ -199,7 +213,7 @@ int ptrace_attach(struct task_struct *task)
+@@ -199,7 +261,7 @@ int ptrace_attach(struct task_struct *task)
goto unlock_tasklist;
task->ptrace = PT_PTRACED;
@@ -105893,7 +106123,7 @@ index 05625f6..702665c 100644
task->ptrace |= PT_PTRACE_CAP;
__ptrace_link(task, current);
-@@ -209,7 +223,7 @@ int ptrace_attach(struct task_struct *task)
+@@ -209,7 +271,7 @@ int ptrace_attach(struct task_struct *task)
unlock_tasklist:
write_unlock_irq(&tasklist_lock);
unlock_creds:
@@ -105902,7 +106132,7 @@ index 05625f6..702665c 100644
out:
return retval;
}
-@@ -351,6 +365,8 @@ int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst
+@@ -351,6 +413,8 @@ int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst
{
int copied = 0;
@@ -105911,7 +106141,7 @@ index 05625f6..702665c 100644
while (len > 0) {
char buf[128];
int this_len, retval;
-@@ -376,6 +392,8 @@ int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long ds
+@@ -376,6 +440,8 @@ int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long ds
{
int copied = 0;
@@ -105920,7 +106150,16 @@ index 05625f6..702665c 100644
while (len > 0) {
char buf[128];
int this_len, retval;
-@@ -517,6 +535,8 @@ int ptrace_request(struct task_struct *child, long request,
+@@ -506,7 +572,7 @@ static int ptrace_resume(struct task_struct *child, long request, long data)
+ }
+
+ child->exit_code = data;
+- wake_up_process(child);
++ wake_up_state(child, __TASK_TRACED);
+
+ return 0;
+ }
+@@ -517,6 +583,8 @@ int ptrace_request(struct task_struct *child, long request,
int ret = -EIO;
siginfo_t siginfo;
@@ -105929,7 +106168,7 @@ index 05625f6..702665c 100644
switch (request) {
case PTRACE_PEEKTEXT:
case PTRACE_PEEKDATA:
-@@ -532,18 +552,18 @@ int ptrace_request(struct task_struct *child, long request,
+@@ -532,18 +600,18 @@ int ptrace_request(struct task_struct *child, long request,
ret = ptrace_setoptions(child, data);
break;
case PTRACE_GETEVENTMSG:
@@ -105951,7 +106190,7 @@ index 05625f6..702665c 100644
sizeof siginfo))
ret = -EFAULT;
else
-@@ -621,14 +641,21 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data)
+@@ -621,14 +689,21 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data)
goto out;
}
@@ -105974,7 +106213,16 @@ index 05625f6..702665c 100644
goto out_put_task_struct;
}
-@@ -653,7 +680,7 @@ int generic_ptrace_peekdata(struct task_struct *tsk, long addr, long data)
+@@ -637,6 +712,8 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data)
+ goto out_put_task_struct;
+
+ ret = arch_ptrace(child, request, addr, data);
++ if (ret || request != PTRACE_DETACH)
++ ptrace_unfreeze_traced(child);
+
+ out_put_task_struct:
+ put_task_struct(child);
+@@ -653,7 +730,7 @@ int generic_ptrace_peekdata(struct task_struct *tsk, long addr, long data)
copied = access_process_vm(tsk, addr, &tmp, sizeof(tmp), 0);
if (copied != sizeof(tmp))
return -EIO;
@@ -105983,7 +106231,7 @@ index 05625f6..702665c 100644
}
int generic_ptrace_pokedata(struct task_struct *tsk, long addr, long data)
-@@ -675,6 +702,8 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request,
+@@ -675,6 +752,8 @@ int compat_ptrace_request(struct task_struct *child, compat_long_t request,
siginfo_t siginfo;
int ret;
@@ -105992,7 +106240,7 @@ index 05625f6..702665c 100644
switch (request) {
case PTRACE_PEEKTEXT:
case PTRACE_PEEKDATA:
-@@ -740,14 +769,21 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
+@@ -740,20 +819,30 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
goto out;
}
@@ -106015,6 +106263,16 @@ index 05625f6..702665c 100644
goto out_put_task_struct;
}
+ ret = ptrace_check_attach(child, request == PTRACE_KILL);
+- if (!ret)
++ if (!ret) {
+ ret = compat_arch_ptrace(child, request, addr, data);
++ if (ret || request != PTRACE_DETACH)
++ ptrace_unfreeze_traced(child);
++ }
+
+ out_put_task_struct:
+ put_task_struct(child);
diff --git a/kernel/rcutorture.c b/kernel/rcutorture.c
index 697c0a0..2402696 100644
--- a/kernel/rcutorture.c
@@ -106448,7 +106706,7 @@ index 0591df8..dcf3f9f 100644
if (cpu != group_first_cpu(sd->groups))
return;
diff --git a/kernel/signal.c b/kernel/signal.c
-index 2494827..cda80a0 100644
+index 2494827..02e4288 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -41,12 +41,12 @@
@@ -106494,7 +106752,34 @@ index 2494827..cda80a0 100644
if (is_global_init(tsk))
return 1;
if (handler != SIG_IGN && handler != SIG_DFL)
-@@ -627,6 +630,13 @@ static int check_kill_permission(int sig, struct siginfo *info,
+@@ -513,23 +516,17 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
+ * No need to set need_resched since signal event passing
+ * goes through ->blocked
+ */
+-void signal_wake_up(struct task_struct *t, int resume)
++void signal_wake_up_state(struct task_struct *t, unsigned int state)
+ {
+- unsigned int mask;
+-
+ set_tsk_thread_flag(t, TIF_SIGPENDING);
+-
+ /*
+- * For SIGKILL, we want to wake it up in the stopped/traced/killable
++ * TASK_WAKEKILL also means wake it up in the stopped/traced/killable
+ * case. We don't check t->state here because there is a race with it
+ * executing another processor and just now entering stopped state.
+ * By using wake_up_state, we ensure the process will wake up and
+ * handle its death signal.
+ */
+- mask = TASK_INTERRUPTIBLE;
+- if (resume)
+- mask |= TASK_WAKEKILL;
+- if (!wake_up_state(t, mask))
++ if (!wake_up_state(t, state | TASK_INTERRUPTIBLE))
+ kick_process(t);
+ }
+
+@@ -627,6 +624,13 @@ static int check_kill_permission(int sig, struct siginfo *info,
}
}
@@ -106508,7 +106793,7 @@ index 2494827..cda80a0 100644
return security_task_kill(t, info, sig, 0);
}
-@@ -968,7 +978,7 @@ __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
+@@ -968,7 +972,7 @@ __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
return send_signal(sig, info, p, 1);
}
@@ -106517,7 +106802,7 @@ index 2494827..cda80a0 100644
specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
{
return send_signal(sig, info, t, 0);
-@@ -1005,6 +1015,7 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
+@@ -1005,6 +1009,7 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
unsigned long int flags;
int ret, blocked, ignored;
struct k_sigaction *action;
@@ -106525,7 +106810,7 @@ index 2494827..cda80a0 100644
spin_lock_irqsave(&t->sighand->siglock, flags);
action = &t->sighand->action[sig-1];
-@@ -1019,9 +1030,18 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
+@@ -1019,9 +1024,18 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
}
if (action->sa.sa_handler == SIG_DFL)
t->signal->flags &= ~SIGNAL_UNKILLABLE;
@@ -106544,7 +106829,7 @@ index 2494827..cda80a0 100644
return ret;
}
-@@ -1081,8 +1101,11 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
+@@ -1081,8 +1095,11 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
{
int ret = check_kill_permission(sig, info, p);
@@ -106557,6 +106842,26 @@ index 2494827..cda80a0 100644
return ret;
}
+@@ -1530,6 +1547,10 @@ static inline int may_ptrace_stop(void)
+ * If SIGKILL was already sent before the caller unlocked
+ * ->siglock we must see ->core_state != NULL. Otherwise it
+ * is safe to enter schedule().
++ *
++ * This is almost outdated, a task with the pending SIGKILL can't
++ * block in TASK_TRACED. But PTRACE_EVENT_EXIT can be reported
++ * after SIGKILL was already dequeued.
+ */
+ if (unlikely(current->mm->core_state) &&
+ unlikely(current->mm == current->parent->mm))
+@@ -1611,6 +1632,8 @@ static void ptrace_stop(int exit_code, int clear_code, siginfo_t *info)
+ * By the time we got the lock, our tracer went away.
+ * Don't drop the lock yet, another tracer may come.
+ */
++
++ /* tasklist protects us from ptrace_freeze_traced() */
+ __set_current_state(TASK_RUNNING);
+ if (clear_code)
+ current->exit_code = 0;
@@ -1644,6 +1667,8 @@ void ptrace_notify(int exit_code)
{
siginfo_t info;
@@ -116780,9 +117085,18 @@ index 713ac59..306f6ae 100644
ret = kernel_sendmsg(conn->trans->local->socket, &msg, iov, 3, len);
diff --git a/net/sctp/auth.c b/net/sctp/auth.c
-index 914c419..7a16d2c 100644
+index 914c419..1b055b5 100644
--- a/net/sctp/auth.c
+++ b/net/sctp/auth.c
+@@ -70,7 +70,7 @@ void sctp_auth_key_put(struct sctp_auth_bytes *key)
+ return;
+
+ if (atomic_dec_and_test(&key->refcnt)) {
+- kfree(key);
++ kzfree(key);
+ SCTP_DBG_OBJCNT_DEC(keys);
+ }
+ }
@@ -81,7 +81,7 @@ static struct sctp_auth_bytes *sctp_auth_create_key(__u32 key_len, gfp_t gfp)
struct sctp_auth_bytes *key;
@@ -116824,6 +117138,29 @@ index acf7c4d..b29621d 100644
errout:
list_for_each_safe(pos, temp, &msg->chunks) {
list_del_init(pos);
+diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c
+index 905fda5..ca48660 100644
+--- a/net/sctp/endpointola.c
++++ b/net/sctp/endpointola.c
+@@ -249,6 +249,8 @@ void sctp_endpoint_free(struct sctp_endpoint *ep)
+ /* Final destructor for endpoint. */
+ static void sctp_endpoint_destroy(struct sctp_endpoint *ep)
+ {
++ int i;
++
+ SCTP_ASSERT(ep->base.dead, "Endpoint is not dead", return);
+
+ /* Free up the HMAC transform. */
+@@ -271,6 +273,9 @@ static void sctp_endpoint_destroy(struct sctp_endpoint *ep)
+ sctp_inq_free(&ep->base.inqueue);
+ sctp_bind_addr_free(&ep->base.bind_addr);
+
++ for (i = 0; i < SCTP_HOW_MANY_SECRETS; ++i)
++ memset(&ep->secret_key[i], 0, SCTP_SECRET_SIZE);
++
+ /* Remove and free the port */
+ if (sctp_sk(ep->base.sk)->bind_hash)
+ sctp_put_port(ep->base.sk);
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index bb280e6..747720f 100644
--- a/net/sctp/ipv6.c
@@ -116896,9 +117233,18 @@ index 619f965..bed845a 100644
static int sctp_v4_protosw_init(void)
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
-index 1f9843e..9cd0edd 100644
+index 1f9843e..5e9fd60 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
+@@ -3271,7 +3271,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk,
+
+ ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey);
+ out:
+- kfree(authkey);
++ kzfree(authkey);
+ return ret;
+ }
+
@@ -5810,7 +5810,6 @@ pp_found:
*/
int reuse = sk->sk_reuse;
diff --git a/3.2.38/0000_README b/3.2.38/0000_README
index 89389cb..2b340f4 100644
--- a/3.2.38/0000_README
+++ b/3.2.38/0000_README
@@ -70,7 +70,7 @@ Patch: 1037_linux-3.2.38.patch
From: http://www.kernel.org
Desc: Linux 3.2.38
-Patch: 4420_grsecurity-2.9.1-3.2.38-201302092140.patch
+Patch: 4420_grsecurity-2.9.1-3.2.38-201302151927.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.2.38/4420_grsecurity-2.9.1-3.2.38-201302092140.patch b/3.2.38/4420_grsecurity-2.9.1-3.2.38-201302151927.patch
index e28938e..dbf3f8b 100644
--- a/3.2.38/4420_grsecurity-2.9.1-3.2.38-201302092140.patch
+++ b/3.2.38/4420_grsecurity-2.9.1-3.2.38-201302151927.patch
@@ -11863,7 +11863,7 @@ index cb00ccc..17e9054 100644
/*
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
-index 884507e..d9137ab 100644
+index 884507e..4afeb15 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -44,6 +44,7 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
@@ -11926,7 +11926,19 @@ index 884507e..d9137ab 100644
static inline int pte_dirty(pte_t pte)
{
return pte_flags(pte) & _PAGE_DIRTY;
-@@ -195,9 +235,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
+@@ -142,6 +182,11 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
+ return (pmd_val(pmd) & PTE_PFN_MASK) >> PAGE_SHIFT;
+ }
+
++static inline unsigned long pud_pfn(pud_t pud)
++{
++ return (pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT;
++}
++
+ #define pte_page(pte) pfn_to_page(pte_pfn(pte))
+
+ static inline int pmd_large(pmd_t pte)
+@@ -195,9 +240,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
return pte_clear_flags(pte, _PAGE_RW);
}
@@ -11957,7 +11969,7 @@ index 884507e..d9137ab 100644
}
static inline pte_t pte_mkdirty(pte_t pte)
-@@ -389,6 +449,15 @@ pte_t *populate_extra_pte(unsigned long vaddr);
+@@ -389,6 +454,15 @@ pte_t *populate_extra_pte(unsigned long vaddr);
#endif
#ifndef __ASSEMBLY__
@@ -11973,7 +11985,7 @@ index 884507e..d9137ab 100644
#include <linux/mm_types.h>
static inline int pte_none(pte_t pte)
-@@ -565,7 +634,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
+@@ -565,7 +639,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
static inline int pgd_bad(pgd_t pgd)
{
@@ -11982,7 +11994,7 @@ index 884507e..d9137ab 100644
}
static inline int pgd_none(pgd_t pgd)
-@@ -588,7 +657,12 @@ static inline int pgd_none(pgd_t pgd)
+@@ -588,7 +662,12 @@ static inline int pgd_none(pgd_t pgd)
* pgd_offset() returns a (pgd_t *)
* pgd_index() is used get the offset into the pgd page's array of pgd_t's;
*/
@@ -11996,7 +12008,7 @@ index 884507e..d9137ab 100644
/*
* a shortcut which implies the use of the kernel's pgd, instead
* of a process's
-@@ -599,6 +673,20 @@ static inline int pgd_none(pgd_t pgd)
+@@ -599,6 +678,20 @@ static inline int pgd_none(pgd_t pgd)
#define KERNEL_PGD_BOUNDARY pgd_index(PAGE_OFFSET)
#define KERNEL_PGD_PTRS (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY)
@@ -12017,7 +12029,7 @@ index 884507e..d9137ab 100644
#ifndef __ASSEMBLY__
extern int direct_gbpages;
-@@ -763,11 +851,23 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm,
+@@ -763,11 +856,23 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm,
* dst and src can be on the same page, but the range must not overlap,
* and must not cross a page boundary.
*/
@@ -26046,7 +26058,7 @@ index 29f7c6d..b46b35b 100644
printk(KERN_INFO "Write protecting the kernel text: %luk\n",
size >> 10);
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
-index bbaaa00..020e913 100644
+index bbaaa00..b5cb517 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -75,7 +75,7 @@ early_param("gbpages", parse_direct_gbpages_on);
@@ -26194,7 +26206,17 @@ index bbaaa00..020e913 100644
/* clear_bss() already clear the empty_zero_page */
reservedpages = 0;
-@@ -853,8 +873,8 @@ int kern_addr_valid(unsigned long addr)
+@@ -831,6 +851,9 @@ int kern_addr_valid(unsigned long addr)
+ if (pud_none(*pud))
+ return 0;
+
++ if (pud_large(*pud))
++ return pfn_valid(pud_pfn(*pud));
++
+ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd))
+ return 0;
+@@ -853,8 +876,8 @@ int kern_addr_valid(unsigned long addr)
static struct vm_area_struct gate_vma = {
.vm_start = VSYSCALL_START,
.vm_end = VSYSCALL_START + (VSYSCALL_MAPPED_PAGES * PAGE_SIZE),
@@ -26205,7 +26227,7 @@ index bbaaa00..020e913 100644
};
struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
-@@ -888,7 +908,7 @@ int in_gate_area_no_mm(unsigned long addr)
+@@ -888,7 +911,7 @@ int in_gate_area_no_mm(unsigned long addr)
const char *arch_vma_name(struct vm_area_struct *vma)
{
@@ -37341,6 +37363,22 @@ index 4c8e199..f7f5587 100644
if (!q_vector->rxr_count)
return IRQ_HANDLED;
+diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c
+index 24ee967..b5c9b99 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/eq.c
++++ b/drivers/net/ethernet/mellanox/mlx4/eq.c
+@@ -570,8 +570,9 @@ int mlx4_init_eq_table(struct mlx4_dev *dev)
+ int err;
+ int i;
+
+- priv->eq_table.uar_map = kcalloc(sizeof *priv->eq_table.uar_map,
+- mlx4_num_eq_uar(dev), GFP_KERNEL);
++ priv->eq_table.uar_map = kcalloc(mlx4_num_eq_uar(dev),
++ sizeof *priv->eq_table.uar_map,
++ GFP_KERNEL);
+ if (!priv->eq_table.uar_map) {
+ err = -ENOMEM;
+ goto err_out_free;
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 94bbc85..78c12e6 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -37782,6 +37820,63 @@ index 304fe78..db112fa 100644
result =
hso_start_serial_device(serial_table[i], GFP_NOIO);
hso_kick_transmit(dev2ser(serial_table[i]));
+diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
+index dc53a8f..2b66cc1 100644
+--- a/drivers/net/usb/usbnet.c
++++ b/drivers/net/usb/usbnet.c
+@@ -344,6 +344,12 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
+ unsigned long lockflags;
+ size_t size = dev->rx_urb_size;
+
++ /* prevent rx skb allocation when error ratio is high */
++ if (test_bit(EVENT_RX_KILL, &dev->flags)) {
++ usb_free_urb(urb);
++ return -ENOLINK;
++ }
++
+ if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) {
+ netif_dbg(dev, rx_err, dev->net, "no rx skb\n");
+ usbnet_defer_kevent (dev, EVENT_RX_MEMORY);
+@@ -503,6 +509,17 @@ block:
+ break;
+ }
+
++ /* stop rx if packet error rate is high */
++ if (++dev->pkt_cnt > 30) {
++ dev->pkt_cnt = 0;
++ dev->pkt_err = 0;
++ } else {
++ if (state == rx_cleanup)
++ dev->pkt_err++;
++ if (dev->pkt_err > 20)
++ set_bit(EVENT_RX_KILL, &dev->flags);
++ }
++
+ state = defer_bh(dev, skb, &dev->rxq, state);
+
+ if (urb) {
+@@ -789,6 +806,11 @@ int usbnet_open (struct net_device *net)
+ (dev->driver_info->flags & FLAG_FRAMING_AX) ? "ASIX" :
+ "simple");
+
++ /* reset rx error state */
++ dev->pkt_cnt = 0;
++ dev->pkt_err = 0;
++ clear_bit(EVENT_RX_KILL, &dev->flags);
++
+ // delay posting reads until we're fully open
+ tasklet_schedule (&dev->bh);
+ if (info->manage_power) {
+@@ -1227,6 +1249,9 @@ static void usbnet_bh (unsigned long param)
+ }
+ }
+
++ /* restart RX again after disabling due to high error rate */
++ clear_bit(EVENT_RX_KILL, &dev->flags);
++
+ // waiting for all pending urbs to complete?
+ if (dev->wait) {
+ if ((dev->txq.qlen + dev->rxq.qlen + dev->done.qlen) == 0) {
diff --git a/drivers/net/vmxnet3/vmxnet3_ethtool.c b/drivers/net/vmxnet3/vmxnet3_ethtool.c
index e662cbc..8d4a102 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethtool.c
@@ -66754,7 +66849,7 @@ index 2148b12..519b820 100644
static inline void anon_vma_merge(struct vm_area_struct *vma,
diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 1e86bb4..d87a793 100644
+index 1e86bb4..bcc2c30 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -101,6 +101,7 @@ struct bio_list;
@@ -67017,6 +67112,24 @@ index 1e86bb4..d87a793 100644
return (obj >= stack) && (obj < (stack + THREAD_SIZE));
}
+@@ -2597,7 +2713,16 @@ static inline void thread_group_cputime_init(struct signal_struct *sig)
+ extern void recalc_sigpending_and_wake(struct task_struct *t);
+ extern void recalc_sigpending(void);
+
+-extern void signal_wake_up(struct task_struct *t, int resume_stopped);
++extern void signal_wake_up_state(struct task_struct *t, unsigned int state);
++
++static inline void signal_wake_up(struct task_struct *t, bool resume)
++{
++ signal_wake_up_state(t, resume ? TASK_WAKEKILL : 0);
++}
++static inline void ptrace_signal_wake_up(struct task_struct *t, bool resume)
++{
++ signal_wake_up_state(t, resume ? __TASK_TRACED : 0);
++}
+
+ /*
+ * Wrappers for p->thread_info->cpu access. No-op on UP.
diff --git a/include/linux/screen_info.h b/include/linux/screen_info.h
index 899fbb4..1cb4138 100644
--- a/include/linux/screen_info.h
@@ -67757,6 +67870,27 @@ index e5a40c3..d75f068 100644
/*
* callback functions for platform
+diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
+index 76f4396..3e0a4a8 100644
+--- a/include/linux/usb/usbnet.h
++++ b/include/linux/usb/usbnet.h
+@@ -33,6 +33,7 @@ struct usbnet {
+ wait_queue_head_t *wait;
+ struct mutex phy_mutex;
+ unsigned char suspend_count;
++ unsigned char pkt_cnt, pkt_err;
+
+ /* i/o info: pipes etc */
+ unsigned in, out;
+@@ -69,6 +70,8 @@ struct usbnet {
+ # define EVENT_DEV_WAKING 6
+ # define EVENT_DEV_ASLEEP 7
+ # define EVENT_DEV_OPEN 8
++# define EVENT_NO_RUNTIME_PM 9
++# define EVENT_RX_KILL 10
+ };
+
+ static inline struct usb_driver *driver_of(struct usb_interface *intf)
diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h
index 6f8fbcf..8259001 100644
--- a/include/linux/vermagic.h
@@ -72144,10 +72278,16 @@ index 76b8e77..a2930e8 100644
}
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index 78ab24a..f8e2cdc 100644
+index 78ab24a..5333587 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
-@@ -122,6 +122,40 @@ void __ptrace_unlink(struct task_struct *child)
+@@ -117,11 +117,45 @@ void __ptrace_unlink(struct task_struct *child)
+ * TASK_KILLABLE sleeps.
+ */
+ if (child->jobctl & JOBCTL_STOP_PENDING || task_is_traced(child))
+- signal_wake_up(child, task_is_traced(child));
++ ptrace_signal_wake_up(child, true);
+
spin_unlock(&child->sighand->siglock);
}
@@ -72295,6 +72435,15 @@ index 78ab24a..f8e2cdc 100644
task->ptrace |= PT_PTRACE_CAP;
__ptrace_link(task, current);
+@@ -307,7 +364,7 @@ static int ptrace_attach(struct task_struct *task, long request,
+ */
+ if (task_is_stopped(task) &&
+ task_set_jobctl_pending(task, JOBCTL_TRAP_STOP | JOBCTL_TRAPPING))
+- signal_wake_up(task, 1);
++ signal_wake_up_state(task, __TASK_STOPPED);
+
+ spin_unlock(&task->sighand->siglock);
+
@@ -483,7 +540,7 @@ int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst
break;
return -EIO;
@@ -72313,6 +72462,24 @@ index 78ab24a..f8e2cdc 100644
unsigned long __user *datalp = datavp;
unsigned long flags;
+@@ -736,7 +793,7 @@ int ptrace_request(struct task_struct *child, long request,
+ * tracee into STOP.
+ */
+ if (likely(task_set_jobctl_pending(child, JOBCTL_TRAP_STOP)))
+- signal_wake_up(child, child->jobctl & JOBCTL_LISTENING);
++ ptrace_signal_wake_up(child, child->jobctl & JOBCTL_LISTENING);
+
+ unlock_task_sighand(child, &flags);
+ ret = 0;
+@@ -762,7 +819,7 @@ int ptrace_request(struct task_struct *child, long request,
+ * start of this trap and now. Trigger re-trap.
+ */
+ if (child->jobctl & JOBCTL_TRAP_NOTIFY)
+- signal_wake_up(child, true);
++ ptrace_signal_wake_up(child, true);
+ ret = 0;
+ }
+ unlock_task_sighand(child, &flags);
@@ -882,14 +939,21 @@ SYSCALL_DEFINE4(ptrace, long, request, long, pid, unsigned long, addr,
goto out;
}
@@ -72977,7 +73144,7 @@ index 66e4576..d05c6d5 100644
int this_cpu = smp_processor_id();
struct rq *this_rq = cpu_rq(this_cpu);
diff --git a/kernel/signal.c b/kernel/signal.c
-index 08e0b97..e3ad9b7 100644
+index 08e0b97..4dc47a0 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -45,12 +45,12 @@ static struct kmem_cache *sigqueue_cachep;
@@ -73023,7 +73190,34 @@ index 08e0b97..e3ad9b7 100644
if (is_global_init(tsk))
return 1;
if (handler != SIG_IGN && handler != SIG_DFL)
-@@ -815,6 +818,13 @@ static int check_kill_permission(int sig, struct siginfo *info,
+@@ -676,23 +679,17 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
+ * No need to set need_resched since signal event passing
+ * goes through ->blocked
+ */
+-void signal_wake_up(struct task_struct *t, int resume)
++void signal_wake_up_state(struct task_struct *t, unsigned int state)
+ {
+- unsigned int mask;
+-
+ set_tsk_thread_flag(t, TIF_SIGPENDING);
+-
+ /*
+- * For SIGKILL, we want to wake it up in the stopped/traced/killable
++ * TASK_WAKEKILL also means wake it up in the stopped/traced/killable
+ * case. We don't check t->state here because there is a race with it
+ * executing another processor and just now entering stopped state.
+ * By using wake_up_state, we ensure the process will wake up and
+ * handle its death signal.
+ */
+- mask = TASK_INTERRUPTIBLE;
+- if (resume)
+- mask |= TASK_WAKEKILL;
+- if (!wake_up_state(t, mask))
++ if (!wake_up_state(t, state | TASK_INTERRUPTIBLE))
+ kick_process(t);
+ }
+
+@@ -815,6 +812,13 @@ static int check_kill_permission(int sig, struct siginfo *info,
}
}
@@ -73037,7 +73231,16 @@ index 08e0b97..e3ad9b7 100644
return security_task_kill(t, info, sig, 0);
}
-@@ -1165,7 +1175,7 @@ __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
+@@ -841,7 +845,7 @@ static void ptrace_trap_notify(struct task_struct *t)
+ assert_spin_locked(&t->sighand->siglock);
+
+ task_set_jobctl_pending(t, JOBCTL_TRAP_NOTIFY);
+- signal_wake_up(t, t->jobctl & JOBCTL_LISTENING);
++ ptrace_signal_wake_up(t, t->jobctl & JOBCTL_LISTENING);
+ }
+
+ /*
+@@ -1165,7 +1169,7 @@ __group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
return send_signal(sig, info, p, 1);
}
@@ -73046,7 +73249,7 @@ index 08e0b97..e3ad9b7 100644
specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
{
return send_signal(sig, info, t, 0);
-@@ -1202,6 +1212,7 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
+@@ -1202,6 +1206,7 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
unsigned long int flags;
int ret, blocked, ignored;
struct k_sigaction *action;
@@ -73054,7 +73257,7 @@ index 08e0b97..e3ad9b7 100644
spin_lock_irqsave(&t->sighand->siglock, flags);
action = &t->sighand->action[sig-1];
-@@ -1216,9 +1227,18 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
+@@ -1216,9 +1221,18 @@ force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
}
if (action->sa.sa_handler == SIG_DFL)
t->signal->flags &= ~SIGNAL_UNKILLABLE;
@@ -73073,7 +73276,7 @@ index 08e0b97..e3ad9b7 100644
return ret;
}
-@@ -1285,8 +1305,11 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
+@@ -1285,8 +1299,11 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
ret = check_kill_permission(sig, info, p);
rcu_read_unlock();
@@ -73086,7 +73289,7 @@ index 08e0b97..e3ad9b7 100644
return ret;
}
-@@ -1765,6 +1788,10 @@ static inline int may_ptrace_stop(void)
+@@ -1765,6 +1782,10 @@ static inline int may_ptrace_stop(void)
* If SIGKILL was already sent before the caller unlocked
* ->siglock we must see ->core_state != NULL. Otherwise it
* is safe to enter schedule().
@@ -73097,7 +73300,7 @@ index 08e0b97..e3ad9b7 100644
*/
if (unlikely(current->mm->core_state) &&
unlikely(current->mm == current->parent->mm))
-@@ -1890,6 +1917,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
+@@ -1890,6 +1911,7 @@ static void ptrace_stop(int exit_code, int why, int clear_code, siginfo_t *info)
if (gstop_done)
do_notify_parent_cldstop(current, false, why);
@@ -73105,7 +73308,7 @@ index 08e0b97..e3ad9b7 100644
__set_current_state(TASK_RUNNING);
if (clear_code)
current->exit_code = 0;
-@@ -2763,7 +2791,15 @@ do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info)
+@@ -2763,7 +2785,15 @@ do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info)
int error = -ESRCH;
rcu_read_lock();
@@ -82892,7 +83095,7 @@ index f156382..95ce7ba 100644
*uaddr_len = sizeof(struct sockaddr_ax25);
}
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
-index 85afc13..f8c880b 100644
+index 85afc13..d9fb2db 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1684,7 +1684,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
@@ -82913,7 +83116,27 @@ index 85afc13..f8c880b 100644
spin_unlock(&sk->sk_receive_queue.lock);
drop_n_restore:
-@@ -2621,6 +2621,7 @@ out:
+@@ -2422,13 +2422,15 @@ static int packet_release(struct socket *sock)
+
+ packet_flush_mclist(sk);
+
+- memset(&req_u, 0, sizeof(req_u));
+-
+- if (po->rx_ring.pg_vec)
++ if (po->rx_ring.pg_vec) {
++ memset(&req_u, 0, sizeof(req_u));
+ packet_set_ring(sk, &req_u, 1, 0);
++ }
+
+- if (po->tx_ring.pg_vec)
++ if (po->tx_ring.pg_vec) {
++ memset(&req_u, 0, sizeof(req_u));
+ packet_set_ring(sk, &req_u, 1, 1);
++ }
+
+ fanout_release(sk);
+
+@@ -2621,6 +2623,7 @@ out:
static int packet_recv_error(struct sock *sk, struct msghdr *msg, int len)
{
@@ -82921,7 +83144,7 @@ index 85afc13..f8c880b 100644
struct sock_exterr_skb *serr;
struct sk_buff *skb, *skb2;
int copied, err;
-@@ -2642,8 +2643,9 @@ static int packet_recv_error(struct sock *sk, struct msghdr *msg, int len)
+@@ -2642,8 +2645,9 @@ static int packet_recv_error(struct sock *sk, struct msghdr *msg, int len)
sock_recv_timestamp(msg, sk, skb);
serr = SKB_EXT_ERR(skb);
@@ -82932,7 +83155,7 @@ index 85afc13..f8c880b 100644
msg->msg_flags |= MSG_ERRQUEUE;
err = copied;
-@@ -3274,7 +3276,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
+@@ -3274,7 +3278,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
case PACKET_HDRLEN:
if (len > sizeof(int))
len = sizeof(int);
@@ -82941,7 +83164,7 @@ index 85afc13..f8c880b 100644
return -EFAULT;
switch (val) {
case TPACKET_V1:
-@@ -3324,7 +3326,11 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
+@@ -3324,7 +3328,11 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
if (put_user(len, optlen))
return -EFAULT;
@@ -83462,6 +83685,42 @@ index 7635107..4670276 100644
_proto("Tx RESPONSE %%%u", ntohl(hdr->serial));
ret = kernel_sendmsg(conn->trans->local->socket, &msg, iov, 3, len);
+diff --git a/net/sctp/auth.c b/net/sctp/auth.c
+index bf81204..333926d 100644
+--- a/net/sctp/auth.c
++++ b/net/sctp/auth.c
+@@ -71,7 +71,7 @@ void sctp_auth_key_put(struct sctp_auth_bytes *key)
+ return;
+
+ if (atomic_dec_and_test(&key->refcnt)) {
+- kfree(key);
++ kzfree(key);
+ SCTP_DBG_OBJCNT_DEC(keys);
+ }
+ }
+diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c
+index c8cc24e..dbe5870a 100644
+--- a/net/sctp/endpointola.c
++++ b/net/sctp/endpointola.c
+@@ -248,6 +248,8 @@ void sctp_endpoint_free(struct sctp_endpoint *ep)
+ /* Final destructor for endpoint. */
+ static void sctp_endpoint_destroy(struct sctp_endpoint *ep)
+ {
++ int i;
++
+ SCTP_ASSERT(ep->base.dead, "Endpoint is not dead", return);
+
+ /* Free up the HMAC transform. */
+@@ -270,6 +272,9 @@ static void sctp_endpoint_destroy(struct sctp_endpoint *ep)
+ sctp_inq_free(&ep->base.inqueue);
+ sctp_bind_addr_free(&ep->base.bind_addr);
+
++ for (i = 0; i < SCTP_HOW_MANY_SECRETS; ++i)
++ memset(&ep->secret_key[i], 0, SCTP_SECRET_SIZE);
++
+ /* Remove and free the port */
+ if (sctp_sk(ep->base.sk)->bind_hash)
+ sctp_put_port(ep->base.sk);
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index 8104278..631330b 100644
--- a/net/sctp/ipv6.c
@@ -83516,9 +83775,18 @@ index 6f6ad86..f80bd85 100644
static int sctp_v4_protosw_init(void)
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
-index fa8333b..7382d42 100644
+index fa8333b..8633998 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
+@@ -3375,7 +3375,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk,
+
+ ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey);
+ out:
+- kfree(authkey);
++ kzfree(authkey);
+ return ret;
+ }
+
@@ -4583,6 +4583,8 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len;
if (space_left < addrlen)
@@ -86821,12 +87089,12 @@ index 0000000..d41b5af
+}
diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c
new file mode 100644
-index 0000000..846aeb0
+index 0000000..414fe5e
--- /dev/null
+++ b/tools/gcc/colorize_plugin.c
-@@ -0,0 +1,148 @@
+@@ -0,0 +1,151 @@
+/*
-+ * Copyright 2012 by PaX Team <pageexec@freemail.hu>
++ * Copyright 2012-2013 by PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -86855,7 +87123,7 @@ index 0000000..846aeb0
+int plugin_is_GPL_compatible;
+
+static struct plugin_info colorize_plugin_info = {
-+ .version = "201203092200",
++ .version = "201302112000",
+ .help = NULL,
+};
+
@@ -86934,6 +87202,9 @@ index 0000000..846aeb0
+ .pass = {
+ .type = SIMPLE_IPA_PASS,
+ .name = "colorize_rearm",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = execute_colorize_rearm,
+ .sub = NULL,
@@ -86975,10 +87246,10 @@ index 0000000..846aeb0
+}
diff --git a/tools/gcc/constify_plugin.c b/tools/gcc/constify_plugin.c
new file mode 100644
-index 0000000..1742271
+index 0000000..c415c9d
--- /dev/null
+++ b/tools/gcc/constify_plugin.c
-@@ -0,0 +1,349 @@
+@@ -0,0 +1,359 @@
+/*
+ * Copyright 2011 by Emese Revfy <re.emese@gmail.com>
+ * Copyright 2011-2013 by PaX Team <pageexec@freemail.hu>
@@ -87019,7 +87290,7 @@ index 0000000..1742271
+int plugin_is_GPL_compatible;
+
+static struct plugin_info const_plugin_info = {
-+ .version = "201301150230",
++ .version = "201302112000",
+ .help = "no-constify\tturn off constification\n",
+};
+
@@ -87241,16 +87512,23 @@ index 0000000..1742271
+{
+ unsigned int ret = 0;
+ tree var;
-+ referenced_var_iterator rvi;
+
+#if BUILDING_GCC_VERSION == 4005
-+ FOR_EACH_REFERENCED_VAR(var, rvi) {
++ tree vars;
+#else
-+ FOR_EACH_REFERENCED_VAR(cfun, var, rvi) {
++ unsigned int i;
++#endif
++
++#if BUILDING_GCC_VERSION == 4005
++ for (vars = cfun->local_decls; vars; vars = TREE_CHAIN(vars)) {
++ var = TREE_VALUE(vars);
++#else
++ FOR_EACH_LOCAL_DECL(cfun, i, var) {
+#endif
+ tree type = TREE_TYPE(var);
+
-+ if (!DECL_P(var) || TREE_STATIC(var) || DECL_EXTERNAL(var))
++ gcc_assert(DECL_P(var));
++ if (is_global_var(var))
+ continue;
+
+ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE)
@@ -87262,8 +87540,8 @@ index 0000000..1742271
+// if (lookup_attribute("no_const", DECL_ATTRIBUTES(var)))
+// continue;
+
-+// if (lookup_attribute("no_const", TYPE_ATTRIBUTES(type)))
-+// continue;
++ if (lookup_attribute("no_const", TYPE_ATTRIBUTES(type)))
++ continue;
+
+ if (walk_struct(type)) {
+ error_at(DECL_SOURCE_LOCATION(var), "constified variable %qE cannot be local", var);
@@ -87277,6 +87555,9 @@ index 0000000..1742271
+ {
+ .type = GIMPLE_PASS,
+ .name = "check_local_variables",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = check_local_variables,
+ .sub = NULL,
@@ -87430,12 +87711,12 @@ index 0000000..e518932
+exit 0
diff --git a/tools/gcc/kallocstat_plugin.c b/tools/gcc/kallocstat_plugin.c
new file mode 100644
-index 0000000..a86e422
+index 0000000..568b360
--- /dev/null
+++ b/tools/gcc/kallocstat_plugin.c
-@@ -0,0 +1,167 @@
+@@ -0,0 +1,170 @@
+/*
-+ * Copyright 2011 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -87487,7 +87768,7 @@ index 0000000..a86e422
+};
+
+static struct plugin_info kallocstat_plugin_info = {
-+ .version = "201111150100",
++ .version = "201302112000",
+};
+
+static unsigned int execute_kallocstat(void);
@@ -87496,6 +87777,9 @@ index 0000000..a86e422
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "kallocstat",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = execute_kallocstat,
+ .sub = NULL,
@@ -87603,12 +87887,12 @@ index 0000000..a86e422
+}
diff --git a/tools/gcc/kernexec_plugin.c b/tools/gcc/kernexec_plugin.c
new file mode 100644
-index 0000000..8856202
+index 0000000..0408e06
--- /dev/null
+++ b/tools/gcc/kernexec_plugin.c
-@@ -0,0 +1,432 @@
+@@ -0,0 +1,465 @@
+/*
-+ * Copyright 2011 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -87651,10 +87935,14 @@ index 0000000..8856202
+#define ANY_RETURN_P(rtx) (GET_CODE(rtx) == RETURN)
+#endif
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+int plugin_is_GPL_compatible;
+
+static struct plugin_info kernexec_plugin_info = {
-+ .version = "201111291120",
++ .version = "201302112000",
+ .help = "method=[bts|or]\tinstrumentation method\n"
+};
+
@@ -87670,6 +87958,9 @@ index 0000000..8856202
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "kernexec_reload",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = kernexec_cmodel_check,
+ .execute = execute_kernexec_reload,
+ .sub = NULL,
@@ -87688,6 +87979,9 @@ index 0000000..8856202
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "kernexec_fptr",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = kernexec_cmodel_check,
+ .execute = execute_kernexec_fptr,
+ .sub = NULL,
@@ -87706,6 +88000,9 @@ index 0000000..8856202
+ .pass = {
+ .type = RTL_PASS,
+ .name = "kernexec_retaddr",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = kernexec_cmodel_check,
+ .execute = execute_kernexec_retaddr,
+ .sub = NULL,
@@ -87803,8 +88100,10 @@ index 0000000..8856202
+
+ // create temporary unsigned long variable used for bitops and cast fptr to it
+ intptr = create_tmp_var(long_unsigned_type_node, "kernexec_bts");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(intptr);
+ mark_sym_for_renaming(intptr);
++#endif
+ assign_intptr = gimple_build_assign(intptr, fold_convert(long_unsigned_type_node, old_fptr));
+ gsi_insert_before(gsi, assign_intptr, GSI_SAME_STMT);
+ update_stmt(assign_intptr);
@@ -87818,8 +88117,10 @@ index 0000000..8856202
+
+ // cast temporary unsigned long back to a temporary fptr variable
+ new_fptr = create_tmp_var(TREE_TYPE(old_fptr), "kernexec_fptr");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(new_fptr);
+ mark_sym_for_renaming(new_fptr);
++#endif
+ assign_new_fptr = gimple_build_assign(new_fptr, fold_convert(TREE_TYPE(old_fptr), intptr));
+ gsi_insert_before(gsi, assign_new_fptr, GSI_SAME_STMT);
+ update_stmt(assign_new_fptr);
@@ -87833,24 +88134,36 @@ index 0000000..8856202
+{
+ gimple asm_or_stmt, call_stmt;
+ tree old_fptr, new_fptr, input, output;
++#if BUILDING_GCC_VERSION <= 4007
+ VEC(tree, gc) *inputs = NULL;
+ VEC(tree, gc) *outputs = NULL;
++#else
++ vec<tree, va_gc> *inputs = NULL;
++ vec<tree, va_gc> *outputs = NULL;
++#endif
+
+ call_stmt = gsi_stmt(*gsi);
+ old_fptr = gimple_call_fn(call_stmt);
+
+ // create temporary fptr variable
+ new_fptr = create_tmp_var(TREE_TYPE(old_fptr), "kernexec_or");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(new_fptr);
+ mark_sym_for_renaming(new_fptr);
++#endif
+
+ // build asm volatile("orq %%r10, %0\n\t" : "=r"(new_fptr) : "0"(old_fptr));
+ input = build_tree_list(NULL_TREE, build_string(2, "0"));
+ input = chainon(NULL_TREE, build_tree_list(input, old_fptr));
+ output = build_tree_list(NULL_TREE, build_string(3, "=r"));
+ output = chainon(NULL_TREE, build_tree_list(output, new_fptr));
++#if BUILDING_GCC_VERSION <= 4007
+ VEC_safe_push(tree, gc, inputs, input);
+ VEC_safe_push(tree, gc, outputs, output);
++#else
++ vec_safe_push(inputs, input);
++ vec_safe_push(outputs, output);
++#endif
+ asm_or_stmt = gimple_build_asm_vec("orq %%r10, %0\n\t", inputs, outputs, NULL, NULL);
+ gimple_asm_set_volatile(asm_or_stmt, true);
+ gsi_insert_before(gsi, asm_or_stmt, GSI_SAME_STMT);
@@ -87888,9 +88201,13 @@ index 0000000..8856202
+ gcc_unreachable();
+
+ // ... through a function pointer
-+ fn = SSA_NAME_VAR(fn);
-+ if (TREE_CODE(fn) != VAR_DECL && TREE_CODE(fn) != PARM_DECL)
-+ continue;
++ if (SSA_NAME_VAR(fn) != NULL_TREE) {
++ fn = SSA_NAME_VAR(fn);
++ if (TREE_CODE(fn) != VAR_DECL && TREE_CODE(fn) != PARM_DECL) {
++ debug_tree(fn);
++ gcc_unreachable();
++ }
++ }
+ fn = TREE_TYPE(fn);
+ if (TREE_CODE(fn) != POINTER_TYPE)
+ continue;
@@ -88041,12 +88358,12 @@ index 0000000..8856202
+}
diff --git a/tools/gcc/latent_entropy_plugin.c b/tools/gcc/latent_entropy_plugin.c
new file mode 100644
-index 0000000..b8008f7
+index 0000000..1276616
--- /dev/null
+++ b/tools/gcc/latent_entropy_plugin.c
-@@ -0,0 +1,295 @@
+@@ -0,0 +1,321 @@
+/*
-+ * Copyright 2012 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2012-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -88086,12 +88403,16 @@ index 0000000..b8008f7
+#include "emit-rtl.h"
+#include "tree-flow.h"
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+int plugin_is_GPL_compatible;
+
+static tree latent_entropy_decl;
+
+static struct plugin_info latent_entropy_plugin_info = {
-+ .version = "201207271820",
++ .version = "201302112000",
+ .help = NULL
+};
+
@@ -88102,6 +88423,9 @@ index 0000000..b8008f7
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "latent_entropy",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = gate_latent_entropy,
+ .execute = execute_latent_entropy,
+ .sub = NULL,
@@ -88197,7 +88521,9 @@ index 0000000..b8008f7
+ op = get_op(&rhs);
+ addxorrol = fold_build2_loc(UNKNOWN_LOCATION, op, unsigned_intDI_type_node, local_entropy, rhs);
+ assign = gimple_build_assign(local_entropy, addxorrol);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+//debug_bb(bb);
+ gsi = gsi_after_labels(bb);
+ gsi_insert_before(&gsi, assign, GSI_NEW_STMT);
@@ -88212,12 +88538,16 @@ index 0000000..b8008f7
+
+ // 1. create temporary copy of latent_entropy
+ temp = create_tmp_var(unsigned_intDI_type_node, "temp_latent_entropy");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(temp);
+ mark_sym_for_renaming(temp);
++#endif
+
+ // 2. read...
+ assign = gimple_build_assign(temp, latent_entropy_decl);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi = gsi_after_labels(bb);
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
@@ -88225,13 +88555,17 @@ index 0000000..b8008f7
+ // 3. ...modify...
+ addxorrol = fold_build2_loc(UNKNOWN_LOCATION, get_op(NULL), unsigned_intDI_type_node, temp, rhs);
+ assign = gimple_build_assign(temp, addxorrol);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
+
+ // 4. ...write latent_entropy
+ assign = gimple_build_assign(latent_entropy_decl, temp);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
+}
@@ -88246,8 +88580,13 @@ index 0000000..b8008f7
+ if (!latent_entropy_decl) {
+ struct varpool_node *node;
+
++#if BUILDING_GCC_VERSION <= 4007
+ for (node = varpool_nodes; node; node = node->next) {
+ tree var = node->decl;
++#else
++ FOR_EACH_VARIABLE(node) {
++ tree var = node->symbol.decl;
++#endif
+ if (strcmp(IDENTIFIER_POINTER(DECL_NAME(var)), "latent_entropy"))
+ continue;
+ latent_entropy_decl = var;
@@ -88264,8 +88603,10 @@ index 0000000..b8008f7
+
+ // 1. create local entropy variable
+ local_entropy = create_tmp_var(unsigned_intDI_type_node, "local_entropy");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(local_entropy);
+ mark_sym_for_renaming(local_entropy);
++#endif
+
+ // 2. initialize local entropy variable
+ bb = split_block_after_labels(ENTRY_BLOCK_PTR)->dest;
@@ -88275,7 +88616,9 @@ index 0000000..b8008f7
+
+ assign = gimple_build_assign(local_entropy, build_int_cstu(unsigned_intDI_type_node, get_random_const()));
+// gimple_set_location(assign, loc);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
+ bb = bb->next_bb;
@@ -91734,10 +92077,10 @@ index 0000000..a8203dd
+atyfb_setup_generic_49151 atyfb_setup_generic 3 49151 NULL
diff --git a/tools/gcc/size_overflow_plugin.c b/tools/gcc/size_overflow_plugin.c
new file mode 100644
-index 0000000..792ee60
+index 0000000..d52f2ee
--- /dev/null
+++ b/tools/gcc/size_overflow_plugin.c
-@@ -0,0 +1,1930 @@
+@@ -0,0 +1,1941 @@
+/*
+ * Copyright 2011, 2012 by Emese Revfy <re.emese@gmail.com>
+ * Licensed under the GPL v2, or (at your option) v3
@@ -91778,6 +92121,10 @@ index 0000000..792ee60
+#define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP)
+#endif
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+struct size_overflow_hash {
+ const struct size_overflow_hash * const next;
+ const char * const name;
@@ -92130,8 +92477,10 @@ index 0000000..792ee60
+{
+ tree new_var = create_tmp_var(type, "cicus");
+
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(new_var);
+ mark_sym_for_renaming(new_var);
++#endif
+ return new_var;
+}
+
@@ -92351,11 +92700,13 @@ index 0000000..792ee60
+ basic_block bb;
+ gimple phi;
+ gimple_stmt_iterator gsi = gsi_for_stmt(oldstmt);
++ gimple_seq seq;
+
+ bb = gsi_bb(gsi);
+
+ phi = create_phi_node(result, bb);
-+ gsi = gsi_last(phi_nodes(bb));
++ seq = phi_nodes(bb);
++ gsi = gsi_last(seq);
+ gsi_remove(&gsi, false);
+
+ gsi = gsi_for_stmt(oldstmt);
@@ -93595,13 +93946,16 @@ index 0000000..792ee60
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "size_overflow",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = handle_function,
+ .sub = NULL,
+ .next = NULL,
+ .static_pass_number = 0,
+ .tv_id = TV_NONE,
-+ .properties_required = PROP_cfg | PROP_referenced_vars,
++ .properties_required = PROP_cfg,
+ .properties_provided = 0,
+ .properties_destroyed = 0,
+ .todo_flags_start = 0,
@@ -93670,12 +94024,12 @@ index 0000000..792ee60
+}
diff --git a/tools/gcc/stackleak_plugin.c b/tools/gcc/stackleak_plugin.c
new file mode 100644
-index 0000000..38d2014
+index 0000000..ac2901e
--- /dev/null
+++ b/tools/gcc/stackleak_plugin.c
-@@ -0,0 +1,313 @@
+@@ -0,0 +1,327 @@
+/*
-+ * Copyright 2011 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -93713,6 +94067,10 @@ index 0000000..38d2014
+#include "rtl.h"
+#include "emit-rtl.h"
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+extern void print_gimple_stmt(FILE *, gimple, int, int);
+
+int plugin_is_GPL_compatible;
@@ -93723,7 +94081,7 @@ index 0000000..38d2014
+static bool init_locals;
+
+static struct plugin_info stackleak_plugin_info = {
-+ .version = "201203140940",
++ .version = "201302112000",
+ .help = "track-lowest-sp=nn\ttrack sp in functions whose frame size is at least nn bytes\n"
+// "initialize-locals\t\tforcibly initialize all stack frames\n"
+};
@@ -93736,6 +94094,9 @@ index 0000000..38d2014
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "stackleak_tree_instrument",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = gate_stackleak_track_stack,
+ .execute = execute_stackleak_tree_instrument,
+ .sub = NULL,
@@ -93754,6 +94115,9 @@ index 0000000..38d2014
+ .pass = {
+ .type = RTL_PASS,
+ .name = "stackleak_final",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = gate_stackleak_track_stack,
+ .execute = execute_stackleak_final,
+ .sub = NULL,
@@ -93890,7 +94254,7 @@ index 0000000..38d2014
+
+static unsigned int execute_stackleak_final(void)
+{
-+ rtx insn;
++ rtx insn, next;
+
+ if (cfun->calls_alloca)
+ return 0;
@@ -93900,10 +94264,11 @@ index 0000000..38d2014
+ return 0;
+
+ // 1. find pax_track_stack calls
-+ for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) {
++ for (insn = get_insns(); insn; insn = next) {
+ // rtl match: (call_insn 8 7 9 3 (call (mem (symbol_ref ("pax_track_stack") [flags 0x41] <function_decl 0xb7470e80 pax_track_stack>) [0 S1 A8]) (4)) -1 (nil) (nil))
+ rtx body;
+
++ next = NEXT_INSN(insn);
+ if (!CALL_P(insn))
+ continue;
+ body = PATTERN(insn);
@@ -93919,10 +94284,13 @@ index 0000000..38d2014
+ continue;
+// warning(0, "track_frame_size: %d %ld %d", cfun->calls_alloca, get_frame_size(), track_frame_size);
+ // 2. delete call
-+ insn = delete_insn_and_edges(insn);
++ delete_insn_and_edges(insn);
+#if BUILDING_GCC_VERSION >= 4007
-+ if (GET_CODE(insn) == NOTE && NOTE_KIND(insn) == NOTE_INSN_CALL_ARG_LOCATION)
-+ insn = delete_insn_and_edges(insn);
++ if (GET_CODE(next) == NOTE && NOTE_KIND(next) == NOTE_INSN_CALL_ARG_LOCATION) {
++ insn = next;
++ next = NEXT_INSN(insn);
++ delete_insn_and_edges(insn);
++ }
+#endif
+ }
+
diff --git a/3.7.6/0000_README b/3.7.8/0000_README
index b813abb..c6ec76a 100644
--- a/3.7.6/0000_README
+++ b/3.7.8/0000_README
@@ -2,7 +2,7 @@ README
-----------------------------------------------------------------------------
Individual Patch Descriptions:
-----------------------------------------------------------------------------
-Patch: 4420_grsecurity-2.9.1-3.7.6-201302092141.patch
+Patch: 4420_grsecurity-2.9.1-3.7.8-201302161158.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.7.6/4420_grsecurity-2.9.1-3.7.6-201302092141.patch b/3.7.8/4420_grsecurity-2.9.1-3.7.8-201302161158.patch
index d770adf..652bbf8 100644
--- a/3.7.6/4420_grsecurity-2.9.1-3.7.6-201302092141.patch
+++ b/3.7.8/4420_grsecurity-2.9.1-3.7.8-201302161158.patch
@@ -251,7 +251,7 @@ index 9776f06..18b1856 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index b6de2ea..5ba90ee 100644
+index ad48987..d808c2d 100644
--- a/Makefile
+++ b/Makefile
@@ -241,8 +241,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -1952,7 +1952,7 @@ index 486a15a..d95523a 100644
/*
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
-index 1e9be5d..ef22b26 100644
+index 1e9be5d..03edbc2 100644
--- a/arch/arm/kernel/module.c
+++ b/arch/arm/kernel/module.c
@@ -37,12 +37,37 @@
@@ -1962,7 +1962,7 @@ index 1e9be5d..ef22b26 100644
-void *module_alloc(unsigned long size)
+static inline void *__module_alloc(unsigned long size, pgprot_t prot)
{
-+ if (!size || PAGE_ALIGN(size) > (MODULES_END - MODULES_VADDR))
++ if (!size || PAGE_ALIGN(size) > MODULES_END - MODULES_VADDR)
+ return NULL;
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
- GFP_KERNEL, PAGE_KERNEL_EXEC, -1,
@@ -9880,7 +9880,7 @@ index efc6a95..95abfe2 100644
err |= copy_siginfo_to_user32(&frame->info, info);
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
-index 076745f..ae8f6cb 100644
+index e7fa545..9e6fe1a 100644
--- a/arch/x86/ia32/ia32entry.S
+++ b/arch/x86/ia32/ia32entry.S
@@ -15,8 +15,10 @@
@@ -10026,7 +10026,7 @@ index 076745f..ae8f6cb 100644
+ testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r11)
jnz ia32_ret_from_sys_call
TRACE_IRQS_ON
- sti
+ ENABLE_INTERRUPTS(CLBR_NONE)
@@ -215,11 +263,12 @@ sysexit_from_sys_call:
1: setbe %al /* 1 if error, 0 if not */
movzbl %al,%edi /* zero-extend that into %edi */
@@ -10034,7 +10034,7 @@ index 076745f..ae8f6cb 100644
+ GET_THREAD_INFO(%r11)
movq RAX-ARGOFFSET(%rsp),%rax /* reload syscall return value */
movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
- cli
+ DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF
- testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET)
+ testl %edi,TI_flags(%r11)
@@ -10315,7 +10315,7 @@ index 58ed6d9..f1cbe58 100644
ALTINSTR_REPLACEMENT(newinstr2, feature2, 2) \
".popsection"
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
-index 3388034..ba52312 100644
+index 3388034..050f0b9 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -44,7 +44,7 @@ static inline void generic_apic_probe(void)
@@ -10327,15 +10327,6 @@ index 3388034..ba52312 100644
extern int local_apic_timer_c2_ok;
extern int disable_apic;
-@@ -391,7 +391,7 @@ struct apic {
- */
- int (*x86_32_numa_cpu_node)(int cpu);
- #endif
--};
-+} __do_const;
-
- /*
- * Pointer to the local APIC driver in use on this system (there's
diff --git a/arch/x86/include/asm/apm.h b/arch/x86/include/asm/apm.h
index 20370c6..a2eb9b0 100644
--- a/arch/x86/include/asm/apm.h
@@ -11967,19 +11958,6 @@ index d3ddd17..c9fb0cc 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 b2e11f4..f293e2e 100644
---- a/arch/x86/include/asm/kvm_host.h
-+++ b/arch/x86/include/asm/kvm_host.h
-@@ -707,7 +707,7 @@ struct kvm_x86_ops {
- int (*check_intercept)(struct kvm_vcpu *vcpu,
- struct x86_instruction_info *info,
- enum x86_intercept_stage stage);
--};
-+} __do_const;
-
- struct kvm_arch_async_pf {
- u32 token;
diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h
index c8bed0d..85c03fd 100644
--- a/arch/x86/include/asm/local.h
@@ -12525,9 +12503,45 @@ index a0facf3..c017b15 100644
#endif /* __ASSEMBLY__ */
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
-index 142236e..57cf5ea 100644
+index 142236e..5446ffbc 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
+@@ -84,7 +84,7 @@ struct pv_init_ops {
+ */
+ unsigned (*patch)(u8 type, u16 clobber, void *insnbuf,
+ unsigned long addr, unsigned len);
+-};
++} __no_const;
+
+
+ struct pv_lazy_ops {
+@@ -97,7 +97,7 @@ struct pv_time_ops {
+ unsigned long long (*sched_clock)(void);
+ unsigned long long (*steal_clock)(int cpu);
+ unsigned long (*get_tsc_khz)(void);
+-};
++} __no_const;
+
+ struct pv_cpu_ops {
+ /* hooks for various privileged instructions */
+@@ -191,7 +191,7 @@ struct pv_cpu_ops {
+
+ void (*start_context_switch)(struct task_struct *prev);
+ void (*end_context_switch)(struct task_struct *next);
+-};
++} __no_const;
+
+ struct pv_irq_ops {
+ /*
+@@ -222,7 +222,7 @@ struct pv_apic_ops {
+ unsigned long start_eip,
+ unsigned long start_esp);
+ #endif
+-};
++} __no_const;
+
+ struct pv_mmu_ops {
+ unsigned long (*read_cr2)(void);
@@ -312,6 +312,7 @@ struct pv_mmu_ops {
struct paravirt_callee_save make_pud;
@@ -12549,6 +12563,15 @@ index 142236e..57cf5ea 100644
};
struct arch_spinlock;
+@@ -333,7 +340,7 @@ struct pv_lock_ops {
+ void (*spin_lock_flags)(struct arch_spinlock *lock, unsigned long flags);
+ int (*spin_trylock)(struct arch_spinlock *lock);
+ void (*spin_unlock)(struct arch_spinlock *lock);
+-};
++} __no_const;
+
+ /* This contains all the paravirt structures: we get a convenient
+ * number for each function using the offset which we use to indicate
diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h
index b4389a4..7024269 100644
--- a/arch/x86/include/asm/pgalloc.h
@@ -12639,7 +12662,7 @@ index 4cc9f2b..5fd9226 100644
/*
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
-index a1f780d..a3eb32f 100644
+index a1f780d..9f6c8dd 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -44,6 +44,7 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
@@ -12702,7 +12725,19 @@ index a1f780d..a3eb32f 100644
static inline int pte_dirty(pte_t pte)
{
return pte_flags(pte) & _PAGE_DIRTY;
-@@ -195,9 +235,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
+@@ -142,6 +182,11 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
+ return (pmd_val(pmd) & PTE_PFN_MASK) >> PAGE_SHIFT;
+ }
+
++static inline unsigned long pud_pfn(pud_t pud)
++{
++ return (pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT;
++}
++
+ #define pte_page(pte) pfn_to_page(pte_pfn(pte))
+
+ static inline int pmd_large(pmd_t pte)
+@@ -195,9 +240,29 @@ static inline pte_t pte_wrprotect(pte_t pte)
return pte_clear_flags(pte, _PAGE_RW);
}
@@ -12733,7 +12768,7 @@ index a1f780d..a3eb32f 100644
}
static inline pte_t pte_mkdirty(pte_t pte)
-@@ -389,6 +449,15 @@ pte_t *populate_extra_pte(unsigned long vaddr);
+@@ -389,6 +454,15 @@ pte_t *populate_extra_pte(unsigned long vaddr);
#endif
#ifndef __ASSEMBLY__
@@ -12749,7 +12784,7 @@ index a1f780d..a3eb32f 100644
#include <linux/mm_types.h>
static inline int pte_none(pte_t pte)
-@@ -565,7 +634,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
+@@ -565,7 +639,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
static inline int pgd_bad(pgd_t pgd)
{
@@ -12758,7 +12793,7 @@ index a1f780d..a3eb32f 100644
}
static inline int pgd_none(pgd_t pgd)
-@@ -588,7 +657,12 @@ static inline int pgd_none(pgd_t pgd)
+@@ -588,7 +662,12 @@ static inline int pgd_none(pgd_t pgd)
* pgd_offset() returns a (pgd_t *)
* pgd_index() is used get the offset into the pgd page's array of pgd_t's;
*/
@@ -12772,7 +12807,7 @@ index a1f780d..a3eb32f 100644
/*
* a shortcut which implies the use of the kernel's pgd, instead
* of a process's
-@@ -599,6 +673,20 @@ static inline int pgd_none(pgd_t pgd)
+@@ -599,6 +678,20 @@ static inline int pgd_none(pgd_t pgd)
#define KERNEL_PGD_BOUNDARY pgd_index(PAGE_OFFSET)
#define KERNEL_PGD_PTRS (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY)
@@ -12793,7 +12828,7 @@ index a1f780d..a3eb32f 100644
#ifndef __ASSEMBLY__
extern int direct_gbpages;
-@@ -763,11 +851,23 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm,
+@@ -763,11 +856,23 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm,
* dst and src can be on the same page, but the range must not overlap,
* and must not cross a page boundary.
*/
@@ -13287,10 +13322,10 @@ index fe1ec5b..dc5c3fe 100644
u32 gdt_base;
#else
diff --git a/arch/x86/include/asm/reboot.h b/arch/x86/include/asm/reboot.h
-index a82c4f1..f9c9696 100644
+index a82c4f1..ac45053 100644
--- a/arch/x86/include/asm/reboot.h
+++ b/arch/x86/include/asm/reboot.h
-@@ -6,12 +6,12 @@
+@@ -6,13 +6,13 @@
struct pt_regs;
struct machine_ops {
@@ -13303,10 +13338,12 @@ index a82c4f1..f9c9696 100644
void (*shutdown)(void);
void (*crash_shutdown)(struct pt_regs *);
- void (*emergency_restart)(void);
+-};
+ void (* __noreturn emergency_restart)(void);
- };
++} __no_const;
extern struct machine_ops machine_ops;
+
diff --git a/arch/x86/include/asm/rwsem.h b/arch/x86/include/asm/rwsem.h
index 2dbe4a7..ce1db00 100644
--- a/arch/x86/include/asm/rwsem.h
@@ -13507,7 +13544,7 @@ index c48a950..c6d7468 100644
#endif /* !__ASSEMBLY__ */
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h
-index 4f19a15..e04d86f 100644
+index 4f19a15..9e14f27 100644
--- a/arch/x86/include/asm/smp.h
+++ b/arch/x86/include/asm/smp.h
@@ -36,7 +36,7 @@ DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_map);
@@ -13519,6 +13556,15 @@ index 4f19a15..e04d86f 100644
static inline struct cpumask *cpu_sibling_mask(int cpu)
{
+@@ -79,7 +79,7 @@ struct smp_ops {
+
+ void (*send_call_func_ipi)(const struct cpumask *mask);
+ void (*send_call_func_single_ipi)(int cpu);
+-};
++} __no_const;
+
+ /* Globals due to paravirt */
+ extern void set_cpu_sibling_map(int cpu);
@@ -190,14 +190,8 @@ extern unsigned disabled_cpus __cpuinitdata;
extern int safe_smp_processor_id(void);
@@ -14714,6 +14760,54 @@ index 5b238981..77fdd78 100644
};
#define WORD_AT_A_TIME_CONSTANTS { REPEAT_BYTE(0x01), REPEAT_BYTE(0x80) }
+diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
+index 5769349..a3d3e2a 100644
+--- a/arch/x86/include/asm/x86_init.h
++++ b/arch/x86/include/asm/x86_init.h
+@@ -141,7 +141,7 @@ struct x86_init_ops {
+ struct x86_init_timers timers;
+ struct x86_init_iommu iommu;
+ struct x86_init_pci pci;
+-};
++} __no_const;
+
+ /**
+ * struct x86_cpuinit_ops - platform specific cpu hotplug setups
+@@ -152,7 +152,7 @@ struct x86_cpuinit_ops {
+ void (*setup_percpu_clockev)(void);
+ void (*early_percpu_clock_init)(void);
+ void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node);
+-};
++} __no_const;
+
+ /**
+ * struct x86_platform_ops - platform specific runtime functions
+@@ -178,7 +178,7 @@ struct x86_platform_ops {
+ void (*save_sched_clock_state)(void);
+ void (*restore_sched_clock_state)(void);
+ void (*apic_post_init)(void);
+-};
++} __no_const;
+
+ struct pci_dev;
+
+@@ -187,14 +187,14 @@ struct x86_msi_ops {
+ void (*teardown_msi_irq)(unsigned int irq);
+ void (*teardown_msi_irqs)(struct pci_dev *dev);
+ void (*restore_msi_irqs)(struct pci_dev *dev, int irq);
+-};
++} __no_const;
+
+ struct x86_io_apic_ops {
+ void (*init) (void);
+ unsigned int (*read) (unsigned int apic, unsigned int reg);
+ void (*write) (unsigned int apic, unsigned int reg, unsigned int value);
+ void (*modify)(unsigned int apic, unsigned int reg, unsigned int value);
+-};
++} __no_const;
+
+ extern struct x86_init_ops x86_init;
+ extern struct x86_cpuinit_ops x86_cpuinit;
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h
index 0415cda..b43d877 100644
--- a/arch/x86/include/asm/xsave.h
@@ -14759,19 +14853,6 @@ index 91ce48f..a48ea05 100644
obj-$(CONFIG_X86_64) += sys_x86_64.o x8664_ksyms_64.o
obj-y += syscall_$(BITS).o
obj-$(CONFIG_X86_64) += vsyscall_64.o
-diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
-index e651f7a..c995dc4 100644
---- a/arch/x86/kernel/acpi/boot.c
-+++ b/arch/x86/kernel/acpi/boot.c
-@@ -1576,7 +1576,7 @@ int __init acpi_boot_init(void)
- acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet);
-
- if (!acpi_noirq)
-- x86_init.pci.init = pci_acpi_init;
-+ *(void **)&x86_init.pci.init = pci_acpi_init;
-
- return 0;
- }
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 11676cf..a8cf3ec 100644
--- a/arch/x86/kernel/acpi/sleep.c
@@ -14946,34 +15027,8 @@ index ef5ccca..bd83949 100644
return addr;
}
-diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c
-index e663112..21938a3 100644
---- a/arch/x86/kernel/amd_gart_64.c
-+++ b/arch/x86/kernel/amd_gart_64.c
-@@ -851,7 +851,7 @@ int __init gart_iommu_init(void)
-
- flush_gart();
- dma_ops = &gart_dma_ops;
-- x86_platform.iommu_shutdown = gart_iommu_shutdown;
-+ *(void **)&x86_platform.iommu_shutdown = gart_iommu_shutdown;
- swiotlb = 0;
-
- return 0;
-diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c
-index d5fd66f..6119b16 100644
---- a/arch/x86/kernel/aperture_64.c
-+++ b/arch/x86/kernel/aperture_64.c
-@@ -390,7 +390,7 @@ int __init gart_iommu_hole_init(void)
-
- iommu_detected = 1;
- gart_iommu_aperture = 1;
-- x86_init.iommu.iommu_init = gart_iommu_init;
-+ *(void **)&x86_init.iommu.iommu_init = gart_iommu_init;
-
- ctl = read_pci_config(bus, slot, 3,
- AMD64_GARTAPERTURECTL);
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
-index b17416e..be6e5dc 100644
+index b17416e..5ed0f3e 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -185,7 +185,7 @@ int first_system_vector = 0xfe;
@@ -14994,30 +15049,64 @@ index b17416e..be6e5dc 100644
apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x(%02x)",
smp_processor_id(), v0 , v1);
-@@ -2155,7 +2155,9 @@ void __init apic_set_eoi_write(void (*eoi_write)(u32 reg, u32 v))
- for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
- /* Should happen once for each apic */
- WARN_ON((*drv)->eoi_write == eoi_write);
-- (*drv)->eoi_write = eoi_write;
-+ pax_open_kernel();
-+ *(void **)&(*drv)->eoi_write = eoi_write;
-+ pax_close_kernel();
- }
+diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c
+index 00c77cf..2dc6a2d 100644
+--- a/arch/x86/kernel/apic/apic_flat_64.c
++++ b/arch/x86/kernel/apic/apic_flat_64.c
+@@ -157,7 +157,7 @@ static int flat_probe(void)
+ return 1;
}
-diff --git a/arch/x86/kernel/apic/apic_numachip.c b/arch/x86/kernel/apic/apic_numachip.c
-index a65829a..6ddc249 100644
---- a/arch/x86/kernel/apic/apic_numachip.c
-+++ b/arch/x86/kernel/apic/apic_numachip.c
-@@ -178,7 +178,7 @@ static int __init numachip_system_init(void)
- if (!numachip_system)
- return 0;
+-static struct apic apic_flat = {
++static struct apic apic_flat __read_only = {
+ .name = "flat",
+ .probe = flat_probe,
+ .acpi_madt_oem_check = flat_acpi_madt_oem_check,
+@@ -271,7 +271,7 @@ static int physflat_probe(void)
+ return 0;
+ }
+
+-static struct apic apic_physflat = {
++static struct apic apic_physflat __read_only = {
-- x86_cpuinit.fixup_cpu_id = fixup_cpu_id;
-+ *(void **)&x86_cpuinit.fixup_cpu_id = fixup_cpu_id;
+ .name = "physical flat",
+ .probe = physflat_probe,
+diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c
+index d50e364..543bee3 100644
+--- a/arch/x86/kernel/apic/bigsmp_32.c
++++ b/arch/x86/kernel/apic/bigsmp_32.c
+@@ -152,7 +152,7 @@ static int probe_bigsmp(void)
+ return dmi_bigsmp;
+ }
+
+-static struct apic apic_bigsmp = {
++static struct apic apic_bigsmp __read_only = {
- map_csrs();
+ .name = "bigsmp",
+ .probe = probe_bigsmp,
+diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c
+index 0874799..24a836e 100644
+--- a/arch/x86/kernel/apic/es7000_32.c
++++ b/arch/x86/kernel/apic/es7000_32.c
+@@ -608,8 +608,7 @@ static int es7000_mps_oem_check_cluster(struct mpc_table *mpc, char *oem,
+ return ret && es7000_apic_is_cluster();
+ }
+-/* We've been warned by a false positive warning.Use __refdata to keep calm. */
+-static struct apic __refdata apic_es7000_cluster = {
++static struct apic apic_es7000_cluster __read_only = {
+
+ .name = "es7000",
+ .probe = probe_es7000,
+@@ -675,7 +674,7 @@ static struct apic __refdata apic_es7000_cluster = {
+ .x86_32_early_logical_apicid = es7000_early_logical_apicid,
+ };
+
+-static struct apic __refdata apic_es7000 = {
++static struct apic __refdata apic_es7000 __read_only = {
+
+ .name = "es7000",
+ .probe = probe_es7000,
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 1817fa9..7bff097 100644
--- a/arch/x86/kernel/apic/io_apic.c
@@ -15059,47 +15148,84 @@ index 1817fa9..7bff097 100644
eoi_ioapic_irq(irq, cfg);
}
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c
-index d661ee9..512c0a1 100644
+index d661ee9..791fd33 100644
--- a/arch/x86/kernel/apic/numaq_32.c
+++ b/arch/x86/kernel/apic/numaq_32.c
-@@ -257,14 +257,14 @@ static __init void early_check_numaq(void)
- early_get_smp_config();
-
- if (found_numaq) {
-- x86_init.mpparse.mpc_record = numaq_mpc_record;
-- x86_init.mpparse.setup_ioapic_ids = x86_init_noop;
-- x86_init.mpparse.mpc_apic_id = mpc_apic_id;
-- x86_init.mpparse.smp_read_mpc_oem = smp_read_mpc_oem;
-- x86_init.mpparse.mpc_oem_pci_bus = mpc_oem_pci_bus;
-- x86_init.mpparse.mpc_oem_bus_info = mpc_oem_bus_info;
-- x86_init.timers.tsc_pre_init = numaq_tsc_init;
-- x86_init.pci.init = pci_numaq_init;
-+ *(void **)&x86_init.mpparse.mpc_record = numaq_mpc_record;
-+ *(void **)&x86_init.mpparse.setup_ioapic_ids = x86_init_noop;
-+ *(void **)&x86_init.mpparse.mpc_apic_id = mpc_apic_id;
-+ *(void **)&x86_init.mpparse.smp_read_mpc_oem = smp_read_mpc_oem;
-+ *(void **)&x86_init.mpparse.mpc_oem_pci_bus = mpc_oem_pci_bus;
-+ *(void **)&x86_init.mpparse.mpc_oem_bus_info = mpc_oem_bus_info;
-+ *(void **)&x86_init.timers.tsc_pre_init = numaq_tsc_init;
-+ *(void **)&x86_init.pci.init = pci_numaq_init;
- }
+@@ -455,8 +455,7 @@ static void numaq_setup_portio_remap(void)
+ (u_long) xquad_portio, (u_long) num_quads*XQUAD_PORTIO_QUAD);
}
+-/* Use __refdata to keep false positive warning calm. */
+-static struct apic __refdata apic_numaq = {
++static struct apic apic_numaq __read_only = {
+
+ .name = "NUMAQ",
+ .probe = probe_numaq,
+diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c
+index eb35ef9..f184a21 100644
+--- a/arch/x86/kernel/apic/probe_32.c
++++ b/arch/x86/kernel/apic/probe_32.c
+@@ -72,7 +72,7 @@ static int probe_default(void)
+ return 1;
+ }
+
+-static struct apic apic_default = {
++static struct apic apic_default __read_only = {
+
+ .name = "default",
+ .probe = probe_default,
+diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c
+index 77c95c0..434f8a4 100644
+--- a/arch/x86/kernel/apic/summit_32.c
++++ b/arch/x86/kernel/apic/summit_32.c
+@@ -486,7 +486,7 @@ void setup_summit(void)
+ }
+ #endif
+
+-static struct apic apic_summit = {
++static struct apic apic_summit __read_only = {
+
+ .name = "summit",
+ .probe = probe_summit,
+diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c
+index c88baa4..a89def0 100644
+--- a/arch/x86/kernel/apic/x2apic_cluster.c
++++ b/arch/x86/kernel/apic/x2apic_cluster.c
+@@ -235,7 +235,7 @@ static void cluster_vector_allocation_domain(int cpu, struct cpumask *retmask,
+ cpumask_and(retmask, mask, per_cpu(cpus_in_cluster, cpu));
+ }
+
+-static struct apic apic_x2apic_cluster = {
++static struct apic apic_x2apic_cluster __read_only = {
+
+ .name = "cluster x2apic",
+ .probe = x2apic_cluster_probe,
+diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c
+index e03a1e1..0e41d28 100644
+--- a/arch/x86/kernel/apic/x2apic_phys.c
++++ b/arch/x86/kernel/apic/x2apic_phys.c
+@@ -88,7 +88,7 @@ static int x2apic_phys_probe(void)
+ return apic == &apic_x2apic_phys;
+ }
+
+-static struct apic apic_x2apic_phys = {
++static struct apic apic_x2apic_phys __read_only = {
+
+ .name = "physical x2apic",
+ .probe = x2apic_phys_probe,
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
-index 8cfade9..8ea7b51 100644
+index 8cfade9..b9d04fc 100644
--- a/arch/x86/kernel/apic/x2apic_uv_x.c
+++ b/arch/x86/kernel/apic/x2apic_uv_x.c
-@@ -139,8 +139,8 @@ static int __init uv_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
- is_uv1 ? UV1_HUB_REVISION_BASE : UV2_HUB_REVISION_BASE;
- pnodeid = early_get_pnodeid();
- early_get_apic_pnode_shift();
-- x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range;
-- x86_platform.nmi_init = uv_nmi_init;
-+ *(void **)&x86_platform.is_untracked_pat_range = uv_is_untracked_pat_range;
-+ *(void **)&x86_platform.nmi_init = uv_nmi_init;
- if (!strcmp(oem_table_id, "UVL"))
- uv_system_type = UV_LEGACY_APIC;
- else if (!strcmp(oem_table_id, "UVX"))
+@@ -333,7 +333,7 @@ static int uv_probe(void)
+ return apic == &apic_x2apic_uv_x;
+ }
+
+-static struct apic __refdata apic_x2apic_uv_x = {
++static struct apic apic_x2apic_uv_x __read_only = {
+
+ .name = "UV large system",
+ .probe = uv_probe,
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index d65464e..1035d31 100644
--- a/arch/x86/kernel/apm_32.c
@@ -15756,19 +15882,6 @@ index 324bb52..1a93d85 100644
}
intel_ds_init();
-diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
-index d22d0c4..088eb6f 100644
---- a/arch/x86/kernel/cpu/vmware.c
-+++ b/arch/x86/kernel/cpu/vmware.c
-@@ -79,7 +79,7 @@ static void __init vmware_platform_setup(void)
- VMWARE_PORT(GETHZ, eax, ebx, ecx, edx);
-
- if (ebx != UINT_MAX)
-- x86_platform.calibrate_tsc = vmware_get_tsc_khz;
-+ *(void **)&x86_platform.calibrate_tsc = vmware_get_tsc_khz;
- else
- printk(KERN_WARNING
- "Failed to get TSC freq from the hypervisor\n");
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
index 13ad899..f642b9a 100644
--- a/arch/x86/kernel/crash.c
@@ -18016,10 +18129,10 @@ index 1d41402..af9a46a 100644
return -EFAULT;
diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
-index c18f59d..69ddbc4 100644
+index c18f59d..9c0c9f6 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
-@@ -18,20 +18,20 @@
+@@ -18,6 +18,7 @@
#include <asm/io_apic.h>
#include <asm/bios_ebda.h>
#include <asm/tlbflush.h>
@@ -18027,14 +18140,7 @@ index c18f59d..69ddbc4 100644
static void __init i386_default_early_setup(void)
{
- /* Initialize 32bit specific setup functions */
-- x86_init.resources.reserve_resources = i386_reserve_resources;
-- x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc;
-+ *(void **)&x86_init.resources.reserve_resources = i386_reserve_resources;
-+ *(void **)&x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc;
-
- reserve_ebda_region();
- }
+@@ -30,8 +31,7 @@ static void __init i386_default_early_setup(void)
void __init i386_start_kernel(void)
{
@@ -19346,74 +19452,6 @@ index 57916c0..9e0b9d0 100644
return ret;
switch (val) {
-diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
-index 4180a87..4678e4f 100644
---- a/arch/x86/kernel/kvm.c
-+++ b/arch/x86/kernel/kvm.c
-@@ -267,7 +267,7 @@ static void __init paravirt_ops_setup(void)
- pv_info.paravirt_enabled = 1;
-
- if (kvm_para_has_feature(KVM_FEATURE_NOP_IO_DELAY))
-- pv_cpu_ops.io_delay = kvm_io_delay;
-+ *(void **)&pv_cpu_ops.io_delay = kvm_io_delay;
-
- #ifdef CONFIG_X86_IO_APIC
- no_timer_check = 1;
-@@ -461,18 +461,18 @@ void __init kvm_guest_init(void)
- for (i = 0; i < KVM_TASK_SLEEP_HASHSIZE; i++)
- spin_lock_init(&async_pf_sleepers[i].lock);
- if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF))
-- x86_init.irqs.trap_init = kvm_apf_trap_init;
-+ *(void **)&x86_init.irqs.trap_init = kvm_apf_trap_init;
-
- if (kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) {
- has_steal_clock = 1;
-- pv_time_ops.steal_clock = kvm_steal_clock;
-+ *(void **)&pv_time_ops.steal_clock = kvm_steal_clock;
- }
-
- if (kvm_para_has_feature(KVM_FEATURE_PV_EOI))
- apic_set_eoi_write(kvm_guest_apic_eoi_write);
-
- #ifdef CONFIG_SMP
-- smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
-+ *(void **)&smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
- register_cpu_notifier(&kvm_cpu_notifier);
- #else
- kvm_guest_cpu_init();
-diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
-index f1b42b3..27ac4e7 100644
---- a/arch/x86/kernel/kvmclock.c
-+++ b/arch/x86/kernel/kvmclock.c
-@@ -211,19 +211,19 @@ void __init kvmclock_init(void)
-
- if (kvm_register_clock("boot clock"))
- return;
-- pv_time_ops.sched_clock = kvm_clock_read;
-- x86_platform.calibrate_tsc = kvm_get_tsc_khz;
-- x86_platform.get_wallclock = kvm_get_wallclock;
-- x86_platform.set_wallclock = kvm_set_wallclock;
-+ *(void **)&pv_time_ops.sched_clock = kvm_clock_read;
-+ *(void **)&x86_platform.calibrate_tsc = kvm_get_tsc_khz;
-+ *(void **)&x86_platform.get_wallclock = kvm_get_wallclock;
-+ *(void **)&x86_platform.set_wallclock = kvm_set_wallclock;
- #ifdef CONFIG_X86_LOCAL_APIC
-- x86_cpuinit.early_percpu_clock_init =
-+ *(void **)&x86_cpuinit.early_percpu_clock_init =
- kvm_setup_secondary_clock;
- #endif
-- x86_platform.save_sched_clock_state = kvm_save_sched_clock_state;
-- x86_platform.restore_sched_clock_state = kvm_restore_sched_clock_state;
-- machine_ops.shutdown = kvm_shutdown;
-+ *(void **)&x86_platform.save_sched_clock_state = kvm_save_sched_clock_state;
-+ *(void **)&x86_platform.restore_sched_clock_state = kvm_restore_sched_clock_state;
-+ *(void **)&machine_ops.shutdown = kvm_shutdown;
- #ifdef CONFIG_KEXEC
-- machine_ops.crash_shutdown = kvm_crash_shutdown;
-+ *(void **)&machine_ops.crash_shutdown = kvm_crash_shutdown;
- #endif
- kvm_get_preset_lpj();
- clocksource_register_hz(&kvm_clock, NSEC_PER_SEC);
diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c
index ebc9873..1b9724b 100644
--- a/arch/x86/kernel/ldt.c
@@ -19534,7 +19572,7 @@ index 3544aed..01ddc1c 100644
static void microcode_fini_cpu(int cpu)
diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
-index 216a4d7..b328f09 100644
+index 216a4d7..228255a 100644
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -43,15 +43,60 @@ do { \
@@ -19545,7 +19583,7 @@ index 216a4d7..b328f09 100644
+static inline void *__module_alloc(unsigned long size, pgprot_t prot)
{
- if (PAGE_ALIGN(size) > MODULES_LEN)
-+ if (size == 0 || PAGE_ALIGN(size) > MODULES_LEN)
++ if (!size || PAGE_ALIGN(size) > MODULES_LEN)
return NULL;
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
- GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC,
@@ -19706,7 +19744,7 @@ index 676b8c7..870ba04 100644
.spin_is_locked = __ticket_spin_is_locked,
.spin_is_contended = __ticket_spin_is_contended,
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
-index 17fff18..0f5f957 100644
+index 17fff18..5cfa0f4 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -55,6 +55,9 @@ u64 _paravirt_ident_64(u64 x)
@@ -19760,7 +19798,18 @@ index 17fff18..0f5f957 100644
.name = "bare hardware",
.paravirt_enabled = 0,
.kernel_rpl = 0,
-@@ -324,7 +331,7 @@ struct pv_time_ops pv_time_ops = {
+@@ -315,16 +322,16 @@ struct pv_info pv_info = {
+ #endif
+ };
+
+-struct pv_init_ops pv_init_ops = {
++struct pv_init_ops pv_init_ops __read_only = {
+ .patch = native_patch,
+ };
+
+-struct pv_time_ops pv_time_ops = {
++struct pv_time_ops pv_time_ops __read_only = {
+ .sched_clock = native_sched_clock,
.steal_clock = native_steal_clock,
};
@@ -19769,7 +19818,23 @@ index 17fff18..0f5f957 100644
.save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
.restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl),
.irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable),
-@@ -401,15 +408,20 @@ struct pv_apic_ops pv_apic_ops = {
+@@ -336,7 +343,7 @@ struct pv_irq_ops pv_irq_ops = {
+ #endif
+ };
+
+-struct pv_cpu_ops pv_cpu_ops = {
++struct pv_cpu_ops pv_cpu_ops __read_only = {
+ .cpuid = native_cpuid,
+ .get_debugreg = native_get_debugreg,
+ .set_debugreg = native_set_debugreg,
+@@ -395,21 +402,26 @@ struct pv_cpu_ops pv_cpu_ops = {
+ .end_context_switch = paravirt_nop,
+ };
+
+-struct pv_apic_ops pv_apic_ops = {
++struct pv_apic_ops pv_apic_ops __read_only= {
+ #ifdef CONFIG_X86_LOCAL_APIC
+ .startup_ipi_hook = paravirt_nop,
#endif
};
@@ -19813,19 +19878,6 @@ index 17fff18..0f5f957 100644
};
EXPORT_SYMBOL_GPL(pv_time_ops);
-diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c
-index 299d493..79c13dd 100644
---- a/arch/x86/kernel/pci-calgary_64.c
-+++ b/arch/x86/kernel/pci-calgary_64.c
-@@ -1461,7 +1461,7 @@ int __init detect_calgary(void)
- printk(KERN_INFO "PCI-DMA: Calgary TCE table spec is %d\n",
- specified_table_size);
-
-- x86_init.iommu.iommu_init = calgary_iommu_init;
-+ *(void **)&x86_init.iommu.iommu_init = calgary_iommu_init;
- }
- return calgary_found;
-
diff --git a/arch/x86/kernel/pci-iommu_table.c b/arch/x86/kernel/pci-iommu_table.c
index 35ccf75..7a15747 100644
--- a/arch/x86/kernel/pci-iommu_table.c
@@ -20118,7 +20170,7 @@ index 16c6365..5d32218 100644
ip = *(u64 *)(fp+8);
if (!in_sched_functions(ip))
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
-index 974b67e..12cb2b5 100644
+index 974b67e..53bdb6c 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -183,14 +183,13 @@ unsigned long kernel_stack_pointer(struct pt_regs *regs)
@@ -20180,7 +20232,7 @@ index 974b67e..12cb2b5 100644
#ifdef CONFIG_X86_64
-static struct user_regset x86_64_regsets[] __read_mostly = {
-+static struct user_regset x86_64_regsets[] = {
++static user_regset_no_const x86_64_regsets[] __read_only = {
[REGSET_GENERAL] = {
.core_note_type = NT_PRSTATUS,
.n = sizeof(struct user_regs_struct) / sizeof(long),
@@ -20189,11 +20241,11 @@ index 974b67e..12cb2b5 100644
#if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
-static struct user_regset x86_32_regsets[] __read_mostly = {
-+static struct user_regset x86_32_regsets[] = {
++static user_regset_no_const x86_32_regsets[] __read_only = {
[REGSET_GENERAL] = {
.core_note_type = NT_PRSTATUS,
.n = sizeof(struct user_regs_struct32) / sizeof(u32),
-@@ -1419,13 +1418,13 @@ static const struct user_regset_view user_x86_32_view = {
+@@ -1419,7 +1418,7 @@ static const struct user_regset_view user_x86_32_view = {
*/
u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
@@ -20201,15 +20253,7 @@ index 974b67e..12cb2b5 100644
+void __init update_regset_xstate_info(unsigned int size, u64 xstate_mask)
{
#ifdef CONFIG_X86_64
-- x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64);
-+ *(unsigned int *)&x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64);
- #endif
- #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
-- x86_32_regsets[REGSET_XSTATE].n = size / sizeof(u64);
-+ *(unsigned int *)&x86_32_regsets[REGSET_XSTATE].n = size / sizeof(u64);
- #endif
- xstate_fx_sw_bytes[USER_XSTATE_XCR0_WORD] = xstate_mask;
- }
+ x86_64_regsets[REGSET_XSTATE].n = size / sizeof(u64);
@@ -1454,7 +1453,7 @@ static void fill_sigtrap_info(struct task_struct *tsk,
memset(info, 0, sizeof(*info));
info->si_signo = SIGTRAP;
@@ -20287,7 +20331,7 @@ index 42eb330..139955c 100644
return ret;
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
-index 76fa1e9..a93c759 100644
+index 76fa1e9..abf09ea 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -36,7 +36,7 @@ void (*pm_power_off)(void);
@@ -20385,14 +20429,18 @@ index 76fa1e9..a93c759 100644
{
if (pm_power_off) {
if (!reboot_force)
-@@ -688,6 +715,7 @@ static void native_machine_power_off(void)
+@@ -688,9 +715,10 @@ static void native_machine_power_off(void)
}
/* A fallback in case there is no PM info available */
tboot_shutdown(TB_SHUTDOWN_HALT);
+ unreachable();
}
- struct machine_ops machine_ops = {
+-struct machine_ops machine_ops = {
++struct machine_ops machine_ops __read_only = {
+ .power_off = native_machine_power_off,
+ .shutdown = native_machine_shutdown,
+ .emergency_restart = native_machine_emergency_restart,
diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S
index 7a6f3b3..bed145d7 100644
--- a/arch/x86/kernel/relocate_kernel_64.S
@@ -20585,6 +20633,19 @@ index 70b27ee..fcf827f 100644
} put_user_catch(err);
err |= copy_siginfo_to_user(&frame->info, info);
+diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
+index 48d2b7d..90d328a 100644
+--- a/arch/x86/kernel/smp.c
++++ b/arch/x86/kernel/smp.c
+@@ -285,7 +285,7 @@ static int __init nonmi_ipi_setup(char *str)
+
+ __setup("nonmi_ipi", nonmi_ipi_setup);
+
+-struct smp_ops smp_ops = {
++struct smp_ops smp_ops __read_only = {
+ .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu,
+ .smp_prepare_cpus = native_smp_prepare_cpus,
+ .smp_cpus_done = native_smp_cpus_done,
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index f3e2ec8..ad5287a 100644
--- a/arch/x86/kernel/smpboot.c
@@ -21685,39 +21746,6 @@ index 22a1530..8fbaaad 100644
"kernel image bigger than KERNEL_IMAGE_SIZE");
#ifdef CONFIG_SMP
-diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c
-index 992f890..0ab1aae 100644
---- a/arch/x86/kernel/vsmp_64.c
-+++ b/arch/x86/kernel/vsmp_64.c
-@@ -114,7 +114,7 @@ static void __init set_vsmp_pv_ops(void)
- pv_irq_ops.irq_enable = PV_CALLEE_SAVE(vsmp_irq_enable);
- pv_irq_ops.save_fl = PV_CALLEE_SAVE(vsmp_save_fl);
- pv_irq_ops.restore_fl = PV_CALLEE_SAVE(vsmp_restore_fl);
-- pv_init_ops.patch = vsmp_patch;
-+ *(void **)&pv_init_ops.patch = vsmp_patch;
- ctl &= ~(1 << 4);
- }
- writel(ctl, address + 4);
-@@ -217,8 +217,8 @@ static void fill_vector_allocation_domain(int cpu, struct cpumask *retmask,
- static void vsmp_apic_post_init(void)
- {
- /* need to update phys_pkg_id */
-- apic->phys_pkg_id = apicid_phys_pkg_id;
-- apic->vector_allocation_domain = fill_vector_allocation_domain;
-+ *(void **)&apic->phys_pkg_id = apicid_phys_pkg_id;
-+ *(void **)&apic->vector_allocation_domain = fill_vector_allocation_domain;
- }
-
- void __init vsmp_init(void)
-@@ -227,7 +227,7 @@ void __init vsmp_init(void)
- if (!is_vsmp_box())
- return;
-
-- x86_platform.apic_post_init = vsmp_apic_post_init;
-+ *(void **)&x86_platform.apic_post_init = vsmp_apic_post_init;
-
- vsmp_cap_cpus();
-
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
index 3a3e8c9..1af9465 100644
--- a/arch/x86/kernel/vsyscall_64.c
@@ -21774,6 +21802,45 @@ index 1330dd1..d220b99 100644
EXPORT_SYMBOL(copy_page);
EXPORT_SYMBOL(clear_page);
+diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
+index 7a3d075..6cb373d 100644
+--- a/arch/x86/kernel/x86_init.c
++++ b/arch/x86/kernel/x86_init.c
+@@ -88,7 +88,7 @@ struct x86_init_ops x86_init __initdata = {
+ },
+ };
+
+-struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = {
++struct x86_cpuinit_ops x86_cpuinit __cpuinitconst = {
+ .early_percpu_clock_init = x86_init_noop,
+ .setup_percpu_clockev = setup_secondary_APIC_clock,
+ };
+@@ -96,7 +96,7 @@ struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = {
+ static void default_nmi_init(void) { };
+ static int default_i8042_detect(void) { return 1; };
+
+-struct x86_platform_ops x86_platform = {
++struct x86_platform_ops x86_platform __read_only = {
+ .calibrate_tsc = native_calibrate_tsc,
+ .get_wallclock = mach_get_cmos_time,
+ .set_wallclock = mach_set_rtc_mmss,
+@@ -110,14 +110,14 @@ struct x86_platform_ops x86_platform = {
+ };
+
+ EXPORT_SYMBOL_GPL(x86_platform);
+-struct x86_msi_ops x86_msi = {
++struct x86_msi_ops x86_msi __read_only = {
+ .setup_msi_irqs = native_setup_msi_irqs,
+ .teardown_msi_irq = native_teardown_msi_irq,
+ .teardown_msi_irqs = default_teardown_msi_irqs,
+ .restore_msi_irqs = default_restore_msi_irqs,
+ };
+
+-struct x86_io_apic_ops x86_io_apic_ops = {
++struct x86_io_apic_ops x86_io_apic_ops __read_only = {
+ .init = native_io_apic_init_mappings,
+ .read = native_io_apic_read,
+ .write = native_io_apic_write,
diff --git a/arch/x86/kernel/xsave.c b/arch/x86/kernel/xsave.c
index ada87a3..afea76d 100644
--- a/arch/x86/kernel/xsave.c
@@ -22086,28 +22153,9 @@ index 4f76417..93429b5 100644
int r;
struct kvm_x86_ops *ops = (struct kvm_x86_ops *)opaque;
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
-index 642d880..5dd034e 100644
+index 642d880..44e0f3f 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
-@@ -1116,12 +1116,12 @@ static u32 lguest_apic_safe_wait_icr_idle(void)
-
- static void set_lguest_basic_apic_ops(void)
- {
-- apic->read = lguest_apic_read;
-- apic->write = lguest_apic_write;
-- apic->icr_read = lguest_apic_icr_read;
-- apic->icr_write = lguest_apic_icr_write;
-- apic->wait_icr_idle = lguest_apic_wait_icr_idle;
-- apic->safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle;
-+ *(void **)&apic->read = lguest_apic_read;
-+ *(void **)&apic->write = lguest_apic_write;
-+ *(void **)&apic->icr_read = lguest_apic_icr_read;
-+ *(void **)&apic->icr_write = lguest_apic_icr_write;
-+ *(void **)&apic->wait_icr_idle = lguest_apic_wait_icr_idle;
-+ *(void **)&apic->safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle;
- };
- #endif
-
@@ -1200,9 +1200,10 @@ static __init int early_put_chars(u32 vtermno, const char *buf, int count)
* Rebooting also tells the Host we're finished, but the RESTART flag tells the
* Launcher to reboot us.
@@ -22120,81 +22168,6 @@ index 642d880..5dd034e 100644
}
/*G:050
-@@ -1292,28 +1293,28 @@ __init void lguest_init(void)
- pv_irq_ops.safe_halt = lguest_safe_halt;
-
- /* Setup operations */
-- pv_init_ops.patch = lguest_patch;
-+ *(void **)&pv_init_ops.patch = lguest_patch;
-
- /* Intercepts of various CPU instructions */
-- pv_cpu_ops.load_gdt = lguest_load_gdt;
-- pv_cpu_ops.cpuid = lguest_cpuid;
-- pv_cpu_ops.load_idt = lguest_load_idt;
-- pv_cpu_ops.iret = lguest_iret;
-- pv_cpu_ops.load_sp0 = lguest_load_sp0;
-- pv_cpu_ops.load_tr_desc = lguest_load_tr_desc;
-- pv_cpu_ops.set_ldt = lguest_set_ldt;
-- pv_cpu_ops.load_tls = lguest_load_tls;
-- pv_cpu_ops.set_debugreg = lguest_set_debugreg;
-- pv_cpu_ops.clts = lguest_clts;
-- pv_cpu_ops.read_cr0 = lguest_read_cr0;
-- pv_cpu_ops.write_cr0 = lguest_write_cr0;
-- pv_cpu_ops.read_cr4 = lguest_read_cr4;
-- pv_cpu_ops.write_cr4 = lguest_write_cr4;
-- pv_cpu_ops.write_gdt_entry = lguest_write_gdt_entry;
-- pv_cpu_ops.write_idt_entry = lguest_write_idt_entry;
-- pv_cpu_ops.wbinvd = lguest_wbinvd;
-- pv_cpu_ops.start_context_switch = paravirt_start_context_switch;
-- pv_cpu_ops.end_context_switch = lguest_end_context_switch;
-+ *(void **)&pv_cpu_ops.load_gdt = lguest_load_gdt;
-+ *(void **)&pv_cpu_ops.cpuid = lguest_cpuid;
-+ *(void **)&pv_cpu_ops.load_idt = lguest_load_idt;
-+ *(void **)&pv_cpu_ops.iret = lguest_iret;
-+ *(void **)&pv_cpu_ops.load_sp0 = lguest_load_sp0;
-+ *(void **)&pv_cpu_ops.load_tr_desc = lguest_load_tr_desc;
-+ *(void **)&pv_cpu_ops.set_ldt = lguest_set_ldt;
-+ *(void **)&pv_cpu_ops.load_tls = lguest_load_tls;
-+ *(void **)&pv_cpu_ops.set_debugreg = lguest_set_debugreg;
-+ *(void **)&pv_cpu_ops.clts = lguest_clts;
-+ *(void **)&pv_cpu_ops.read_cr0 = lguest_read_cr0;
-+ *(void **)&pv_cpu_ops.write_cr0 = lguest_write_cr0;
-+ *(void **)&pv_cpu_ops.read_cr4 = lguest_read_cr4;
-+ *(void **)&pv_cpu_ops.write_cr4 = lguest_write_cr4;
-+ *(void **)&pv_cpu_ops.write_gdt_entry = lguest_write_gdt_entry;
-+ *(void **)&pv_cpu_ops.write_idt_entry = lguest_write_idt_entry;
-+ *(void **)&pv_cpu_ops.wbinvd = lguest_wbinvd;
-+ *(void **)&pv_cpu_ops.start_context_switch = paravirt_start_context_switch;
-+ *(void **)&pv_cpu_ops.end_context_switch = lguest_end_context_switch;
-
- /* Pagetable management */
- pv_mmu_ops.write_cr3 = lguest_write_cr3;
-@@ -1341,11 +1342,11 @@ __init void lguest_init(void)
- set_lguest_basic_apic_ops();
- #endif
-
-- x86_init.resources.memory_setup = lguest_memory_setup;
-- x86_init.irqs.intr_init = lguest_init_IRQ;
-- x86_init.timers.timer_init = lguest_time_init;
-- x86_platform.calibrate_tsc = lguest_tsc_khz;
-- x86_platform.get_wallclock = lguest_get_wallclock;
-+ *(void **)&x86_init.resources.memory_setup = lguest_memory_setup;
-+ *(void **)&x86_init.irqs.intr_init = lguest_init_IRQ;
-+ *(void **)&x86_init.timers.timer_init = lguest_time_init;
-+ *(void **)&x86_platform.calibrate_tsc = lguest_tsc_khz;
-+ *(void **)&x86_platform.get_wallclock = lguest_get_wallclock;
-
- /*
- * Now is a good time to look at the implementations of these functions
-@@ -1434,7 +1435,7 @@ __init void lguest_init(void)
- * routine.
- */
- pm_power_off = lguest_power_off;
-- machine_ops.restart = lguest_restart;
-+ *(void **)&machine_ops.restart = lguest_restart;
-
- /*
- * Now we're set up, call i386_start_kernel() in head32.c and we proceed
diff --git a/arch/x86/lib/atomic64_386_32.S b/arch/x86/lib/atomic64_386_32.S
index 00933d5..3a64af9 100644
--- a/arch/x86/lib/atomic64_386_32.S
@@ -26579,7 +26552,7 @@ index 11a5800..4bd9977 100644
printk(KERN_INFO "Write protecting the kernel text: %luk\n",
size >> 10);
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
-index 3baff25..8b37564 100644
+index 3baff25..678a54e 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -74,7 +74,7 @@ early_param("gbpages", parse_direct_gbpages_on);
@@ -26727,7 +26700,17 @@ index 3baff25..8b37564 100644
/* clear_bss() already clear the empty_zero_page */
reservedpages = 0;
-@@ -851,8 +871,8 @@ int kern_addr_valid(unsigned long addr)
+@@ -829,6 +849,9 @@ int kern_addr_valid(unsigned long addr)
+ if (pud_none(*pud))
+ return 0;
+
++ if (pud_large(*pud))
++ return pfn_valid(pud_pfn(*pud));
++
+ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd))
+ return 0;
+@@ -851,8 +874,8 @@ int kern_addr_valid(unsigned long addr)
static struct vm_area_struct gate_vma = {
.vm_start = VSYSCALL_START,
.vm_end = VSYSCALL_START + (VSYSCALL_MAPPED_PAGES * PAGE_SIZE),
@@ -26738,7 +26721,7 @@ index 3baff25..8b37564 100644
};
struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
-@@ -886,7 +906,7 @@ int in_gate_area_no_mm(unsigned long addr)
+@@ -886,7 +909,7 @@ int in_gate_area_no_mm(unsigned long addr)
const char *arch_vma_name(struct vm_area_struct *vma)
{
@@ -27946,19 +27929,6 @@ index d6aa6e8..266395a 100644
unsigned long stack = kernel_stack_pointer(regs);
if (depth)
dump_trace(NULL, regs, (unsigned long *)stack, 0,
-diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
-index 192397c..5ba6f9e 100644
---- a/arch/x86/pci/acpi.c
-+++ b/arch/x86/pci/acpi.c
-@@ -568,7 +568,7 @@ int __init pci_acpi_init(void)
- acpi_irq_penalty_init();
- pcibios_enable_irq = acpi_pci_irq_enable;
- pcibios_disable_irq = acpi_pci_irq_disable;
-- x86_init.pci.init_irq = x86_init_noop;
-+ *(void **)&x86_init.pci.init_irq = x86_init_noop;
-
- if (pci_routeirq) {
- /*
diff --git a/arch/x86/pci/mrst.c b/arch/x86/pci/mrst.c
index e14a2ff..3fd6b58 100644
--- a/arch/x86/pci/mrst.c
@@ -28282,62 +28252,6 @@ index da8fe05..7ee6704 100644
return !(ret & 0xff00);
}
EXPORT_SYMBOL(pcibios_set_irq_routing);
-diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
-index 56ab749..3cb792a 100644
---- a/arch/x86/pci/xen.c
-+++ b/arch/x86/pci/xen.c
-@@ -395,9 +395,9 @@ int __init pci_xen_init(void)
- #endif
-
- #ifdef CONFIG_PCI_MSI
-- x86_msi.setup_msi_irqs = xen_setup_msi_irqs;
-- x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
-- x86_msi.teardown_msi_irqs = xen_teardown_msi_irqs;
-+ *(void **)&x86_msi.setup_msi_irqs = xen_setup_msi_irqs;
-+ *(void **)&x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
-+ *(void **)&x86_msi.teardown_msi_irqs = xen_teardown_msi_irqs;
- #endif
- return 0;
- }
-@@ -416,8 +416,8 @@ int __init pci_xen_hvm_init(void)
- #endif
-
- #ifdef CONFIG_PCI_MSI
-- x86_msi.setup_msi_irqs = xen_hvm_setup_msi_irqs;
-- x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
-+ *(void **)&x86_msi.setup_msi_irqs = xen_hvm_setup_msi_irqs;
-+ *(void **)&x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
- #endif
- return 0;
- }
-@@ -474,9 +474,9 @@ int __init pci_xen_initial_domain(void)
- int irq;
-
- #ifdef CONFIG_PCI_MSI
-- x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs;
-- x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
-- x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs;
-+ *(void **)&x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs;
-+ *(void **)&x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
-+ *(void **)&x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs;
- #endif
- xen_setup_acpi_sci();
- __acpi_register_gsi = acpi_register_gsi_xen;
-diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
-index 77cf009..7fe44c8 100644
---- a/arch/x86/platform/efi/efi.c
-+++ b/arch/x86/platform/efi/efi.c
-@@ -746,8 +746,8 @@ void __init efi_init(void)
-
- #ifdef CONFIG_X86_32
- if (efi_is_native()) {
-- x86_platform.get_wallclock = efi_get_time;
-- x86_platform.set_wallclock = efi_set_rtc_mmss;
-+ *(void **)&x86_platform.get_wallclock = efi_get_time;
-+ *(void **)&x86_platform.set_wallclock = efi_set_rtc_mmss;
- }
- #endif
-
diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c
index 40e4469..1ab536e 100644
--- a/arch/x86/platform/efi/efi_32.c
@@ -28577,7 +28491,7 @@ index 4c07cca..2c8427d 100644
ret
ENDPROC(efi_call6)
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
-index fd41a92..bc8091d 100644
+index fd41a92..9c33628 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -78,13 +78,15 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
@@ -28598,105 +28512,6 @@ index fd41a92..bc8091d 100644
}
/* parse all the mtimer info to a static mtimer array */
-@@ -233,14 +235,14 @@ static void __init mrst_time_init(void)
- case MRST_TIMER_APBT_ONLY:
- break;
- case MRST_TIMER_LAPIC_APBT:
-- x86_init.timers.setup_percpu_clockev = setup_boot_APIC_clock;
-- x86_cpuinit.setup_percpu_clockev = setup_secondary_APIC_clock;
-+ *(void **)&x86_init.timers.setup_percpu_clockev = setup_boot_APIC_clock;
-+ *(void **)&x86_cpuinit.setup_percpu_clockev = setup_secondary_APIC_clock;
- break;
- default:
- if (!boot_cpu_has(X86_FEATURE_ARAT))
- break;
-- x86_init.timers.setup_percpu_clockev = setup_boot_APIC_clock;
-- x86_cpuinit.setup_percpu_clockev = setup_secondary_APIC_clock;
-+ *(void **)&x86_init.timers.setup_percpu_clockev = setup_boot_APIC_clock;
-+ *(void **)&x86_cpuinit.setup_percpu_clockev = setup_secondary_APIC_clock;
- return;
- }
- /* we need at least one APB timer */
-@@ -282,35 +284,35 @@ static unsigned char mrst_get_nmi_reason(void)
- */
- void __init x86_mrst_early_setup(void)
- {
-- x86_init.resources.probe_roms = x86_init_noop;
-- x86_init.resources.reserve_resources = x86_init_noop;
-+ *(void **)&x86_init.resources.probe_roms = x86_init_noop;
-+ *(void **)&x86_init.resources.reserve_resources = x86_init_noop;
-
-- x86_init.timers.timer_init = mrst_time_init;
-- x86_init.timers.setup_percpu_clockev = x86_init_noop;
-+ *(void **)&x86_init.timers.timer_init = mrst_time_init;
-+ *(void **)&x86_init.timers.setup_percpu_clockev = x86_init_noop;
-
-- x86_init.irqs.pre_vector_init = x86_init_noop;
-+ *(void **)&x86_init.irqs.pre_vector_init = x86_init_noop;
-
-- x86_init.oem.arch_setup = mrst_arch_setup;
-+ *(void **)&x86_init.oem.arch_setup = mrst_arch_setup;
-
-- x86_cpuinit.setup_percpu_clockev = apbt_setup_secondary_clock;
-+ *(void **)&x86_cpuinit.setup_percpu_clockev = apbt_setup_secondary_clock;
-
-- x86_platform.calibrate_tsc = mrst_calibrate_tsc;
-- x86_platform.i8042_detect = mrst_i8042_detect;
-- x86_init.timers.wallclock_init = mrst_rtc_init;
-- x86_platform.get_nmi_reason = mrst_get_nmi_reason;
-+ *(void **)&x86_platform.calibrate_tsc = mrst_calibrate_tsc;
-+ *(void **)&x86_platform.i8042_detect = mrst_i8042_detect;
-+ *(void **)&x86_init.timers.wallclock_init = mrst_rtc_init;
-+ *(void **)&x86_platform.get_nmi_reason = mrst_get_nmi_reason;
-
-- x86_init.pci.init = pci_mrst_init;
-- x86_init.pci.fixup_irqs = x86_init_noop;
-+ *(void **)&x86_init.pci.init = pci_mrst_init;
-+ *(void **)&x86_init.pci.fixup_irqs = x86_init_noop;
-
- legacy_pic = &null_legacy_pic;
-
- /* Moorestown specific power_off/restart method */
- pm_power_off = mrst_power_off;
-- machine_ops.emergency_restart = mrst_reboot;
-+ *(void **)&machine_ops.emergency_restart = mrst_reboot;
-
- /* Avoid searching for BIOS MP tables */
-- x86_init.mpparse.find_smp_config = x86_init_noop;
-- x86_init.mpparse.get_smp_config = x86_init_uint_noop;
-+ *(void **)&x86_init.mpparse.find_smp_config = x86_init_noop;
-+ *(void **)&x86_init.mpparse.get_smp_config = x86_init_uint_noop;
- set_bit(MP_BUS_ISA, mp_bus_not_pci);
- }
-
-diff --git a/arch/x86/platform/mrst/vrtc.c b/arch/x86/platform/mrst/vrtc.c
-index 225bd0f..22e8086 100644
---- a/arch/x86/platform/mrst/vrtc.c
-+++ b/arch/x86/platform/mrst/vrtc.c
-@@ -120,8 +120,8 @@ void __init mrst_rtc_init(void)
-
- vrtc_virt_base = (void __iomem *)set_fixmap_offset_nocache(FIX_LNW_VRTC,
- vrtc_paddr);
-- x86_platform.get_wallclock = vrtc_get_time;
-- x86_platform.set_wallclock = vrtc_set_mmss;
-+ *(void **)&x86_platform.get_wallclock = vrtc_get_time;
-+ *(void **)&x86_platform.set_wallclock = vrtc_set_mmss;
- }
-
- /*
-diff --git a/arch/x86/platform/olpc/olpc.c b/arch/x86/platform/olpc/olpc.c
-index 2737608..0d62cc2 100644
---- a/arch/x86/platform/olpc/olpc.c
-+++ b/arch/x86/platform/olpc/olpc.c
-@@ -395,7 +395,7 @@ static int __init olpc_init(void)
- * XO-1 only. */
- if (olpc_platform_info.boardrev < olpc_board_pre(0xd0) &&
- !cs5535_has_vsa2())
-- x86_init.pci.arch_init = pci_olpc_init;
-+ *(void **)&x86_init.pci.arch_init = pci_olpc_init;
- #endif
-
- if (olpc_platform_info.boardrev < olpc_board_pre(0xd0)) { /* XO-1 */
diff --git a/arch/x86/platform/olpc/olpc_dt.c b/arch/x86/platform/olpc/olpc_dt.c
index d6ee929..3637cb5 100644
--- a/arch/x86/platform/olpc/olpc_dt.c
@@ -29219,19 +29034,8 @@ index 00aaf04..4a26505 100644
- return 0;
-}
-__setup("vdso=", vdso_setup);
-diff --git a/arch/x86/xen/apic.c b/arch/x86/xen/apic.c
-index 7005ced..530d6eb 100644
---- a/arch/x86/xen/apic.c
-+++ b/arch/x86/xen/apic.c
-@@ -30,5 +30,5 @@ static unsigned int xen_io_apic_read(unsigned apic, unsigned reg)
-
- void __init xen_init_apic(void)
- {
-- x86_io_apic_ops.read = xen_io_apic_read;
-+ *(void **)&x86_io_apic_ops.read = xen_io_apic_read;
- }
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
-index 586d838..9181904 100644
+index 586d838..e883209 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -99,8 +99,6 @@ EXPORT_SYMBOL_GPL(xen_start_info);
@@ -29263,41 +29067,15 @@ index 586d838..9181904 100644
int f;
/*
-@@ -918,21 +914,21 @@ static u32 xen_safe_apic_wait_icr_idle(void)
-
- static void set_xen_basic_apic_ops(void)
- {
-- apic->read = xen_apic_read;
-- apic->write = xen_apic_write;
-- apic->icr_read = xen_apic_icr_read;
-- apic->icr_write = xen_apic_icr_write;
-- apic->wait_icr_idle = xen_apic_wait_icr_idle;
-- apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle;
-- apic->set_apic_id = xen_set_apic_id;
-- apic->get_apic_id = xen_get_apic_id;
-+ *(void **)&apic->read = xen_apic_read;
-+ *(void **)&apic->write = xen_apic_write;
-+ *(void **)&apic->icr_read = xen_apic_icr_read;
-+ *(void **)&apic->icr_write = xen_apic_icr_write;
-+ *(void **)&apic->wait_icr_idle = xen_apic_wait_icr_idle;
-+ *(void **)&apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle;
-+ *(void **)&apic->set_apic_id = xen_set_apic_id;
-+ *(void **)&apic->get_apic_id = xen_get_apic_id;
-
- #ifdef CONFIG_SMP
-- apic->send_IPI_allbutself = xen_send_IPI_allbutself;
-- apic->send_IPI_mask_allbutself = xen_send_IPI_mask_allbutself;
-- apic->send_IPI_mask = xen_send_IPI_mask;
-- apic->send_IPI_all = xen_send_IPI_all;
-- apic->send_IPI_self = xen_send_IPI_self;
-+ *(void **)&apic->send_IPI_allbutself = xen_send_IPI_allbutself;
-+ *(void **)&apic->send_IPI_mask_allbutself = xen_send_IPI_mask_allbutself;
-+ *(void **)&apic->send_IPI_mask = xen_send_IPI_mask;
-+ *(void **)&apic->send_IPI_all = xen_send_IPI_all;
-+ *(void **)&apic->send_IPI_self = xen_send_IPI_self;
- #endif
+@@ -916,7 +912,7 @@ static u32 xen_safe_apic_wait_icr_idle(void)
+ return 0;
}
+-static void set_xen_basic_apic_ops(void)
++static void __init set_xen_basic_apic_ops(void)
+ {
+ apic->read = xen_apic_read;
+ apic->write = xen_apic_write;
@@ -1222,30 +1218,30 @@ static const struct pv_apic_ops xen_apic_ops __initconst = {
#endif
};
@@ -29336,45 +29114,6 @@ index 586d838..9181904 100644
{
if (pm_power_off)
pm_power_off();
-@@ -1290,14 +1286,14 @@ static const struct machine_ops xen_machine_ops __initconst = {
- */
- static void __init xen_setup_stackprotector(void)
- {
-- pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot;
-- pv_cpu_ops.load_gdt = xen_load_gdt_boot;
-+ *(void **)&pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot;
-+ *(void **)&pv_cpu_ops.load_gdt = xen_load_gdt_boot;
-
- setup_stack_canary_segment(0);
- switch_to_new_gdt(0);
-
-- pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry;
-- pv_cpu_ops.load_gdt = xen_load_gdt;
-+ *(void **)&pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry;
-+ *(void **)&pv_cpu_ops.load_gdt = xen_load_gdt;
- }
-
- /* First C function to be called on Xen boot */
-@@ -1315,13 +1311,13 @@ asmlinkage void __init xen_start_kernel(void)
-
- /* Install Xen paravirt ops */
- pv_info = xen_info;
-- pv_init_ops = xen_init_ops;
-- pv_cpu_ops = xen_cpu_ops;
-- pv_apic_ops = xen_apic_ops;
-+ memcpy((void *)&pv_init_ops, &xen_init_ops, sizeof pv_init_ops);
-+ memcpy((void *)&pv_cpu_ops, &xen_cpu_ops, sizeof pv_cpu_ops);
-+ memcpy((void *)&pv_apic_ops, &xen_apic_ops, sizeof pv_apic_ops);
-
-- x86_init.resources.memory_setup = xen_memory_setup;
-- x86_init.oem.arch_setup = xen_arch_setup;
-- x86_init.oem.banner = xen_banner;
-+ *(void **)&x86_init.resources.memory_setup = xen_memory_setup;
-+ *(void **)&x86_init.oem.arch_setup = xen_arch_setup;
-+ *(void **)&x86_init.oem.banner = xen_banner;
-
- xen_init_time_ops();
-
@@ -1347,7 +1343,17 @@ asmlinkage void __init xen_start_kernel(void)
__userpte_alloc_gfp &= ~__GFP_HIGHMEM;
@@ -29410,48 +29149,8 @@ index 586d838..9181904 100644
xen_smp_init();
-@@ -1450,7 +1449,7 @@ asmlinkage void __init xen_start_kernel(void)
- add_preferred_console("tty", 0, NULL);
- add_preferred_console("hvc", 0, NULL);
- if (pci_xen)
-- x86_init.pci.arch_init = pci_xen_init;
-+ *(void **)&x86_init.pci.arch_init = pci_xen_init;
- } else {
- const struct dom0_vga_console_info *info =
- (void *)((char *)xen_start_info +
-@@ -1476,8 +1475,8 @@ asmlinkage void __init xen_start_kernel(void)
- xen_acpi_sleep_register();
-
- /* Avoid searching for BIOS MP tables */
-- x86_init.mpparse.find_smp_config = x86_init_noop;
-- x86_init.mpparse.get_smp_config = x86_init_uint_noop;
-+ *(void **)&x86_init.mpparse.find_smp_config = x86_init_noop;
-+ *(void **)&x86_init.mpparse.get_smp_config = x86_init_uint_noop;
- }
- #ifdef CONFIG_PCI
- /* PCI BIOS service won't work from a PV guest. */
-@@ -1583,7 +1582,7 @@ static void __init xen_hvm_guest_init(void)
- xen_hvm_smp_init();
- register_cpu_notifier(&xen_hvm_cpu_notifier);
- xen_unplug_emulated_devices();
-- x86_init.irqs.intr_init = xen_init_IRQ;
-+ *(void **)&x86_init.irqs.intr_init = xen_init_IRQ;
- xen_hvm_init_time_ops();
- xen_hvm_init_mmu_ops();
- }
-diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c
-index 01a4dc0..3ca0cc9 100644
---- a/arch/x86/xen/irq.c
-+++ b/arch/x86/xen/irq.c
-@@ -130,5 +130,5 @@ static const struct pv_irq_ops xen_irq_ops __initconst = {
- void __init xen_init_irq_ops(void)
- {
- pv_irq_ops = xen_irq_ops;
-- x86_init.irqs.intr_init = xen_init_IRQ;
-+ *(void **)&x86_init.irqs.intr_init = xen_init_IRQ;
- }
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
-index dcf5f2d..5f72fe7 100644
+index dcf5f2d..d804c25 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1881,6 +1881,9 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
@@ -29493,19 +29192,8 @@ index dcf5f2d..5f72fe7 100644
.alloc_pud = xen_alloc_pmd_init,
.release_pud = xen_release_pmd_init,
-@@ -2197,8 +2206,8 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = {
-
- void __init xen_init_mmu_ops(void)
- {
-- x86_init.mapping.pagetable_reserve = xen_mapping_pagetable_reserve;
-- x86_init.paging.pagetable_init = xen_pagetable_init;
-+ *(void **)&x86_init.mapping.pagetable_reserve = xen_mapping_pagetable_reserve;
-+ *(void **)&x86_init.paging.pagetable_init = xen_pagetable_init;
- pv_mmu_ops = xen_mmu_ops;
-
- memset(dummy_mapping, 0xff, PAGE_SIZE);
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
-index 353c50f..a0b9b0d 100644
+index 353c50f..8f3c179 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -229,11 +229,6 @@ static void __init xen_smp_prepare_boot_cpu(void)
@@ -29561,92 +29249,6 @@ index 353c50f..a0b9b0d 100644
xen_fill_possible_map();
xen_init_spinlocks();
}
-@@ -672,10 +666,10 @@ void __init xen_hvm_smp_init(void)
- {
- if (!xen_have_vector_callback)
- return;
-- smp_ops.smp_prepare_cpus = xen_hvm_smp_prepare_cpus;
-- smp_ops.smp_send_reschedule = xen_smp_send_reschedule;
-- smp_ops.cpu_up = xen_hvm_cpu_up;
-- smp_ops.cpu_die = xen_hvm_cpu_die;
-- smp_ops.send_call_func_ipi = xen_smp_send_call_function_ipi;
-- smp_ops.send_call_func_single_ipi = xen_smp_send_call_function_single_ipi;
-+ *(void **)&smp_ops.smp_prepare_cpus = xen_hvm_smp_prepare_cpus;
-+ *(void **)&smp_ops.smp_send_reschedule = xen_smp_send_reschedule;
-+ *(void **)&smp_ops.cpu_up = xen_hvm_cpu_up;
-+ *(void **)&smp_ops.cpu_die = xen_hvm_cpu_die;
-+ *(void **)&smp_ops.send_call_func_ipi = xen_smp_send_call_function_ipi;
-+ *(void **)&smp_ops.send_call_func_single_ipi = xen_smp_send_call_function_single_ipi;
- }
-diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
-index 83e866d..ef60385 100644
---- a/arch/x86/xen/spinlock.c
-+++ b/arch/x86/xen/spinlock.c
-@@ -390,12 +390,12 @@ void __init xen_init_spinlocks(void)
- {
- BUILD_BUG_ON(sizeof(struct xen_spinlock) > sizeof(arch_spinlock_t));
-
-- pv_lock_ops.spin_is_locked = xen_spin_is_locked;
-- pv_lock_ops.spin_is_contended = xen_spin_is_contended;
-- pv_lock_ops.spin_lock = xen_spin_lock;
-- pv_lock_ops.spin_lock_flags = xen_spin_lock_flags;
-- pv_lock_ops.spin_trylock = xen_spin_trylock;
-- pv_lock_ops.spin_unlock = xen_spin_unlock;
-+ *(void **)&pv_lock_ops.spin_is_locked = xen_spin_is_locked;
-+ *(void **)&pv_lock_ops.spin_is_contended = xen_spin_is_contended;
-+ *(void **)&pv_lock_ops.spin_lock = xen_spin_lock;
-+ *(void **)&pv_lock_ops.spin_lock_flags = xen_spin_lock_flags;
-+ *(void **)&pv_lock_ops.spin_trylock = xen_spin_trylock;
-+ *(void **)&pv_lock_ops.spin_unlock = xen_spin_unlock;
- }
-
- #ifdef CONFIG_XEN_DEBUG_FS
-diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
-index 0296a95..3c51a2d 100644
---- a/arch/x86/xen/time.c
-+++ b/arch/x86/xen/time.c
-@@ -481,15 +481,15 @@ static void __init xen_time_init(void)
-
- void __init xen_init_time_ops(void)
- {
-- pv_time_ops = xen_time_ops;
-+ memcpy((void *)&pv_time_ops, &xen_time_ops, sizeof pv_time_ops);
-
-- x86_init.timers.timer_init = xen_time_init;
-- x86_init.timers.setup_percpu_clockev = x86_init_noop;
-- x86_cpuinit.setup_percpu_clockev = x86_init_noop;
-+ *(void **)&x86_init.timers.timer_init = xen_time_init;
-+ *(void **)&x86_init.timers.setup_percpu_clockev = x86_init_noop;
-+ *(void **)&x86_cpuinit.setup_percpu_clockev = x86_init_noop;
-
-- x86_platform.calibrate_tsc = xen_tsc_khz;
-- x86_platform.get_wallclock = xen_get_wallclock;
-- x86_platform.set_wallclock = xen_set_wallclock;
-+ *(void **)&x86_platform.calibrate_tsc = xen_tsc_khz;
-+ *(void **)&x86_platform.get_wallclock = xen_get_wallclock;
-+ *(void **)&x86_platform.set_wallclock = xen_set_wallclock;
- }
-
- #ifdef CONFIG_XEN_PVHVM
-@@ -514,12 +514,12 @@ void __init xen_hvm_init_time_ops(void)
- return;
- }
-
-- pv_time_ops = xen_time_ops;
-- x86_init.timers.setup_percpu_clockev = xen_time_init;
-- x86_cpuinit.setup_percpu_clockev = xen_hvm_setup_cpu_clockevents;
-+ memcpy((void *)&pv_time_ops, &xen_time_ops, sizeof pv_time_ops);
-+ *(void **)&x86_init.timers.setup_percpu_clockev = xen_time_init;
-+ *(void **)&x86_cpuinit.setup_percpu_clockev = xen_hvm_setup_cpu_clockevents;
-
-- x86_platform.calibrate_tsc = xen_tsc_khz;
-- x86_platform.get_wallclock = xen_get_wallclock;
-- x86_platform.set_wallclock = xen_set_wallclock;
-+ *(void **)&x86_platform.calibrate_tsc = xen_tsc_khz;
-+ *(void **)&x86_platform.get_wallclock = xen_get_wallclock;
-+ *(void **)&x86_platform.set_wallclock = xen_set_wallclock;
- }
- #endif
diff --git a/arch/x86/xen/xen-asm_32.S b/arch/x86/xen/xen-asm_32.S
index f9643fc..602e8af 100644
--- a/arch/x86/xen/xen-asm_32.S
@@ -32310,7 +31912,7 @@ index 84ddc55..1d32f1e 100644
return 0;
}
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
-index 8ab9c3d..c3e65d3 100644
+index 088c8fd..774c5a5 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -622,7 +622,7 @@ static ssize_t fill_readbuf(struct port *port, char *out_buf, size_t out_count,
@@ -32539,22 +32141,18 @@ index 982f1f5..d21e5da 100644
iounmap(buf);
return 0;
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
-index bfd8f43..133189c 100644
+index bfd8f43..b1fe1f8 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
-@@ -1234,9 +1234,9 @@ efivars_init(void)
- return -ENOMEM;
- }
+@@ -1206,7 +1206,7 @@ out:
+ EXPORT_SYMBOL_GPL(register_efivars);
-- ops.get_variable = efi.get_variable;
-- ops.set_variable = efi.set_variable;
-- ops.get_next_variable = efi.get_next_variable;
-+ *(void **)&ops.get_variable = efi.get_variable;
-+ *(void **)&ops.set_variable = efi.set_variable;
-+ *(void **)&ops.get_next_variable = efi.get_next_variable;
- error = register_efivars(&__efivars, &ops, efi_kobj);
- if (error)
- goto err_put;
+ static struct efivars __efivars;
+-static struct efivar_operations ops;
++static efivar_operations_no_const ops __read_only;
+
+ /*
+ * For now we register the efi subsystem with the firmware subsystem
diff --git a/drivers/gpio/gpio-vr41xx.c b/drivers/gpio/gpio-vr41xx.c
index 82d5c20..44a7177 100644
--- a/drivers/gpio/gpio-vr41xx.c
@@ -33462,22 +33060,18 @@ index 8e9057b..af6dacb 100644
DRM_DEBUG("pid=%d\n", DRM_CURRENTPID);
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
-index 5ebe1b3..1ed9426 100644
+index 5ebe1b3..44209ea 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
-@@ -822,8 +822,10 @@ int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
- }
- if (unlikely(ttm_vm_ops == NULL)) {
- ttm_vm_ops = vma->vm_ops;
-- radeon_ttm_vm_ops = *ttm_vm_ops;
-- radeon_ttm_vm_ops.fault = &radeon_ttm_fault;
-+ pax_open_kernel();
-+ memcpy((void *)&radeon_ttm_vm_ops, ttm_vm_ops, sizeof(radeon_ttm_vm_ops));
-+ *(void **)&radeon_ttm_vm_ops.fault = &radeon_ttm_fault;
-+ pax_close_kernel();
- }
- vma->vm_ops = &radeon_ttm_vm_ops;
- return 0;
+@@ -781,7 +781,7 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size)
+ man->size = size >> PAGE_SHIFT;
+ }
+
+-static struct vm_operations_struct radeon_ttm_vm_ops;
++static vm_operations_struct_no_const radeon_ttm_vm_ops __read_only;
+ static const struct vm_operations_struct *ttm_vm_ops = NULL;
+
+ static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
index 5706d2a..17aedaa 100644
--- a/drivers/gpu/drm/radeon/rs690.c
@@ -34719,41 +34313,6 @@ index d0f7533..fb8215b 100644
serio->dev.bus = &serio_bus;
serio->dev.release = serio_release_port;
serio->dev.groups = serio_device_attr_groups;
-diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c
-index faf10ba..7cfaba9 100644
---- a/drivers/iommu/amd_iommu_init.c
-+++ b/drivers/iommu/amd_iommu_init.c
-@@ -1922,7 +1922,7 @@ static int __init state_next(void)
- case IOMMU_ACPI_FINISHED:
- early_enable_iommus();
- register_syscore_ops(&amd_iommu_syscore_ops);
-- x86_platform.iommu_shutdown = disable_iommus;
-+ *(void **)&x86_platform.iommu_shutdown = disable_iommus;
- init_state = IOMMU_ENABLED;
- break;
- case IOMMU_ENABLED:
-@@ -2064,7 +2064,7 @@ int __init amd_iommu_detect(void)
-
- amd_iommu_detected = true;
- iommu_detected = 1;
-- x86_init.iommu.iommu_init = amd_iommu_init;
-+ *(void **)&x86_init.iommu.iommu_init = amd_iommu_init;
-
- return 0;
- }
-diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
-index 86e2f4a..d1cec5d 100644
---- a/drivers/iommu/dmar.c
-+++ b/drivers/iommu/dmar.c
-@@ -555,7 +555,7 @@ int __init detect_intel_iommu(void)
-
- #ifdef CONFIG_X86
- if (ret)
-- x86_init.iommu.iommu_init = intel_iommu_init;
-+ *(void **)&x86_init.iommu.iommu_init = intel_iommu_init;
- #endif
- }
- early_acpi_os_unmap_memory(dmar_tbl, dmar_tbl_size);
diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c
index c679867..6e2e34d 100644
--- a/drivers/isdn/capi/capi.c
@@ -36793,7 +36352,7 @@ index c2e420a..26a75e0 100644
__vxge_hw_mempool_create(vpath->hldev,
fifo->config->memblock_size,
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
-index 927aa33..a6c2518 100644
+index 6afe74e..2e2950f 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -747,22 +747,22 @@ struct rtl8169_private {
@@ -37073,6 +36632,63 @@ index 605a4ba..a883dd1 100644
result =
hso_start_serial_device(serial_table[i], GFP_NOIO);
hso_kick_transmit(dev2ser(serial_table[i]));
+diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
+index edb81ed..ab8931c 100644
+--- a/drivers/net/usb/usbnet.c
++++ b/drivers/net/usb/usbnet.c
+@@ -380,6 +380,12 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
+ unsigned long lockflags;
+ size_t size = dev->rx_urb_size;
+
++ /* prevent rx skb allocation when error ratio is high */
++ if (test_bit(EVENT_RX_KILL, &dev->flags)) {
++ usb_free_urb(urb);
++ return -ENOLINK;
++ }
++
+ skb = __netdev_alloc_skb_ip_align(dev->net, size, flags);
+ if (!skb) {
+ netif_dbg(dev, rx_err, dev->net, "no rx skb\n");
+@@ -539,6 +545,17 @@ block:
+ break;
+ }
+
++ /* stop rx if packet error rate is high */
++ if (++dev->pkt_cnt > 30) {
++ dev->pkt_cnt = 0;
++ dev->pkt_err = 0;
++ } else {
++ if (state == rx_cleanup)
++ dev->pkt_err++;
++ if (dev->pkt_err > 20)
++ set_bit(EVENT_RX_KILL, &dev->flags);
++ }
++
+ state = defer_bh(dev, skb, &dev->rxq, state);
+
+ if (urb) {
+@@ -790,6 +807,11 @@ int usbnet_open (struct net_device *net)
+ (dev->driver_info->flags & FLAG_FRAMING_AX) ? "ASIX" :
+ "simple");
+
++ /* reset rx error state */
++ dev->pkt_cnt = 0;
++ dev->pkt_err = 0;
++ clear_bit(EVENT_RX_KILL, &dev->flags);
++
+ // delay posting reads until we're fully open
+ tasklet_schedule (&dev->bh);
+ if (info->manage_power) {
+@@ -1253,6 +1275,9 @@ static void usbnet_bh (unsigned long param)
+ }
+ }
+
++ /* restart RX again after disabling due to high error rate */
++ clear_bit(EVENT_RX_KILL, &dev->flags);
++
+ // waiting for all pending urbs to complete?
+ if (dev->wait) {
+ if ((dev->txq.qlen + dev->rxq.qlen + dev->done.qlen) == 0) {
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
index 8d78253..bebbb68 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
@@ -37279,7 +36895,7 @@ index 301bf72..3f5654f 100644
static u16 ar9003_calc_ptr_chksum(struct ar9003_txc *ads)
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
-index dbc1b7a..67e2ca2 100644
+index b68aaf5..fb20845 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -657,7 +657,7 @@ struct ath_hw_private_ops {
@@ -63449,6 +63065,18 @@ index d3201e4..8281e63 100644
struct dma_pinned_list *pinned_list, struct page *page,
unsigned int offset, size_t len);
+diff --git a/include/linux/efi.h b/include/linux/efi.h
+index b424f64..fd36c1b 100644
+--- a/include/linux/efi.h
++++ b/include/linux/efi.h
+@@ -656,6 +656,7 @@ struct efivar_operations {
+ efi_get_next_variable_t *get_next_variable;
+ efi_set_variable_t *set_variable;
+ };
++typedef struct efivar_operations __no_const efivar_operations_no_const;
+
+ struct efivars {
+ /*
diff --git a/include/linux/elf.h b/include/linux/elf.h
index 8c9048e..16a4665 100644
--- a/include/linux/elf.h
@@ -64938,7 +64566,7 @@ index 6d087c5..401cab8 100644
.files = &init_files, \
.signal = &init_signals, \
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
-index 5e4e617..eee383d 100644
+index 5e4e617..073b866 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -435,7 +435,7 @@ enum
@@ -64955,8 +64583,9 @@ index 5e4e617..eee383d 100644
struct softirq_action
{
- void (*action)(struct softirq_action *);
+-};
+ void (*action)(void);
- };
++} __no_const;
asmlinkage void do_softirq(void);
asmlinkage void __do_softirq(void);
@@ -65117,7 +64746,7 @@ index cc6d2aa..71febca 100644
* list_replace - replace old entry by new one
* @old : the element to be replaced
diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 280dae5..39046ec 100644
+index 280dae5..baea6c8 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -101,6 +101,11 @@ extern unsigned int kobjsize(const void *objp);
@@ -65132,7 +64761,15 @@ index 280dae5..39046ec 100644
#define VM_DONTDUMP 0x04000000 /* Do not include in the core dump */
#define VM_MIXEDMAP 0x10000000 /* Can contain "struct page" and pure PFN pages */
-@@ -1039,34 +1044,6 @@ int set_page_dirty(struct page *page);
+@@ -231,6 +236,7 @@ struct vm_operations_struct {
+ int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr,
+ unsigned long size, pgoff_t pgoff);
+ };
++typedef struct vm_operations_struct __no_const vm_operations_struct_no_const;
+
+ struct mmu_gather;
+ struct inode;
+@@ -1039,34 +1045,6 @@ int set_page_dirty(struct page *page);
int set_page_dirty_lock(struct page *page);
int clear_page_dirty_for_io(struct page *page);
@@ -65167,7 +64804,7 @@ index 280dae5..39046ec 100644
extern pid_t
vm_is_stack(struct task_struct *task, struct vm_area_struct *vma, int in_group);
-@@ -1166,6 +1143,15 @@ static inline void sync_mm_rss(struct mm_struct *mm)
+@@ -1166,6 +1144,15 @@ static inline void sync_mm_rss(struct mm_struct *mm)
}
#endif
@@ -65183,7 +64820,7 @@ index 280dae5..39046ec 100644
int vma_wants_writenotify(struct vm_area_struct *vma);
extern pte_t *__get_locked_pte(struct mm_struct *mm, unsigned long addr,
-@@ -1184,8 +1170,15 @@ static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd,
+@@ -1184,8 +1171,15 @@ static inline int __pud_alloc(struct mm_struct *mm, pgd_t *pgd,
{
return 0;
}
@@ -65199,7 +64836,7 @@ index 280dae5..39046ec 100644
#endif
#ifdef __PAGETABLE_PMD_FOLDED
-@@ -1194,8 +1187,15 @@ static inline int __pmd_alloc(struct mm_struct *mm, pud_t *pud,
+@@ -1194,8 +1188,15 @@ static inline int __pmd_alloc(struct mm_struct *mm, pud_t *pud,
{
return 0;
}
@@ -65215,7 +64852,7 @@ index 280dae5..39046ec 100644
#endif
int __pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma,
-@@ -1213,11 +1213,23 @@ static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long a
+@@ -1213,11 +1214,23 @@ static inline pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long a
NULL: pud_offset(pgd, address);
}
@@ -65239,7 +64876,7 @@ index 280dae5..39046ec 100644
#endif /* CONFIG_MMU && !__ARCH_HAS_4LEVEL_HACK */
#if USE_SPLIT_PTLOCKS
-@@ -1447,6 +1459,7 @@ extern unsigned long do_mmap_pgoff(struct file *, unsigned long,
+@@ -1447,6 +1460,7 @@ extern unsigned long do_mmap_pgoff(struct file *, unsigned long,
unsigned long, unsigned long,
unsigned long, unsigned long);
extern int do_munmap(struct mm_struct *, unsigned long, size_t);
@@ -65247,7 +64884,7 @@ index 280dae5..39046ec 100644
/* These take the mm semaphore themselves */
extern unsigned long vm_brk(unsigned long, unsigned long);
-@@ -1510,6 +1523,10 @@ extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long add
+@@ -1510,6 +1524,10 @@ extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long add
extern struct vm_area_struct * find_vma_prev(struct mm_struct * mm, unsigned long addr,
struct vm_area_struct **pprev);
@@ -65258,7 +64895,7 @@ index 280dae5..39046ec 100644
/* Look up the first VMA which intersects the interval start_addr..end_addr-1,
NULL if none. Assume start_addr < end_addr. */
static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)
-@@ -1538,15 +1555,6 @@ static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm,
+@@ -1538,15 +1556,6 @@ static inline struct vm_area_struct *find_exact_vma(struct mm_struct *mm,
return vma;
}
@@ -65274,7 +64911,7 @@ index 280dae5..39046ec 100644
struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
unsigned long pfn, unsigned long size, pgprot_t);
-@@ -1652,7 +1660,7 @@ extern int unpoison_memory(unsigned long pfn);
+@@ -1652,7 +1661,7 @@ extern int unpoison_memory(unsigned long pfn);
extern int sysctl_memory_failure_early_kill;
extern int sysctl_memory_failure_recovery;
extern void shake_page(struct page *p, int access);
@@ -65283,7 +64920,7 @@ index 280dae5..39046ec 100644
extern int soft_offline_page(struct page *page, int flags);
extern void dump_page(struct page *page);
-@@ -1683,5 +1691,11 @@ static inline unsigned int debug_guardpage_minorder(void) { return 0; }
+@@ -1683,5 +1692,11 @@ static inline unsigned int debug_guardpage_minorder(void) { return 0; }
static inline bool page_is_guard(struct page *page) { return false; }
#endif /* CONFIG_DEBUG_PAGEALLOC */
@@ -65601,10 +65238,10 @@ index 4bf19d8..5268cea 100644
return nd->saved_names[nd->depth];
}
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
-index a848ffc..3bbbaee 100644
+index 825fb7e..24cdd41 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -999,6 +999,7 @@ struct net_device_ops {
+@@ -1002,6 +1002,7 @@ struct net_device_ops {
struct net_device *dev,
int idx);
};
@@ -65612,7 +65249,7 @@ index a848ffc..3bbbaee 100644
/*
* The DEVICE structure.
-@@ -1059,7 +1060,7 @@ struct net_device {
+@@ -1062,7 +1063,7 @@ struct net_device {
int iflink;
struct net_device_stats stats;
@@ -65896,15 +65533,16 @@ index 23b3630..e1bc12b 100644
#endif /* _LINUX_REBOOT_H */
diff --git a/include/linux/regset.h b/include/linux/regset.h
-index 8e0c9fe..fdb64bc 100644
+index 8e0c9fe..ac4d221 100644
--- a/include/linux/regset.h
+++ b/include/linux/regset.h
-@@ -161,7 +161,7 @@ struct user_regset {
+@@ -161,7 +161,8 @@ struct user_regset {
unsigned int align;
unsigned int bias;
unsigned int core_note_type;
-};
+} __do_const;
++typedef struct user_regset __no_const user_regset_no_const;
/**
* struct user_regset_view - available regsets
@@ -66832,6 +66470,27 @@ index c5d36c6..108f4f9 100644
/*
* callback functions for platform
+diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
+index ddbbb7d..9134611 100644
+--- a/include/linux/usb/usbnet.h
++++ b/include/linux/usb/usbnet.h
+@@ -33,6 +33,7 @@ struct usbnet {
+ wait_queue_head_t *wait;
+ struct mutex phy_mutex;
+ unsigned char suspend_count;
++ unsigned char pkt_cnt, pkt_err;
+
+ /* i/o info: pipes etc */
+ unsigned in, out;
+@@ -69,6 +70,8 @@ struct usbnet {
+ # define EVENT_DEV_ASLEEP 6
+ # define EVENT_DEV_OPEN 7
+ # define EVENT_DEVICE_REPORT_IDLE 8
++# define EVENT_NO_RUNTIME_PM 9
++# define EVENT_RX_KILL 10
+ };
+
+ static inline struct usb_driver *driver_of(struct usb_interface *intf)
diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h
index 6f8fbcf..8259001 100644
--- a/include/linux/vermagic.h
@@ -72266,10 +71925,15 @@ index 57dde52..2c561f0 100644
error = check_kill_permission(sig, info, p);
/*
diff --git a/kernel/softirq.c b/kernel/softirq.c
-index cc96bdc..8bb9750 100644
+index cc96bdc..6a96894 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
-@@ -57,7 +57,7 @@ static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp
+@@ -53,11 +53,11 @@ irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;
+ EXPORT_SYMBOL(irq_stat);
+ #endif
+
+-static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
++static struct softirq_action softirq_vec[NR_SOFTIRQS] __read_only __aligned(PAGE_SIZE);
DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
@@ -72287,21 +71951,16 @@ index cc96bdc..8bb9750 100644
trace_softirq_exit(vec_nr);
if (unlikely(prev_count != preempt_count())) {
printk(KERN_ERR "huh, entered softirq %u %s %p"
-@@ -391,9 +391,11 @@ void __raise_softirq_irqoff(unsigned int nr)
+@@ -391,7 +391,7 @@ void __raise_softirq_irqoff(unsigned int nr)
or_softirq_pending(1UL << nr);
}
-void open_softirq(int nr, void (*action)(struct softirq_action *))
-+void open_softirq(int nr, void (*action)(void))
++void __init open_softirq(int nr, void (*action)(void))
{
-- softirq_vec[nr].action = action;
-+ pax_open_kernel();
-+ *(void **)&softirq_vec[nr].action = action;
-+ pax_close_kernel();
+ softirq_vec[nr].action = action;
}
-
- /*
-@@ -447,7 +449,7 @@ void __tasklet_hi_schedule_first(struct tasklet_struct *t)
+@@ -447,7 +447,7 @@ void __tasklet_hi_schedule_first(struct tasklet_struct *t)
EXPORT_SYMBOL(__tasklet_hi_schedule_first);
@@ -72310,7 +71969,7 @@ index cc96bdc..8bb9750 100644
{
struct tasklet_struct *list;
-@@ -482,7 +484,7 @@ static void tasklet_action(struct softirq_action *a)
+@@ -482,7 +482,7 @@ static void tasklet_action(struct softirq_action *a)
}
}
@@ -73406,7 +73065,7 @@ index 31e4f55..62da00f 100644
struct dentry *d_tracer;
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
-index d608d09..7eddcb1 100644
+index d608d09..bd3801f 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -1320,10 +1320,6 @@ static LIST_HEAD(ftrace_module_file_list);
@@ -73436,10 +73095,10 @@ index d608d09..7eddcb1 100644
- file_ops->format = ftrace_event_format_fops;
- file_ops->format.owner = mod;
+ pax_open_kernel();
-+ *(void **)&mod->trace_id.owner = mod;
-+ *(void **)&mod->trace_enable.owner = mod;
-+ *(void **)&mod->trace_filter.owner = mod;
-+ *(void **)&mod->trace_format.owner = mod;
++ mod->trace_id.owner = mod;
++ mod->trace_enable.owner = mod;
++ mod->trace_filter.owner = mod;
++ mod->trace_format.owner = mod;
+ pax_close_kernel();
list_add(&file_ops->list, &ftrace_module_file_list);
@@ -74167,7 +73826,7 @@ index 40f17c3..c1cc011 100644
/* if an huge pmd materialized from under us just retry later */
if (unlikely(pmd_trans_huge(*pmd)))
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
-index f198aca..10e3e37 100644
+index b969ed4..10e3e37 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -2509,6 +2509,27 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,
@@ -74259,14 +73918,6 @@ index f198aca..10e3e37 100644
ptep = huge_pte_alloc(mm, address, huge_page_size(h));
if (!ptep)
return VM_FAULT_OOM;
-@@ -3028,6 +3082,7 @@ void hugetlb_change_protection(struct vm_area_struct *vma,
- if (!huge_pte_none(huge_ptep_get(ptep))) {
- pte = huge_ptep_get_and_clear(mm, address, ptep);
- pte = pte_mkhuge(pte_modify(pte, newprot));
-+ pte = arch_make_huge_pte(pte, vma, NULL, 0);
- set_huge_pte_at(mm, address, ptep, pte);
- }
- }
diff --git a/mm/internal.h b/mm/internal.h
index 3c5197d..08d0065 100644
--- a/mm/internal.h
@@ -75220,22 +74871,10 @@ index 002c281..9429765 100644
capable(CAP_SYS_NICE) ? MPOL_MF_MOVE_ALL : MPOL_MF_MOVE);
diff --git a/mm/migrate.c b/mm/migrate.c
-index 77ed2d7..d7adff2 100644
+index 346d32d..d7adff2 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
-@@ -143,8 +143,10 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma,
- if (is_write_migration_entry(entry))
- pte = pte_mkwrite(pte);
- #ifdef CONFIG_HUGETLB_PAGE
-- if (PageHuge(new))
-+ if (PageHuge(new)) {
- pte = pte_mkhuge(pte);
-+ pte = arch_make_huge_pte(pte, vma, new, 0);
-+ }
- #endif
- flush_cache_page(vma, addr, pte_pfn(pte));
- set_pte_at(mm, addr, ptep, pte);
-@@ -1350,8 +1352,7 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
+@@ -1352,8 +1352,7 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
*/
tcred = __task_cred(task);
if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) &&
@@ -79145,9 +78784,18 @@ index 79ae884..17c5c09 100644
a0 = a[0];
a1 = a[1];
diff --git a/net/core/datagram.c b/net/core/datagram.c
-index 0337e2b..47914a0 100644
+index 0337e2b..f82d4a3 100644
--- a/net/core/datagram.c
+++ b/net/core/datagram.c
+@@ -187,7 +187,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags,
+ skb_queue_walk(queue, skb) {
+ *peeked = skb->peeked;
+ if (flags & MSG_PEEK) {
+- if (*off >= skb->len) {
++ if (*off >= skb->len && skb->len) {
+ *off -= skb->len;
+ continue;
+ }
@@ -289,7 +289,7 @@ int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags)
}
@@ -79158,7 +78806,7 @@ index 0337e2b..47914a0 100644
return err;
diff --git a/net/core/dev.c b/net/core/dev.c
-index e5942bf..25998c3 100644
+index 3470794..eb5008c 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1162,9 +1162,13 @@ void dev_load(struct net *net, const char *name)
@@ -79324,42 +78972,18 @@ index 7e7aeb0..2a998cb 100644
m->msg_iov = iov;
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
-index fad649a..f2fdac4 100644
+index fad649a..df5891e 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
-@@ -198,14 +198,16 @@ int __rtnl_register(int protocol, int msgtype,
- rtnl_msg_handlers[protocol] = tab;
- }
-
-+ pax_open_kernel();
- if (doit)
-- tab[msgindex].doit = doit;
-+ *(void **)&tab[msgindex].doit = doit;
-
- if (dumpit)
-- tab[msgindex].dumpit = dumpit;
-+ *(void **)&tab[msgindex].dumpit = dumpit;
-
- if (calcit)
-- tab[msgindex].calcit = calcit;
-+ *(void **)&tab[msgindex].calcit = calcit;
-+ pax_close_kernel();
-
- return 0;
- }
-@@ -248,8 +250,10 @@ int rtnl_unregister(int protocol, int msgtype)
- if (rtnl_msg_handlers[protocol] == NULL)
- return -ENOENT;
+@@ -58,7 +58,7 @@ struct rtnl_link {
+ rtnl_doit_func doit;
+ rtnl_dumpit_func dumpit;
+ rtnl_calcit_func calcit;
+-};
++} __no_const;
-- rtnl_msg_handlers[protocol][msgindex].doit = NULL;
-- rtnl_msg_handlers[protocol][msgindex].dumpit = NULL;
-+ pax_open_kernel();
-+ *(void **)&rtnl_msg_handlers[protocol][msgindex].doit = NULL;
-+ *(void **)&rtnl_msg_handlers[protocol][msgindex].dumpit = NULL;
-+ pax_close_kernel();
+ static DEFINE_MUTEX(rtnl_mutex);
- return 0;
- }
diff --git a/net/core/scm.c b/net/core/scm.c
index ab57084..0190c8f 100644
--- a/net/core/scm.c
@@ -79666,7 +79290,7 @@ index 8d5cc75..821fd11 100644
rc = qp->q.fragments && (end - start) > max;
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
-index 14bbfcf..644f472 100644
+index e95d72b..5268ac0 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -1151,7 +1151,8 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
@@ -79818,10 +79442,10 @@ index 170b1fd..6105b91 100644
case IPT_SO_GET_ENTRIES:
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
-index 8f3d054..c58d05d 100644
+index 6f9c072..38ea6c6 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
-@@ -843,7 +843,7 @@ static void ping_format_sock(struct sock *sp, struct seq_file *f,
+@@ -844,7 +844,7 @@ static void ping_format_sock(struct sock *sp, struct seq_file *f,
from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)),
0, sock_i_ino(sp),
atomic_read(&sp->sk_refcnt), sp,
@@ -79831,7 +79455,7 @@ index 8f3d054..c58d05d 100644
static int ping_seq_show(struct seq_file *seq, void *v)
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
-index 73d1e4d..3af0e8f 100644
+index 6f08991..55867ad 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -311,7 +311,7 @@ static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)
@@ -79876,7 +79500,7 @@ index 73d1e4d..3af0e8f 100644
goto out;
ret = 0;
out: return ret;
-@@ -997,7 +1001,7 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
+@@ -998,7 +1002,7 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
0, 0L, 0,
from_kuid_munged(seq_user_ns(seq), sock_i_uid(sp)),
0, sock_i_ino(sp),
@@ -79886,10 +79510,10 @@ index 73d1e4d..3af0e8f 100644
static int raw_seq_show(struct seq_file *seq, void *v)
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
-index df25142..e92a82a 100644
+index 0fdfe4c..e7ea542 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
-@@ -2529,7 +2529,7 @@ static __net_initdata struct pernet_operations sysctl_route_ops = {
+@@ -2579,7 +2579,7 @@ static __net_initdata struct pernet_operations sysctl_route_ops = {
static __net_init int rt_genid_init(struct net *net)
{
@@ -79899,10 +79523,10 @@ index df25142..e92a82a 100644
sizeof(net->ipv4.dev_addr_genid));
return 0;
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
-index 181fc82..cc95f8c 100644
+index beabc80..48a6a10 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
-@@ -4704,7 +4704,7 @@ static struct sk_buff *tcp_collapse_one(struct sock *sk, struct sk_buff *skb,
+@@ -4709,7 +4709,7 @@ static struct sk_buff *tcp_collapse_one(struct sock *sk, struct sk_buff *skb,
* simplifies code)
*/
static void
@@ -79911,7 +79535,7 @@ index 181fc82..cc95f8c 100644
struct sk_buff *head, struct sk_buff *tail,
u32 start, u32 end)
{
-@@ -5536,6 +5536,9 @@ slow_path:
+@@ -5541,6 +5541,9 @@ slow_path:
if (len < (th->doff << 2) || tcp_checksum_complete_user(sk, skb))
goto csum_error;
@@ -79921,7 +79545,7 @@ index 181fc82..cc95f8c 100644
/*
* Standard slow path.
*/
-@@ -5544,7 +5547,7 @@ slow_path:
+@@ -5549,7 +5552,7 @@ slow_path:
return 0;
step5:
@@ -79930,7 +79554,7 @@ index 181fc82..cc95f8c 100644
goto discard;
/* ts_recent update must be made after we are sure that the packet
-@@ -5836,6 +5839,7 @@ discard:
+@@ -5840,6 +5843,7 @@ discard:
tcp_paws_reject(&tp->rx_opt, 0))
goto discard_and_undo;
@@ -79938,7 +79562,7 @@ index 181fc82..cc95f8c 100644
if (th->syn) {
/* We see SYN without ACK. It is attempt of
* simultaneous connect with crossed SYNs.
-@@ -5886,6 +5890,7 @@ discard:
+@@ -5890,6 +5894,7 @@ discard:
goto discard;
#endif
}
@@ -79946,7 +79570,7 @@ index 181fc82..cc95f8c 100644
/* "fifth, if neither of the SYN or RST bits is set then
* drop the segment and return."
*/
-@@ -5930,7 +5935,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
+@@ -5934,7 +5939,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
goto discard;
if (th->syn) {
@@ -79955,7 +79579,7 @@ index 181fc82..cc95f8c 100644
goto discard;
if (icsk->icsk_af_ops->conn_request(sk, skb) < 0)
return 1;
-@@ -5977,11 +5982,15 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
+@@ -5981,11 +5986,15 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
if (tcp_check_req(sk, skb, req, NULL, true) == NULL)
goto discard;
}
@@ -79972,7 +79596,7 @@ index 181fc82..cc95f8c 100644
int acceptable = tcp_ack(sk, skb, FLAG_SLOWPATH) > 0;
switch (sk->sk_state) {
-@@ -6131,8 +6140,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
+@@ -6135,8 +6144,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
}
break;
}
@@ -79983,7 +79607,7 @@ index 181fc82..cc95f8c 100644
/* ts_recent update must be made after we are sure that the packet
* is in window.
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
-index bc3cb46..815ccd6 100644
+index e637770..364ff02 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -90,6 +90,10 @@ int sysctl_tcp_low_latency __read_mostly;
@@ -79997,7 +79621,7 @@ index bc3cb46..815ccd6 100644
#ifdef CONFIG_TCP_MD5SIG
static int tcp_v4_md5_hash_hdr(char *md5_hash, const struct tcp_md5sig_key *key,
__be32 daddr, __be32 saddr, const struct tcphdr *th);
-@@ -1899,6 +1903,9 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
+@@ -1898,6 +1902,9 @@ int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
return 0;
reset:
@@ -80007,7 +79631,7 @@ index bc3cb46..815ccd6 100644
tcp_v4_send_reset(rsk, skb);
discard:
kfree_skb(skb);
-@@ -1999,12 +2006,19 @@ int tcp_v4_rcv(struct sk_buff *skb)
+@@ -1998,12 +2005,19 @@ int tcp_v4_rcv(struct sk_buff *skb)
TCP_SKB_CB(skb)->sacked = 0;
sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
@@ -80030,7 +79654,7 @@ index bc3cb46..815ccd6 100644
if (unlikely(iph->ttl < inet_sk(sk)->min_ttl)) {
NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP);
-@@ -2055,6 +2069,10 @@ no_tcp_socket:
+@@ -2054,6 +2068,10 @@ no_tcp_socket:
bad_packet:
TCP_INC_STATS_BH(net, TCP_MIB_INERRS);
} else {
@@ -80111,7 +79735,7 @@ index d47c1b4..b0584de 100644
syn_set ? 0 : icsk->icsk_user_timeout, syn_set)) {
/* Has it gone just too far? */
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
-index 79c8dbe..aceb1b6 100644
+index 1f4d405..3524677 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -87,6 +87,7 @@
@@ -80219,7 +79843,7 @@ index 79c8dbe..aceb1b6 100644
icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
/*
-@@ -2119,7 +2143,7 @@ static void udp4_format_sock(struct sock *sp, struct seq_file *f,
+@@ -2120,7 +2144,7 @@ static void udp4_format_sock(struct sock *sp, struct seq_file *f,
from_kuid_munged(seq_user_ns(f), sock_i_uid(sp)),
0, sock_i_ino(sp),
atomic_read(&sp->sk_refcnt), sp,
@@ -80229,7 +79853,7 @@ index 79c8dbe..aceb1b6 100644
int udp4_seq_show(struct seq_file *seq, void *v)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 0424e4e..308dd43 100644
+index a468a36..b50ffde 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -2121,7 +2121,7 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg)
@@ -80242,7 +79866,7 @@ index 0424e4e..308dd43 100644
if (ops->ndo_do_ioctl) {
mm_segment_t oldfs = get_fs();
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
-index d5cb3c4..b3e38d0 100644
+index a23350c..899c62c 100644
--- a/net/ipv6/ip6_gre.c
+++ b/net/ipv6/ip6_gre.c
@@ -1353,7 +1353,7 @@ static void ip6gre_fb_tunnel_init(struct net_device *dev)
@@ -81186,7 +80810,7 @@ index 7261eb8..44e8ac6 100644
*uaddr_len = sizeof(struct sockaddr_ax25);
}
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
-index 94060ed..9c066f3 100644
+index 5db6316..c9bf90e 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1578,7 +1578,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
@@ -81207,7 +80831,7 @@ index 94060ed..9c066f3 100644
spin_unlock(&sk->sk_receive_queue.lock);
drop_n_restore:
-@@ -2537,6 +2537,7 @@ out:
+@@ -2539,6 +2539,7 @@ out:
static int packet_recv_error(struct sock *sk, struct msghdr *msg, int len)
{
@@ -81215,7 +80839,7 @@ index 94060ed..9c066f3 100644
struct sock_exterr_skb *serr;
struct sk_buff *skb, *skb2;
int copied, err;
-@@ -2558,8 +2559,9 @@ static int packet_recv_error(struct sock *sk, struct msghdr *msg, int len)
+@@ -2560,8 +2561,9 @@ static int packet_recv_error(struct sock *sk, struct msghdr *msg, int len)
sock_recv_timestamp(msg, sk, skb);
serr = SKB_EXT_ERR(skb);
@@ -81226,7 +80850,7 @@ index 94060ed..9c066f3 100644
msg->msg_flags |= MSG_ERRQUEUE;
err = copied;
-@@ -3171,7 +3173,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
+@@ -3173,7 +3175,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
case PACKET_HDRLEN:
if (len > sizeof(int))
len = sizeof(int);
@@ -81235,7 +80859,7 @@ index 94060ed..9c066f3 100644
return -EFAULT;
switch (val) {
case TPACKET_V1:
-@@ -3210,7 +3212,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
+@@ -3212,7 +3214,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
len = lv;
if (put_user(len, optlen))
return -EFAULT;
@@ -81723,6 +81347,19 @@ index f226709..0e735a8 100644
_proto("Tx RESPONSE %%%u", ntohl(hdr->serial));
ret = kernel_sendmsg(conn->trans->local->socket, &msg, iov, 3, len);
+diff --git a/net/sctp/auth.c b/net/sctp/auth.c
+index 159b9bc..d8420ae 100644
+--- a/net/sctp/auth.c
++++ b/net/sctp/auth.c
+@@ -71,7 +71,7 @@ void sctp_auth_key_put(struct sctp_auth_bytes *key)
+ return;
+
+ if (atomic_dec_and_test(&key->refcnt)) {
+- kfree(key);
++ kzfree(key);
+ SCTP_DBG_OBJCNT_DEC(keys);
+ }
+ }
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index ea14cb4..834e8e4 100644
--- a/net/sctp/ipv6.c
@@ -81777,7 +81414,7 @@ index 2d51842..150ba5c 100644
static int sctp_v4_protosw_init(void)
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
-index 406d957..543c737 100644
+index 9261d9a..0a6ae623 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -4661,6 +4661,8 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
@@ -84858,12 +84495,12 @@ index 0000000..d41b5af
+}
diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c
new file mode 100644
-index 0000000..846aeb0
+index 0000000..414fe5e
--- /dev/null
+++ b/tools/gcc/colorize_plugin.c
-@@ -0,0 +1,148 @@
+@@ -0,0 +1,151 @@
+/*
-+ * Copyright 2012 by PaX Team <pageexec@freemail.hu>
++ * Copyright 2012-2013 by PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -84892,7 +84529,7 @@ index 0000000..846aeb0
+int plugin_is_GPL_compatible;
+
+static struct plugin_info colorize_plugin_info = {
-+ .version = "201203092200",
++ .version = "201302112000",
+ .help = NULL,
+};
+
@@ -84971,6 +84608,9 @@ index 0000000..846aeb0
+ .pass = {
+ .type = SIMPLE_IPA_PASS,
+ .name = "colorize_rearm",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = execute_colorize_rearm,
+ .sub = NULL,
@@ -85012,10 +84652,10 @@ index 0000000..846aeb0
+}
diff --git a/tools/gcc/constify_plugin.c b/tools/gcc/constify_plugin.c
new file mode 100644
-index 0000000..1742271
+index 0000000..c415c9d
--- /dev/null
+++ b/tools/gcc/constify_plugin.c
-@@ -0,0 +1,349 @@
+@@ -0,0 +1,359 @@
+/*
+ * Copyright 2011 by Emese Revfy <re.emese@gmail.com>
+ * Copyright 2011-2013 by PaX Team <pageexec@freemail.hu>
@@ -85056,7 +84696,7 @@ index 0000000..1742271
+int plugin_is_GPL_compatible;
+
+static struct plugin_info const_plugin_info = {
-+ .version = "201301150230",
++ .version = "201302112000",
+ .help = "no-constify\tturn off constification\n",
+};
+
@@ -85278,16 +84918,23 @@ index 0000000..1742271
+{
+ unsigned int ret = 0;
+ tree var;
-+ referenced_var_iterator rvi;
+
+#if BUILDING_GCC_VERSION == 4005
-+ FOR_EACH_REFERENCED_VAR(var, rvi) {
++ tree vars;
+#else
-+ FOR_EACH_REFERENCED_VAR(cfun, var, rvi) {
++ unsigned int i;
++#endif
++
++#if BUILDING_GCC_VERSION == 4005
++ for (vars = cfun->local_decls; vars; vars = TREE_CHAIN(vars)) {
++ var = TREE_VALUE(vars);
++#else
++ FOR_EACH_LOCAL_DECL(cfun, i, var) {
+#endif
+ tree type = TREE_TYPE(var);
+
-+ if (!DECL_P(var) || TREE_STATIC(var) || DECL_EXTERNAL(var))
++ gcc_assert(DECL_P(var));
++ if (is_global_var(var))
+ continue;
+
+ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE)
@@ -85299,8 +84946,8 @@ index 0000000..1742271
+// if (lookup_attribute("no_const", DECL_ATTRIBUTES(var)))
+// continue;
+
-+// if (lookup_attribute("no_const", TYPE_ATTRIBUTES(type)))
-+// continue;
++ if (lookup_attribute("no_const", TYPE_ATTRIBUTES(type)))
++ continue;
+
+ if (walk_struct(type)) {
+ error_at(DECL_SOURCE_LOCATION(var), "constified variable %qE cannot be local", var);
@@ -85314,6 +84961,9 @@ index 0000000..1742271
+ {
+ .type = GIMPLE_PASS,
+ .name = "check_local_variables",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = check_local_variables,
+ .sub = NULL,
@@ -85467,12 +85117,12 @@ index 0000000..e518932
+exit 0
diff --git a/tools/gcc/kallocstat_plugin.c b/tools/gcc/kallocstat_plugin.c
new file mode 100644
-index 0000000..a86e422
+index 0000000..568b360
--- /dev/null
+++ b/tools/gcc/kallocstat_plugin.c
-@@ -0,0 +1,167 @@
+@@ -0,0 +1,170 @@
+/*
-+ * Copyright 2011 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -85524,7 +85174,7 @@ index 0000000..a86e422
+};
+
+static struct plugin_info kallocstat_plugin_info = {
-+ .version = "201111150100",
++ .version = "201302112000",
+};
+
+static unsigned int execute_kallocstat(void);
@@ -85533,6 +85183,9 @@ index 0000000..a86e422
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "kallocstat",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = execute_kallocstat,
+ .sub = NULL,
@@ -85640,12 +85293,12 @@ index 0000000..a86e422
+}
diff --git a/tools/gcc/kernexec_plugin.c b/tools/gcc/kernexec_plugin.c
new file mode 100644
-index 0000000..8856202
+index 0000000..0408e06
--- /dev/null
+++ b/tools/gcc/kernexec_plugin.c
-@@ -0,0 +1,432 @@
+@@ -0,0 +1,465 @@
+/*
-+ * Copyright 2011 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -85688,10 +85341,14 @@ index 0000000..8856202
+#define ANY_RETURN_P(rtx) (GET_CODE(rtx) == RETURN)
+#endif
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+int plugin_is_GPL_compatible;
+
+static struct plugin_info kernexec_plugin_info = {
-+ .version = "201111291120",
++ .version = "201302112000",
+ .help = "method=[bts|or]\tinstrumentation method\n"
+};
+
@@ -85707,6 +85364,9 @@ index 0000000..8856202
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "kernexec_reload",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = kernexec_cmodel_check,
+ .execute = execute_kernexec_reload,
+ .sub = NULL,
@@ -85725,6 +85385,9 @@ index 0000000..8856202
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "kernexec_fptr",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = kernexec_cmodel_check,
+ .execute = execute_kernexec_fptr,
+ .sub = NULL,
@@ -85743,6 +85406,9 @@ index 0000000..8856202
+ .pass = {
+ .type = RTL_PASS,
+ .name = "kernexec_retaddr",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = kernexec_cmodel_check,
+ .execute = execute_kernexec_retaddr,
+ .sub = NULL,
@@ -85840,8 +85506,10 @@ index 0000000..8856202
+
+ // create temporary unsigned long variable used for bitops and cast fptr to it
+ intptr = create_tmp_var(long_unsigned_type_node, "kernexec_bts");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(intptr);
+ mark_sym_for_renaming(intptr);
++#endif
+ assign_intptr = gimple_build_assign(intptr, fold_convert(long_unsigned_type_node, old_fptr));
+ gsi_insert_before(gsi, assign_intptr, GSI_SAME_STMT);
+ update_stmt(assign_intptr);
@@ -85855,8 +85523,10 @@ index 0000000..8856202
+
+ // cast temporary unsigned long back to a temporary fptr variable
+ new_fptr = create_tmp_var(TREE_TYPE(old_fptr), "kernexec_fptr");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(new_fptr);
+ mark_sym_for_renaming(new_fptr);
++#endif
+ assign_new_fptr = gimple_build_assign(new_fptr, fold_convert(TREE_TYPE(old_fptr), intptr));
+ gsi_insert_before(gsi, assign_new_fptr, GSI_SAME_STMT);
+ update_stmt(assign_new_fptr);
@@ -85870,24 +85540,36 @@ index 0000000..8856202
+{
+ gimple asm_or_stmt, call_stmt;
+ tree old_fptr, new_fptr, input, output;
++#if BUILDING_GCC_VERSION <= 4007
+ VEC(tree, gc) *inputs = NULL;
+ VEC(tree, gc) *outputs = NULL;
++#else
++ vec<tree, va_gc> *inputs = NULL;
++ vec<tree, va_gc> *outputs = NULL;
++#endif
+
+ call_stmt = gsi_stmt(*gsi);
+ old_fptr = gimple_call_fn(call_stmt);
+
+ // create temporary fptr variable
+ new_fptr = create_tmp_var(TREE_TYPE(old_fptr), "kernexec_or");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(new_fptr);
+ mark_sym_for_renaming(new_fptr);
++#endif
+
+ // build asm volatile("orq %%r10, %0\n\t" : "=r"(new_fptr) : "0"(old_fptr));
+ input = build_tree_list(NULL_TREE, build_string(2, "0"));
+ input = chainon(NULL_TREE, build_tree_list(input, old_fptr));
+ output = build_tree_list(NULL_TREE, build_string(3, "=r"));
+ output = chainon(NULL_TREE, build_tree_list(output, new_fptr));
++#if BUILDING_GCC_VERSION <= 4007
+ VEC_safe_push(tree, gc, inputs, input);
+ VEC_safe_push(tree, gc, outputs, output);
++#else
++ vec_safe_push(inputs, input);
++ vec_safe_push(outputs, output);
++#endif
+ asm_or_stmt = gimple_build_asm_vec("orq %%r10, %0\n\t", inputs, outputs, NULL, NULL);
+ gimple_asm_set_volatile(asm_or_stmt, true);
+ gsi_insert_before(gsi, asm_or_stmt, GSI_SAME_STMT);
@@ -85925,9 +85607,13 @@ index 0000000..8856202
+ gcc_unreachable();
+
+ // ... through a function pointer
-+ fn = SSA_NAME_VAR(fn);
-+ if (TREE_CODE(fn) != VAR_DECL && TREE_CODE(fn) != PARM_DECL)
-+ continue;
++ if (SSA_NAME_VAR(fn) != NULL_TREE) {
++ fn = SSA_NAME_VAR(fn);
++ if (TREE_CODE(fn) != VAR_DECL && TREE_CODE(fn) != PARM_DECL) {
++ debug_tree(fn);
++ gcc_unreachable();
++ }
++ }
+ fn = TREE_TYPE(fn);
+ if (TREE_CODE(fn) != POINTER_TYPE)
+ continue;
@@ -86078,12 +85764,12 @@ index 0000000..8856202
+}
diff --git a/tools/gcc/latent_entropy_plugin.c b/tools/gcc/latent_entropy_plugin.c
new file mode 100644
-index 0000000..b8008f7
+index 0000000..1276616
--- /dev/null
+++ b/tools/gcc/latent_entropy_plugin.c
-@@ -0,0 +1,295 @@
+@@ -0,0 +1,321 @@
+/*
-+ * Copyright 2012 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2012-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -86123,12 +85809,16 @@ index 0000000..b8008f7
+#include "emit-rtl.h"
+#include "tree-flow.h"
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+int plugin_is_GPL_compatible;
+
+static tree latent_entropy_decl;
+
+static struct plugin_info latent_entropy_plugin_info = {
-+ .version = "201207271820",
++ .version = "201302112000",
+ .help = NULL
+};
+
@@ -86139,6 +85829,9 @@ index 0000000..b8008f7
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "latent_entropy",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = gate_latent_entropy,
+ .execute = execute_latent_entropy,
+ .sub = NULL,
@@ -86234,7 +85927,9 @@ index 0000000..b8008f7
+ op = get_op(&rhs);
+ addxorrol = fold_build2_loc(UNKNOWN_LOCATION, op, unsigned_intDI_type_node, local_entropy, rhs);
+ assign = gimple_build_assign(local_entropy, addxorrol);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+//debug_bb(bb);
+ gsi = gsi_after_labels(bb);
+ gsi_insert_before(&gsi, assign, GSI_NEW_STMT);
@@ -86249,12 +85944,16 @@ index 0000000..b8008f7
+
+ // 1. create temporary copy of latent_entropy
+ temp = create_tmp_var(unsigned_intDI_type_node, "temp_latent_entropy");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(temp);
+ mark_sym_for_renaming(temp);
++#endif
+
+ // 2. read...
+ assign = gimple_build_assign(temp, latent_entropy_decl);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi = gsi_after_labels(bb);
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
@@ -86262,13 +85961,17 @@ index 0000000..b8008f7
+ // 3. ...modify...
+ addxorrol = fold_build2_loc(UNKNOWN_LOCATION, get_op(NULL), unsigned_intDI_type_node, temp, rhs);
+ assign = gimple_build_assign(temp, addxorrol);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
+
+ // 4. ...write latent_entropy
+ assign = gimple_build_assign(latent_entropy_decl, temp);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
+}
@@ -86283,8 +85986,13 @@ index 0000000..b8008f7
+ if (!latent_entropy_decl) {
+ struct varpool_node *node;
+
++#if BUILDING_GCC_VERSION <= 4007
+ for (node = varpool_nodes; node; node = node->next) {
+ tree var = node->decl;
++#else
++ FOR_EACH_VARIABLE(node) {
++ tree var = node->symbol.decl;
++#endif
+ if (strcmp(IDENTIFIER_POINTER(DECL_NAME(var)), "latent_entropy"))
+ continue;
+ latent_entropy_decl = var;
@@ -86301,8 +86009,10 @@ index 0000000..b8008f7
+
+ // 1. create local entropy variable
+ local_entropy = create_tmp_var(unsigned_intDI_type_node, "local_entropy");
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(local_entropy);
+ mark_sym_for_renaming(local_entropy);
++#endif
+
+ // 2. initialize local entropy variable
+ bb = split_block_after_labels(ENTRY_BLOCK_PTR)->dest;
@@ -86312,7 +86022,9 @@ index 0000000..b8008f7
+
+ assign = gimple_build_assign(local_entropy, build_int_cstu(unsigned_intDI_type_node, get_random_const()));
+// gimple_set_location(assign, loc);
++#if BUILDING_GCC_VERSION <= 4007
+ find_referenced_vars_in(assign);
++#endif
+ gsi_insert_after(&gsi, assign, GSI_NEW_STMT);
+ update_stmt(assign);
+ bb = bb->next_bb;
@@ -90098,10 +89810,10 @@ index 0000000..5921fd7
+atyfb_setup_generic_49151 atyfb_setup_generic 3 49151 NULL
diff --git a/tools/gcc/size_overflow_plugin.c b/tools/gcc/size_overflow_plugin.c
new file mode 100644
-index 0000000..792ee60
+index 0000000..d52f2ee
--- /dev/null
+++ b/tools/gcc/size_overflow_plugin.c
-@@ -0,0 +1,1930 @@
+@@ -0,0 +1,1941 @@
+/*
+ * Copyright 2011, 2012 by Emese Revfy <re.emese@gmail.com>
+ * Licensed under the GPL v2, or (at your option) v3
@@ -90142,6 +89854,10 @@ index 0000000..792ee60
+#define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP)
+#endif
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+struct size_overflow_hash {
+ const struct size_overflow_hash * const next;
+ const char * const name;
@@ -90494,8 +90210,10 @@ index 0000000..792ee60
+{
+ tree new_var = create_tmp_var(type, "cicus");
+
++#if BUILDING_GCC_VERSION <= 4007
+ add_referenced_var(new_var);
+ mark_sym_for_renaming(new_var);
++#endif
+ return new_var;
+}
+
@@ -90715,11 +90433,13 @@ index 0000000..792ee60
+ basic_block bb;
+ gimple phi;
+ gimple_stmt_iterator gsi = gsi_for_stmt(oldstmt);
++ gimple_seq seq;
+
+ bb = gsi_bb(gsi);
+
+ phi = create_phi_node(result, bb);
-+ gsi = gsi_last(phi_nodes(bb));
++ seq = phi_nodes(bb);
++ gsi = gsi_last(seq);
+ gsi_remove(&gsi, false);
+
+ gsi = gsi_for_stmt(oldstmt);
@@ -91959,13 +91679,16 @@ index 0000000..792ee60
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "size_overflow",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = NULL,
+ .execute = handle_function,
+ .sub = NULL,
+ .next = NULL,
+ .static_pass_number = 0,
+ .tv_id = TV_NONE,
-+ .properties_required = PROP_cfg | PROP_referenced_vars,
++ .properties_required = PROP_cfg,
+ .properties_provided = 0,
+ .properties_destroyed = 0,
+ .todo_flags_start = 0,
@@ -92034,12 +91757,12 @@ index 0000000..792ee60
+}
diff --git a/tools/gcc/stackleak_plugin.c b/tools/gcc/stackleak_plugin.c
new file mode 100644
-index 0000000..38d2014
+index 0000000..ac2901e
--- /dev/null
+++ b/tools/gcc/stackleak_plugin.c
-@@ -0,0 +1,313 @@
+@@ -0,0 +1,327 @@
+/*
-+ * Copyright 2011 by the PaX Team <pageexec@freemail.hu>
++ * Copyright 2011-2013 by the PaX Team <pageexec@freemail.hu>
+ * Licensed under the GPL v2
+ *
+ * Note: the choice of the license means that the compilation process is
@@ -92077,6 +91800,10 @@ index 0000000..38d2014
+#include "rtl.h"
+#include "emit-rtl.h"
+
++#if BUILDING_GCC_VERSION >= 4008
++#define TODO_dump_func 0
++#endif
++
+extern void print_gimple_stmt(FILE *, gimple, int, int);
+
+int plugin_is_GPL_compatible;
@@ -92087,7 +91814,7 @@ index 0000000..38d2014
+static bool init_locals;
+
+static struct plugin_info stackleak_plugin_info = {
-+ .version = "201203140940",
++ .version = "201302112000",
+ .help = "track-lowest-sp=nn\ttrack sp in functions whose frame size is at least nn bytes\n"
+// "initialize-locals\t\tforcibly initialize all stack frames\n"
+};
@@ -92100,6 +91827,9 @@ index 0000000..38d2014
+ .pass = {
+ .type = GIMPLE_PASS,
+ .name = "stackleak_tree_instrument",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = gate_stackleak_track_stack,
+ .execute = execute_stackleak_tree_instrument,
+ .sub = NULL,
@@ -92118,6 +91848,9 @@ index 0000000..38d2014
+ .pass = {
+ .type = RTL_PASS,
+ .name = "stackleak_final",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
+ .gate = gate_stackleak_track_stack,
+ .execute = execute_stackleak_final,
+ .sub = NULL,
@@ -92254,7 +91987,7 @@ index 0000000..38d2014
+
+static unsigned int execute_stackleak_final(void)
+{
-+ rtx insn;
++ rtx insn, next;
+
+ if (cfun->calls_alloca)
+ return 0;
@@ -92264,10 +91997,11 @@ index 0000000..38d2014
+ return 0;
+
+ // 1. find pax_track_stack calls
-+ for (insn = get_insns(); insn; insn = NEXT_INSN(insn)) {
++ for (insn = get_insns(); insn; insn = next) {
+ // rtl match: (call_insn 8 7 9 3 (call (mem (symbol_ref ("pax_track_stack") [flags 0x41] <function_decl 0xb7470e80 pax_track_stack>) [0 S1 A8]) (4)) -1 (nil) (nil))
+ rtx body;
+
++ next = NEXT_INSN(insn);
+ if (!CALL_P(insn))
+ continue;
+ body = PATTERN(insn);
@@ -92283,10 +92017,13 @@ index 0000000..38d2014
+ continue;
+// warning(0, "track_frame_size: %d %ld %d", cfun->calls_alloca, get_frame_size(), track_frame_size);
+ // 2. delete call
-+ insn = delete_insn_and_edges(insn);
++ delete_insn_and_edges(insn);
+#if BUILDING_GCC_VERSION >= 4007
-+ if (GET_CODE(insn) == NOTE && NOTE_KIND(insn) == NOTE_INSN_CALL_ARG_LOCATION)
-+ insn = delete_insn_and_edges(insn);
++ if (GET_CODE(next) == NOTE && NOTE_KIND(next) == NOTE_INSN_CALL_ARG_LOCATION) {
++ insn = next;
++ next = NEXT_INSN(insn);
++ delete_insn_and_edges(insn);
++ }
+#endif
+ }
+
@@ -92364,7 +92101,7 @@ index 6789d78..4afd019e 100644
+
#endif
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
-index 6e8fa7e..37f02a5 100644
+index 6e8fa7e..f0ec393 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -75,12 +75,17 @@ LIST_HEAD(vm_list);
@@ -92396,6 +92133,33 @@ index 6e8fa7e..37f02a5 100644
(void __user *)(unsigned long)mem->userspace_addr,
mem->memory_size)))
goto out;
+@@ -1778,7 +1783,7 @@ static int kvm_vcpu_release(struct inode *inode, struct file *filp)
+ return 0;
+ }
+
+-static struct file_operations kvm_vcpu_fops = {
++static file_operations_no_const kvm_vcpu_fops __read_only = {
+ .release = kvm_vcpu_release,
+ .unlocked_ioctl = kvm_vcpu_ioctl,
+ #ifdef CONFIG_COMPAT
+@@ -2326,7 +2331,7 @@ static int kvm_vm_mmap(struct file *file, struct vm_area_struct *vma)
+ return 0;
+ }
+
+-static struct file_operations kvm_vm_fops = {
++static file_operations_no_const kvm_vm_fops __read_only = {
+ .release = kvm_vm_release,
+ .unlocked_ioctl = kvm_vm_ioctl,
+ #ifdef CONFIG_COMPAT
+@@ -2424,7 +2429,7 @@ out:
+ return r;
+ }
+
+-static struct file_operations kvm_chardev_ops = {
++static file_operations_no_const kvm_chardev_ops __read_only = {
+ .unlocked_ioctl = kvm_dev_ioctl,
+ .compat_ioctl = kvm_dev_ioctl,
+ .llseek = noop_llseek,
@@ -2450,7 +2455,7 @@ static void hardware_enable_nolock(void *junk)
if (r) {
@@ -92440,13 +92204,10 @@ index 6e8fa7e..37f02a5 100644
if (r)
goto out_free;
-- kvm_chardev_ops.owner = module;
-- kvm_vm_fops.owner = module;
-- kvm_vcpu_fops.owner = module;
+ pax_open_kernel();
-+ *(void **)&kvm_chardev_ops.owner = module;
-+ *(void **)&kvm_vm_fops.owner = module;
-+ *(void **)&kvm_vcpu_fops.owner = module;
+ kvm_chardev_ops.owner = module;
+ kvm_vm_fops.owner = module;
+ kvm_vcpu_fops.owner = module;
+ pax_close_kernel();
r = misc_register(&kvm_dev);
diff --git a/3.7.6/4425_grsec_remove_EI_PAX.patch b/3.7.8/4425_grsec_remove_EI_PAX.patch
index 97e6951..97e6951 100644
--- a/3.7.6/4425_grsec_remove_EI_PAX.patch
+++ b/3.7.8/4425_grsec_remove_EI_PAX.patch
diff --git a/3.7.6/4430_grsec-remove-localversion-grsec.patch b/3.7.8/4430_grsec-remove-localversion-grsec.patch
index 31cf878..31cf878 100644
--- a/3.7.6/4430_grsec-remove-localversion-grsec.patch
+++ b/3.7.8/4430_grsec-remove-localversion-grsec.patch
diff --git a/3.7.6/4435_grsec-mute-warnings.patch b/3.7.8/4435_grsec-mute-warnings.patch
index e1a7a3c..e1a7a3c 100644
--- a/3.7.6/4435_grsec-mute-warnings.patch
+++ b/3.7.8/4435_grsec-mute-warnings.patch
diff --git a/3.7.6/4440_grsec-remove-protected-paths.patch b/3.7.8/4440_grsec-remove-protected-paths.patch
index 637934a..637934a 100644
--- a/3.7.6/4440_grsec-remove-protected-paths.patch
+++ b/3.7.8/4440_grsec-remove-protected-paths.patch
diff --git a/3.7.6/4450_grsec-kconfig-default-gids.patch b/3.7.8/4450_grsec-kconfig-default-gids.patch
index 3dfdc8f..3dfdc8f 100644
--- a/3.7.6/4450_grsec-kconfig-default-gids.patch
+++ b/3.7.8/4450_grsec-kconfig-default-gids.patch
diff --git a/3.7.6/4465_selinux-avc_audit-log-curr_ip.patch b/3.7.8/4465_selinux-avc_audit-log-curr_ip.patch
index 5b614b1..5b614b1 100644
--- a/3.7.6/4465_selinux-avc_audit-log-curr_ip.patch
+++ b/3.7.8/4465_selinux-avc_audit-log-curr_ip.patch
diff --git a/3.7.6/4470_disable-compat_vdso.patch b/3.7.8/4470_disable-compat_vdso.patch
index 1037ba9..1037ba9 100644
--- a/3.7.6/4470_disable-compat_vdso.patch
+++ b/3.7.8/4470_disable-compat_vdso.patch