]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
Merge branch 'x86/unify-cpu-detect' into x86-v28-for-linus-phase4-D
authorIngo Molnar <mingo@elte.hu>
Sat, 11 Oct 2008 18:23:20 +0000 (20:23 +0200)
committerIngo Molnar <mingo@elte.hu>
Sat, 11 Oct 2008 18:23:20 +0000 (20:23 +0200)
Conflicts:
arch/x86/kernel/cpu/common.c
arch/x86/kernel/signal_64.c
include/asm-x86/cpufeature.h

12 files changed:
1  2 
arch/x86/ia32/ia32_signal.c
arch/x86/kernel/cpu/common.c
arch/x86/kernel/process.c
arch/x86/kernel/sigframe.h
arch/x86/kernel/signal_32.c
arch/x86/kernel/signal_64.c
arch/x86/kernel/traps_64.c
arch/x86/kvm/vmx.h
arch/x86/mm/init_64.c
include/asm-x86/cpufeature.h
include/asm-x86/thread_info.h
include/linux/ioport.h

index f1a2ac777fafa0a6b6f14b8296eae650eb45e6ee,f25a10124005c5a4911ba563a87ee94320ddd811..8d64c1bc84743bf8e04a8435eb8cf9becd927369
@@@ -179,9 -179,10 +179,10 @@@ struct sigfram
        u32 pretcode;
        int sig;
        struct sigcontext_ia32 sc;
-       struct _fpstate_ia32 fpstate;
+       struct _fpstate_ia32 fpstate_unused; /* look at kernel/sigframe.h */
        unsigned int extramask[_COMPAT_NSIG_WORDS-1];
        char retcode[8];
+       /* fp state follows here */
  };
  
  struct rt_sigframe
        u32 puc;
        compat_siginfo_t info;
        struct ucontext_ia32 uc;
-       struct _fpstate_ia32 fpstate;
        char retcode[8];
+       /* fp state follows here */
  };
  
  #define COPY(x)               {               \
        { unsigned int cur;                                             \
          unsigned short pre;                                           \
          err |= __get_user(pre, &sc->seg);                             \
 -        asm volatile("movl %%" #seg ",%0" : "=r" (cur));              \
 +        savesegment(seg, cur);                                        \
          pre |= mask;                                                  \
          if (pre != cur) loadsegment(seg, pre); }
  
@@@ -215,7 -216,7 +216,7 @@@ static int ia32_restore_sigcontext(stru
                                   unsigned int *peax)
  {
        unsigned int tmpflags, gs, oldgs, err = 0;
-       struct _fpstate_ia32 __user *buf;
+       void __user *buf;
        u32 tmp;
  
        /* Always make any pending restarted system calls return -EINTR */
         */
        err |= __get_user(gs, &sc->gs);
        gs |= 3;
 -      asm("movl %%gs,%0" : "=r" (oldgs));
 +      savesegment(gs, oldgs);
        if (gs != oldgs)
                load_gs_index(gs);
  
  
        err |= __get_user(tmp, &sc->fpstate);
        buf = compat_ptr(tmp);
-       if (buf) {
-               if (!access_ok(VERIFY_READ, buf, sizeof(*buf)))
-                       goto badframe;
-               err |= restore_i387_ia32(buf);
-       } else {
-               struct task_struct *me = current;
-               if (used_math()) {
-                       clear_fpu(me);
-                       clear_used_math();
-               }
-       }
+       err |= restore_i387_xstate_ia32(buf);
  
        err |= __get_user(tmp, &sc->ax);
        *peax = tmp;
  
        return err;
- badframe:
-       return 1;
  }
  
  asmlinkage long sys32_sigreturn(struct pt_regs *regs)
@@@ -350,18 -337,19 +337,18 @@@ badframe
   */
  
  static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
-                                struct _fpstate_ia32 __user *fpstate,
+                                void __user *fpstate,
                                 struct pt_regs *regs, unsigned int mask)
  {
        int tmp, err = 0;
  
 -      tmp = 0;
 -      __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
 +      savesegment(gs, tmp);
        err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
 -      __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
 +      savesegment(fs, tmp);
        err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
 -      __asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp));
 +      savesegment(ds, tmp);
        err |= __put_user(tmp, (unsigned int __user *)&sc->ds);
 -      __asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp));
 +      savesegment(es, tmp);
        err |= __put_user(tmp, (unsigned int __user *)&sc->es);
  
        err |= __put_user((u32)regs->di, &sc->di);
        err |= __put_user((u32)regs->flags, &sc->flags);
        err |= __put_user((u32)regs->sp, &sc->sp_at_signal);
  
-       tmp = save_i387_ia32(fpstate);
+       tmp = save_i387_xstate_ia32(fpstate);
        if (tmp < 0)
                err = -EFAULT;
        else {
   * Determine which stack to use..
   */
  static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
-                                size_t frame_size)
+                                size_t frame_size,
+                                void **fpstate)
  {
        unsigned long sp;
  
                 ka->sa.sa_restorer)
                sp = (unsigned long) ka->sa.sa_restorer;
  
+       if (used_math()) {
+               sp = sp - sig_xstate_ia32_size;
+               *fpstate = (struct _fpstate_ia32 *) sp;
+       }
        sp -= frame_size;
        /* Align the stack pointer according to the i386 ABI,
         * i.e. so that on function entry ((sp + 4) & 15) == 0. */
@@@ -433,6 -427,7 +426,7 @@@ int ia32_setup_frame(int sig, struct k_
        struct sigframe __user *frame;
        void __user *restorer;
        int err = 0;
+       void __user *fpstate = NULL;
  
        /* copy_to_user optimizes that into a single 8 byte store */
        static const struct {
                0,
        };
  
-       frame = get_sigframe(ka, regs, sizeof(*frame));
+       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
  
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                goto give_sigsegv;
        if (err)
                goto give_sigsegv;
  
-       err |= ia32_setup_sigcontext(&frame->sc, &frame->fpstate, regs,
-                                       set->sig[0]);
+       err |= ia32_setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]);
        if (err)
                goto give_sigsegv;
  
        regs->dx = 0;
        regs->cx = 0;
  
 -      asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
 -      asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
 +      loadsegment(ds, __USER32_DS);
 +      loadsegment(es, __USER32_DS);
  
        regs->cs = __USER32_CS;
        regs->ss = __USER32_DS;
@@@ -521,6 -515,7 +514,7 @@@ int ia32_setup_rt_frame(int sig, struc
        struct rt_sigframe __user *frame;
        void __user *restorer;
        int err = 0;
+       void __user *fpstate = NULL;
  
        /* __copy_to_user optimizes that into a single 8 byte store */
        static const struct {
                0,
        };
  
-       frame = get_sigframe(ka, regs, sizeof(*frame));
+       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
  
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                goto give_sigsegv;
                goto give_sigsegv;
  
        /* Create the ucontext.  */
-       err |= __put_user(0, &frame->uc.uc_flags);
+       if (cpu_has_xsave)
+               err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags);
+       else
+               err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
        err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
        err |= __put_user(sas_ss_flags(regs->sp),
                          &frame->uc.uc_stack.ss_flags);
        err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-       err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
+       err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
                                     regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
        regs->dx = (unsigned long) &frame->info;
        regs->cx = (unsigned long) &frame->uc;
  
 -      asm volatile("movl %0,%%ds" :: "r" (__USER32_DS));
 -      asm volatile("movl %0,%%es" :: "r" (__USER32_DS));
 +      loadsegment(ds, __USER32_DS);
 +      loadsegment(es, __USER32_DS);
  
        regs->cs = __USER32_CS;
        regs->ss = __USER32_DS;
index 4e456bd955bb8389c4c7536d23635fdc97ec67f5,84c4040efa80d9a66cc98d681a7ecd676d862e03..7581b62df184b8b2166e6df667e5d9aa4493723e
@@@ -1,28 -1,62 +1,62 @@@
  #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/sched.h>
  #include <linux/string.h>
+ #include <linux/bootmem.h>
+ #include <linux/bitops.h>
+ #include <linux/module.h>
+ #include <linux/kgdb.h>
+ #include <linux/topology.h>
  #include <linux/delay.h>
  #include <linux/smp.h>
- #include <linux/module.h>
  #include <linux/percpu.h>
- #include <linux/bootmem.h>
- #include <asm/processor.h>
  #include <asm/i387.h>
  #include <asm/msr.h>
  #include <asm/io.h>
+ #include <asm/linkage.h>
  #include <asm/mmu_context.h>
  #include <asm/mtrr.h>
  #include <asm/mce.h>
  #include <asm/pat.h>
  #include <asm/asm.h>
+ #include <asm/numa.h>
  #ifdef CONFIG_X86_LOCAL_APIC
  #include <asm/mpspec.h>
  #include <asm/apic.h>
  #include <mach_apic.h>
+ #include <asm/genapic.h>
  #endif
  
+ #include <asm/pda.h>
+ #include <asm/pgtable.h>
+ #include <asm/processor.h>
+ #include <asm/desc.h>
+ #include <asm/atomic.h>
+ #include <asm/proto.h>
+ #include <asm/sections.h>
+ #include <asm/setup.h>
  #include "cpu.h"
  
+ static struct cpu_dev *this_cpu __cpuinitdata;
+ #ifdef CONFIG_X86_64
+ /* We need valid kernel segments for data and code in long mode too
+  * IRET will check the segment types  kkeil 2000/10/28
+  * Also sysret mandates a special GDT layout
+  */
+ /* The TLS descriptors are currently at a different place compared to i386.
+    Hopefully nobody expects them at a fixed place (Wine?) */
  DEFINE_PER_CPU(struct gdt_page, gdt_page) = { .gdt = {
+       [GDT_ENTRY_KERNEL32_CS] = { { { 0x0000ffff, 0x00cf9b00 } } },
+       [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00af9b00 } } },
+       [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9300 } } },
+       [GDT_ENTRY_DEFAULT_USER32_CS] = { { { 0x0000ffff, 0x00cffb00 } } },
+       [GDT_ENTRY_DEFAULT_USER_DS] = { { { 0x0000ffff, 0x00cff300 } } },
+       [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00affb00 } } },
+ } };
+ #else
+ DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
        [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } },
        [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } },
        [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00cffa00 } } },
        [GDT_ENTRY_ESPFIX_SS] = { { { 0x00000000, 0x00c09200 } } },
        [GDT_ENTRY_PERCPU] = { { { 0x00000000, 0x00000000 } } },
  } };
+ #endif
  EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
  
- __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;
+ #ifdef CONFIG_X86_32
  static int cachesize_override __cpuinitdata = -1;
  static int disable_x86_serial_nr __cpuinitdata = 1;
  
- struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {};
+ static int __init cachesize_setup(char *str)
+ {
+       get_option(&str, &cachesize_override);
+       return 1;
+ }
+ __setup("cachesize=", cachesize_setup);
+ static int __init x86_fxsr_setup(char *s)
+ {
+       setup_clear_cpu_cap(X86_FEATURE_FXSR);
+       setup_clear_cpu_cap(X86_FEATURE_XMM);
+       return 1;
+ }
+ __setup("nofxsr", x86_fxsr_setup);
+ static int __init x86_sep_setup(char *s)
+ {
+       setup_clear_cpu_cap(X86_FEATURE_SEP);
+       return 1;
+ }
+ __setup("nosep", x86_sep_setup);
+ /* Standard macro to see if a specific flag is changeable */
+ static inline int flag_is_changeable_p(u32 flag)
+ {
+       u32 f1, f2;
+       asm("pushfl\n\t"
+           "pushfl\n\t"
+           "popl %0\n\t"
+           "movl %0,%1\n\t"
+           "xorl %2,%0\n\t"
+           "pushl %0\n\t"
+           "popfl\n\t"
+           "pushfl\n\t"
+           "popl %0\n\t"
+           "popfl\n\t"
+           : "=&r" (f1), "=&r" (f2)
+           : "ir" (flag));
+       return ((f1^f2) & flag) != 0;
+ }
+ /* Probe for the CPUID instruction */
+ static int __cpuinit have_cpuid_p(void)
+ {
+       return flag_is_changeable_p(X86_EFLAGS_ID);
+ }
+ static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
+ {
+       if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr) {
+               /* Disable processor serial number */
+               unsigned long lo, hi;
+               rdmsr(MSR_IA32_BBL_CR_CTL, lo, hi);
+               lo |= 0x200000;
+               wrmsr(MSR_IA32_BBL_CR_CTL, lo, hi);
+               printk(KERN_NOTICE "CPU serial number disabled.\n");
+               clear_cpu_cap(c, X86_FEATURE_PN);
+               /* Disabling the serial number may affect the cpuid level */
+               c->cpuid_level = cpuid_eax(0);
+       }
+ }
+ static int __init x86_serial_nr_setup(char *s)
+ {
+       disable_x86_serial_nr = 0;
+       return 1;
+ }
+ __setup("serialnumber", x86_serial_nr_setup);
+ #else
+ static inline int flag_is_changeable_p(u32 flag)
+ {
+       return 1;
+ }
+ /* Probe for the CPUID instruction */
+ static inline int have_cpuid_p(void)
+ {
+       return 1;
+ }
+ static inline void squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
+ {
+ }
+ #endif
+ /*
+  * Naming convention should be: <Name> [(<Codename>)]
+  * This table only is used unless init_<vendor>() below doesn't set it;
+  * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used
+  *
+  */
+ /* Look up CPU names by table lookup. */
+ static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
+ {
+       struct cpu_model_info *info;
+       if (c->x86_model >= 16)
+               return NULL;    /* Range check */
+       if (!this_cpu)
+               return NULL;
+       info = this_cpu->c_models;
+       while (info && info->family) {
+               if (info->family == c->x86)
+                       return info->model_names[c->x86_model];
+               info++;
+       }
+       return NULL;            /* Not found */
+ }
+ __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;
+ /* Current gdt points %fs at the "master" per-cpu area: after this,
+  * it's on the real one. */
+ void switch_to_new_gdt(void)
+ {
+       struct desc_ptr gdt_descr;
+       gdt_descr.address = (long)get_cpu_gdt_table(smp_processor_id());
+       gdt_descr.size = GDT_SIZE - 1;
+       load_gdt(&gdt_descr);
+ #ifdef CONFIG_X86_32
+       asm("mov %0, %%fs" : : "r" (__KERNEL_PERCPU) : "memory");
+ #endif
+ }
+ static struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {};
  
  static void __cpuinit default_init(struct cpuinfo_x86 *c)
  {
+ #ifdef CONFIG_X86_64
+       display_cacheinfo(c);
+ #else
        /* Not much we can do here... */
        /* Check if at least it has cpuid */
        if (c->cpuid_level == -1) {
                else if (c->x86 == 3)
                        strcpy(c->x86_model_id, "386");
        }
+ #endif
  }
  
  static struct cpu_dev __cpuinitdata default_cpu = {
        .c_init = default_init,
        .c_vendor = "Unknown",
+       .c_x86_vendor = X86_VENDOR_UNKNOWN,
  };
- static struct cpu_dev *this_cpu __cpuinitdata = &default_cpu;
  
- static int __init cachesize_setup(char *str)
- {
-       get_option(&str, &cachesize_override);
-       return 1;
- }
- __setup("cachesize=", cachesize_setup);
- int __cpuinit get_model_name(struct cpuinfo_x86 *c)
+ static void __cpuinit get_model_name(struct cpuinfo_x86 *c)
  {
        unsigned int *v;
        char *p, *q;
  
-       if (cpuid_eax(0x80000000) < 0x80000004)
-               return 0;
+       if (c->extended_cpuid_level < 0x80000004)
+               return;
  
        v = (unsigned int *) c->x86_model_id;
        cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
             while (q <= &c->x86_model_id[48])
                  *q++ = '\0';  /* Zero-pad the rest */
        }
-       return 1;
  }
  
  void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
  {
-       unsigned int n, dummy, ecx, edx, l2size;
+       unsigned int n, dummy, ebx, ecx, edx, l2size;
  
-       n = cpuid_eax(0x80000000);
+       n = c->extended_cpuid_level;
  
        if (n >= 0x80000005) {
-               cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
+               cpuid(0x80000005, &dummy, &ebx, &ecx, &edx);
                printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
-                       edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
-               c->x86_cache_size = (ecx>>24)+(edx>>24);
+                               edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
+               c->x86_cache_size = (ecx>>24) + (edx>>24);
+ #ifdef CONFIG_X86_64
+               /* On K8 L1 TLB is inclusive, so don't count it */
+               c->x86_tlbsize = 0;
+ #endif
        }
  
        if (n < 0x80000006)     /* Some chips just has a large L1. */
                return;
  
-       ecx = cpuid_ecx(0x80000006);
+       cpuid(0x80000006, &dummy, &ebx, &ecx, &edx);
        l2size = ecx >> 16;
  
+ #ifdef CONFIG_X86_64
+       c->x86_tlbsize += ((ebx >> 16) & 0xfff) + (ebx & 0xfff);
+ #else
        /* do processor-specific cache resizing */
        if (this_cpu->c_size_cache)
                l2size = this_cpu->c_size_cache(c, l2size);
  
        if (l2size == 0)
                return;         /* Again, no L2 cache is possible */
+ #endif
  
        c->x86_cache_size = l2size;
  
        printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
-              l2size, ecx & 0xFF);
+                       l2size, ecx & 0xFF);
  }
  
- /*
-  * Naming convention should be: <Name> [(<Codename>)]
-  * This table only is used unless init_<vendor>() below doesn't set it;
-  * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used
-  *
-  */
- /* Look up CPU names by table lookup. */
- static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
+ void __cpuinit detect_ht(struct cpuinfo_x86 *c)
  {
-       struct cpu_model_info *info;
+ #ifdef CONFIG_X86_HT
+       u32 eax, ebx, ecx, edx;
+       int index_msb, core_bits;
  
-       if (c->x86_model >= 16)
-               return NULL;    /* Range check */
+       if (!cpu_has(c, X86_FEATURE_HT))
+               return;
  
-       if (!this_cpu)
-               return NULL;
+       if (cpu_has(c, X86_FEATURE_CMP_LEGACY))
+               goto out;
  
-       info = this_cpu->c_models;
+       if (cpu_has(c, X86_FEATURE_XTOPOLOGY))
+               return;
  
-       while (info && info->family) {
-               if (info->family == c->x86)
-                       return info->model_names[c->x86_model];
-               info++;
+       cpuid(1, &eax, &ebx, &ecx, &edx);
+       smp_num_siblings = (ebx & 0xff0000) >> 16;
+       if (smp_num_siblings == 1) {
+               printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
+       } else if (smp_num_siblings > 1) {
+               if (smp_num_siblings > NR_CPUS) {
+                       printk(KERN_WARNING "CPU: Unsupported number of siblings %d",
+                                       smp_num_siblings);
+                       smp_num_siblings = 1;
+                       return;
+               }
+               index_msb = get_count_order(smp_num_siblings);
+ #ifdef CONFIG_X86_64
+               c->phys_proc_id = phys_pkg_id(index_msb);
+ #else
+               c->phys_proc_id = phys_pkg_id(c->initial_apicid, index_msb);
+ #endif
+               smp_num_siblings = smp_num_siblings / c->x86_max_cores;
+               index_msb = get_count_order(smp_num_siblings);
+               core_bits = get_count_order(c->x86_max_cores);
+ #ifdef CONFIG_X86_64
+               c->cpu_core_id = phys_pkg_id(index_msb) &
+                                              ((1 << core_bits) - 1);
+ #else
+               c->cpu_core_id = phys_pkg_id(c->initial_apicid, index_msb) &
+                                              ((1 << core_bits) - 1);
+ #endif
        }
-       return NULL;            /* Not found */
- }
  
+ out:
+       if ((c->x86_max_cores * smp_num_siblings) > 1) {
+               printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
+                      c->phys_proc_id);
+               printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
+                      c->cpu_core_id);
+       }
+ #endif
+ }
  
- static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
+ static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
  {
        char *v = c->x86_vendor_id;
        int i;
        static int printed;
  
        for (i = 0; i < X86_VENDOR_NUM; i++) {
-               if (cpu_devs[i]) {
-                       if (!strcmp(v, cpu_devs[i]->c_ident[0]) ||
-                           (cpu_devs[i]->c_ident[1] &&
-                            !strcmp(v, cpu_devs[i]->c_ident[1]))) {
-                               c->x86_vendor = i;
-                               if (!early)
-                                       this_cpu = cpu_devs[i];
-                               return;
-                       }
+               if (!cpu_devs[i])
+                       break;
+               if (!strcmp(v, cpu_devs[i]->c_ident[0]) ||
+                   (cpu_devs[i]->c_ident[1] &&
+                    !strcmp(v, cpu_devs[i]->c_ident[1]))) {
+                       this_cpu = cpu_devs[i];
+                       c->x86_vendor = this_cpu->c_x86_vendor;
+                       return;
                }
        }
        if (!printed) {
                printed++;
-               printk(KERN_ERR "CPU: Vendor unknown, using generic init.\n");
+               printk(KERN_ERR "CPU: vendor_id '%s' unknown, using generic init.\n", v);
                printk(KERN_ERR "CPU: Your system may be unstable.\n");
        }
        c->x86_vendor = X86_VENDOR_UNKNOWN;
        this_cpu = &default_cpu;
  }
  
- static int __init x86_fxsr_setup(char *s)
- {
-       setup_clear_cpu_cap(X86_FEATURE_FXSR);
-       setup_clear_cpu_cap(X86_FEATURE_XMM);
-       return 1;
- }
- __setup("nofxsr", x86_fxsr_setup);
- static int __init x86_sep_setup(char *s)
- {
-       setup_clear_cpu_cap(X86_FEATURE_SEP);
-       return 1;
- }
- __setup("nosep", x86_sep_setup);
- /* Standard macro to see if a specific flag is changeable */
- static inline int flag_is_changeable_p(u32 flag)
- {
-       u32 f1, f2;
-       asm("pushfl\n\t"
-           "pushfl\n\t"
-           "popl %0\n\t"
-           "movl %0,%1\n\t"
-           "xorl %2,%0\n\t"
-           "pushl %0\n\t"
-           "popfl\n\t"
-           "pushfl\n\t"
-           "popl %0\n\t"
-           "popfl\n\t"
-           : "=&r" (f1), "=&r" (f2)
-           : "ir" (flag));
-       return ((f1^f2) & flag) != 0;
- }
- /* Probe for the CPUID instruction */
- static int __cpuinit have_cpuid_p(void)
- {
-       return flag_is_changeable_p(X86_EFLAGS_ID);
- }
- void __init cpu_detect(struct cpuinfo_x86 *c)
+ void __cpuinit cpu_detect(struct cpuinfo_x86 *c)
  {
        /* Get vendor name */
        cpuid(0x00000000, (unsigned int *)&c->cpuid_level,
              (unsigned int *)&c->x86_vendor_id[4]);
  
        c->x86 = 4;
+       /* Intel-defined flags: level 0x00000001 */
        if (c->cpuid_level >= 0x00000001) {
                u32 junk, tfms, cap0, misc;
                cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
-               c->x86 = (tfms >> 8) & 15;
-               c->x86_model = (tfms >> 4) & 15;
+               c->x86 = (tfms >> 8) & 0xf;
+               c->x86_model = (tfms >> 4) & 0xf;
+               c->x86_mask = tfms & 0xf;
                if (c->x86 == 0xf)
                        c->x86 += (tfms >> 20) & 0xff;
                if (c->x86 >= 0x6)
-                       c->x86_model += ((tfms >> 16) & 0xF) << 4;
-               c->x86_mask = tfms & 15;
+                       c->x86_model += ((tfms >> 16) & 0xf) << 4;
                if (cap0 & (1<<19)) {
-                       c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
                        c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
+                       c->x86_cache_alignment = c->x86_clflush_size;
                }
        }
  }
- static void __cpuinit early_get_cap(struct cpuinfo_x86 *c)
+ static void __cpuinit get_cpu_cap(struct cpuinfo_x86 *c)
  {
        u32 tfms, xlvl;
-       unsigned int ebx;
+       u32 ebx;
  
-       memset(&c->x86_capability, 0, sizeof c->x86_capability);
-       if (have_cpuid_p()) {
-               /* Intel-defined flags: level 0x00000001 */
-               if (c->cpuid_level >= 0x00000001) {
-                       u32 capability, excap;
-                       cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
-                       c->x86_capability[0] = capability;
-                       c->x86_capability[4] = excap;
-               }
+       /* Intel-defined flags: level 0x00000001 */
+       if (c->cpuid_level >= 0x00000001) {
+               u32 capability, excap;
+               cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
+               c->x86_capability[0] = capability;
+               c->x86_capability[4] = excap;
+       }
  
-               /* AMD-defined flags: level 0x80000001 */
-               xlvl = cpuid_eax(0x80000000);
-               if ((xlvl & 0xffff0000) == 0x80000000) {
-                       if (xlvl >= 0x80000001) {
-                               c->x86_capability[1] = cpuid_edx(0x80000001);
-                               c->x86_capability[6] = cpuid_ecx(0x80000001);
-                       }
+       /* AMD-defined flags: level 0x80000001 */
+       xlvl = cpuid_eax(0x80000000);
+       c->extended_cpuid_level = xlvl;
+       if ((xlvl & 0xffff0000) == 0x80000000) {
+               if (xlvl >= 0x80000001) {
+                       c->x86_capability[1] = cpuid_edx(0x80000001);
+                       c->x86_capability[6] = cpuid_ecx(0x80000001);
                }
+       }
  
+ #ifdef CONFIG_X86_64
+       if (c->extended_cpuid_level >= 0x80000008) {
+               u32 eax = cpuid_eax(0x80000008);
+               c->x86_virt_bits = (eax >> 8) & 0xff;
+               c->x86_phys_bits = eax & 0xff;
        }
+ #endif
+       if (c->extended_cpuid_level >= 0x80000007)
+               c->x86_power = cpuid_edx(0x80000007);
  
  }
  
+ static void __cpuinit identify_cpu_without_cpuid(struct cpuinfo_x86 *c)
+ {
+ #ifdef CONFIG_X86_32
+       int i;
+       /*
+        * First of all, decide if this is a 486 or higher
+        * It's a 486 if we can modify the AC flag
+        */
+       if (flag_is_changeable_p(X86_EFLAGS_AC))
+               c->x86 = 4;
+       else
+               c->x86 = 3;
+       for (i = 0; i < X86_VENDOR_NUM; i++)
+               if (cpu_devs[i] && cpu_devs[i]->c_identify) {
+                       c->x86_vendor_id[0] = 0;
+                       cpu_devs[i]->c_identify(c);
+                       if (c->x86_vendor_id[0]) {
+                               get_cpu_vendor(c);
+                               break;
+                       }
+               }
+ #endif
+ }
  /*
   * Do minimum CPU detection early.
   * Fields really needed: vendor, cpuid_level, family, model, mask,
   * WARNING: this function is only called on the BP.  Don't add code here
   * that is supposed to run on all CPUs.
   */
- static void __init early_cpu_detect(void)
+ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
  {
-       struct cpuinfo_x86 *c = &boot_cpu_data;
-       c->x86_cache_alignment = 32;
+ #ifdef CONFIG_X86_64
+       c->x86_clflush_size = 64;
+ #else
        c->x86_clflush_size = 32;
+ #endif
+       c->x86_cache_alignment = c->x86_clflush_size;
+       memset(&c->x86_capability, 0, sizeof c->x86_capability);
+       c->extended_cpuid_level = 0;
  
+       if (!have_cpuid_p())
+               identify_cpu_without_cpuid(c);
+       /* cyrix could have cpuid enabled via c_identify()*/
        if (!have_cpuid_p())
                return;
  
        cpu_detect(c);
  
-       get_cpu_vendor(c, 1);
+       get_cpu_vendor(c);
  
-       early_get_cap(c);
+       get_cpu_cap(c);
  
-       if (c->x86_vendor != X86_VENDOR_UNKNOWN &&
-           cpu_devs[c->x86_vendor]->c_early_init)
-               cpu_devs[c->x86_vendor]->c_early_init(c);
+       if (this_cpu->c_early_init)
+               this_cpu->c_early_init(c);
+       validate_pat_support(c);
+ }
+ void __init early_cpu_init(void)
+ {
+       struct cpu_dev **cdev;
+       int count = 0;
+       printk("KERNEL supported cpus:\n");
+       for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) {
+               struct cpu_dev *cpudev = *cdev;
+               unsigned int j;
+               if (count >= X86_VENDOR_NUM)
+                       break;
+               cpu_devs[count] = cpudev;
+               count++;
+               for (j = 0; j < 2; j++) {
+                       if (!cpudev->c_ident[j])
+                               continue;
+                       printk("  %s %s\n", cpudev->c_vendor,
+                               cpudev->c_ident[j]);
+               }
+       }
+       early_identify_cpu(&boot_cpu_data);
  }
  
  /*
   * The NOPL instruction is supposed to exist on all CPUs with
 - * family >= 6, unfortunately, that's not true in practice because
 + * family >= 6; unfortunately, that's not true in practice because
   * of early VIA chips and (more importantly) broken virtualizers that
 - * are not easy to detect.  Hence, probe for it based on first
 - * principles.
 - *
 - * Note: no 64-bit chip is known to lack these, but put the code here
 - * for consistency with 32 bits, and to make it utterly trivial to
 - * diagnose the problem should it ever surface.
 + * are not easy to detect.  In the latter case it doesn't even *fail*
 + * reliably, so probing for it doesn't even work.  Disable it completely
 + * unless we can find a reliable way to detect all the broken cases.
   */
  static void __cpuinit detect_nopl(struct cpuinfo_x86 *c)
  {
 -      const u32 nopl_signature = 0x888c53b1; /* Random number */
 -      u32 has_nopl = nopl_signature;
 -
        clear_cpu_cap(c, X86_FEATURE_NOPL);
 -      if (c->x86 >= 6) {
 -              asm volatile("\n"
 -                           "1:      .byte 0x0f,0x1f,0xc0\n" /* nopl %eax */
 -                           "2:\n"
 -                           "        .section .fixup,\"ax\"\n"
 -                           "3:      xor %0,%0\n"
 -                           "        jmp 2b\n"
 -                           "        .previous\n"
 -                           _ASM_EXTABLE(1b,3b)
 -                           : "+a" (has_nopl));
 -
 -              if (has_nopl == nopl_signature)
 -                      set_cpu_cap(c, X86_FEATURE_NOPL);
 -      }
  }
  
  static void __cpuinit generic_identify(struct cpuinfo_x86 *c)
  {
-       u32 tfms, xlvl;
-       unsigned int ebx;
-       if (have_cpuid_p()) {
-               /* Get vendor name */
-               cpuid(0x00000000, (unsigned int *)&c->cpuid_level,
-                     (unsigned int *)&c->x86_vendor_id[0],
-                     (unsigned int *)&c->x86_vendor_id[8],
-                     (unsigned int *)&c->x86_vendor_id[4]);
-               get_cpu_vendor(c, 0);
-               /* Initialize the standard set of capabilities */
-               /* Note that the vendor-specific code below might override */
-               /* Intel-defined flags: level 0x00000001 */
-               if (c->cpuid_level >= 0x00000001) {
-                       u32 capability, excap;
-                       cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
-                       c->x86_capability[0] = capability;
-                       c->x86_capability[4] = excap;
-                       c->x86 = (tfms >> 8) & 15;
-                       c->x86_model = (tfms >> 4) & 15;
-                       if (c->x86 == 0xf)
-                               c->x86 += (tfms >> 20) & 0xff;
-                       if (c->x86 >= 0x6)
-                               c->x86_model += ((tfms >> 16) & 0xF) << 4;
-                       c->x86_mask = tfms & 15;
-                       c->initial_apicid = (ebx >> 24) & 0xFF;
- #ifdef CONFIG_X86_HT
-                       c->apicid = phys_pkg_id(c->initial_apicid, 0);
-                       c->phys_proc_id = c->initial_apicid;
- #else
-                       c->apicid = c->initial_apicid;
- #endif
-                       if (test_cpu_cap(c, X86_FEATURE_CLFLSH))
-                               c->x86_clflush_size = ((ebx >> 8) & 0xff) * 8;
-               } else {
-                       /* Have CPUID level 0 only - unheard of */
-                       c->x86 = 4;
-               }
+       c->extended_cpuid_level = 0;
  
-               /* AMD-defined flags: level 0x80000001 */
-               xlvl = cpuid_eax(0x80000000);
-               if ((xlvl & 0xffff0000) == 0x80000000) {
-                       if (xlvl >= 0x80000001) {
-                               c->x86_capability[1] = cpuid_edx(0x80000001);
-                               c->x86_capability[6] = cpuid_ecx(0x80000001);
-                       }
-                       if (xlvl >= 0x80000004)
-                               get_model_name(c); /* Default name */
-               }
+       if (!have_cpuid_p())
+               identify_cpu_without_cpuid(c);
  
-               init_scattered_cpuid_features(c);
-               detect_nopl(c);
-       }
- }
+       /* cyrix could have cpuid enabled via c_identify()*/
+       if (!have_cpuid_p())
+               return;
  
- static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
- {
-       if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr) {
-               /* Disable processor serial number */
-               unsigned long lo, hi;
-               rdmsr(MSR_IA32_BBL_CR_CTL, lo, hi);
-               lo |= 0x200000;
-               wrmsr(MSR_IA32_BBL_CR_CTL, lo, hi);
-               printk(KERN_NOTICE "CPU serial number disabled.\n");
-               clear_cpu_cap(c, X86_FEATURE_PN);
+       cpu_detect(c);
  
-               /* Disabling the serial number may affect the cpuid level */
-               c->cpuid_level = cpuid_eax(0);
-       }
- }
+       get_cpu_vendor(c);
  
- static int __init x86_serial_nr_setup(char *s)
- {
-       disable_x86_serial_nr = 0;
-       return 1;
- }
- __setup("serialnumber", x86_serial_nr_setup);
+       get_cpu_cap(c);
  
+       if (c->cpuid_level >= 0x00000001) {
+               c->initial_apicid = (cpuid_ebx(1) >> 24) & 0xFF;
+ #ifdef CONFIG_X86_32
+ # ifdef CONFIG_X86_HT
+               c->apicid = phys_pkg_id(c->initial_apicid, 0);
+ # else
+               c->apicid = c->initial_apicid;
+ # endif
+ #endif
  
+ #ifdef CONFIG_X86_HT
+               c->phys_proc_id = c->initial_apicid;
+ #endif
+       }
+       get_model_name(c); /* Default name */
+       init_scattered_cpuid_features(c);
+       detect_nopl(c);
+ }
  
  /*
   * This does the hard work of actually picking apart the CPU stuff...
@@@ -448,30 -651,29 +631,29 @@@ static void __cpuinit identify_cpu(stru
        c->loops_per_jiffy = loops_per_jiffy;
        c->x86_cache_size = -1;
        c->x86_vendor = X86_VENDOR_UNKNOWN;
-       c->cpuid_level = -1;    /* CPUID not detected */
        c->x86_model = c->x86_mask = 0; /* So far unknown... */
        c->x86_vendor_id[0] = '\0'; /* Unset */
        c->x86_model_id[0] = '\0';  /* Unset */
        c->x86_max_cores = 1;
+       c->x86_coreid_bits = 0;
+ #ifdef CONFIG_X86_64
+       c->x86_clflush_size = 64;
+ #else
+       c->cpuid_level = -1;    /* CPUID not detected */
        c->x86_clflush_size = 32;
+ #endif
+       c->x86_cache_alignment = c->x86_clflush_size;
        memset(&c->x86_capability, 0, sizeof c->x86_capability);
  
-       if (!have_cpuid_p()) {
-               /*
-                * First of all, decide if this is a 486 or higher
-                * It's a 486 if we can modify the AC flag
-                */
-               if (flag_is_changeable_p(X86_EFLAGS_AC))
-                       c->x86 = 4;
-               else
-                       c->x86 = 3;
-       }
        generic_identify(c);
  
        if (this_cpu->c_identify)
                this_cpu->c_identify(c);
  
+ #ifdef CONFIG_X86_64
+       c->apicid = phys_pkg_id(0);
+ #endif
        /*
         * Vendor-specific initialization.  In this section we
         * canonicalize the feature flags, meaning if there are
                                c->x86, c->x86_model);
        }
  
+ #ifdef CONFIG_X86_64
+       detect_ht(c);
+ #endif
        /*
         * On SMP, boot_cpu_data holds the common feature set between
         * all CPUs; so make sure that we indicate which features are
         */
        if (c != &boot_cpu_data) {
                /* AND the already accumulated flags with these */
-               for (i = 0 ; i < NCAPINTS ; i++)
+               for (i = 0; i < NCAPINTS; i++)
                        boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
        }
  
        for (i = 0; i < NCAPINTS; i++)
                c->x86_capability[i] &= ~cleared_cpu_caps[i];
  
+ #ifdef CONFIG_X86_MCE
        /* Init Machine Check Exception if available. */
        mcheck_init(c);
+ #endif
  
        select_idle_routine(c);
+ #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64)
+       numa_add_cpu(smp_processor_id());
+ #endif
  }
  
  void __init identify_boot_cpu(void)
  {
        identify_cpu(&boot_cpu_data);
+ #ifdef CONFIG_X86_32
        sysenter_setup();
        enable_sep_cpu();
+ #endif
  }
  
  void __cpuinit identify_secondary_cpu(struct cpuinfo_x86 *c)
  {
        BUG_ON(c == &boot_cpu_data);
        identify_cpu(c);
+ #ifdef CONFIG_X86_32
        enable_sep_cpu();
+ #endif
        mtrr_ap_init();
  }
  
- #ifdef CONFIG_X86_HT
- void __cpuinit detect_ht(struct cpuinfo_x86 *c)
- {
-       u32     eax, ebx, ecx, edx;
-       int     index_msb, core_bits;
-       cpuid(1, &eax, &ebx, &ecx, &edx);
-       if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
-               return;
-       smp_num_siblings = (ebx & 0xff0000) >> 16;
+ struct msr_range {
+       unsigned min;
+       unsigned max;
+ };
  
-       if (smp_num_siblings == 1) {
-               printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-       } else if (smp_num_siblings > 1) {
+ static struct msr_range msr_range_array[] __cpuinitdata = {
+       { 0x00000000, 0x00000418},
+       { 0xc0000000, 0xc000040b},
+       { 0xc0010000, 0xc0010142},
+       { 0xc0011000, 0xc001103b},
+ };
  
-               if (smp_num_siblings > NR_CPUS) {
-                       printk(KERN_WARNING "CPU: Unsupported number of the "
-                                       "siblings %d", smp_num_siblings);
-                       smp_num_siblings = 1;
-                       return;
+ static void __cpuinit print_cpu_msr(void)
+ {
+       unsigned index;
+       u64 val;
+       int i;
+       unsigned index_min, index_max;
+       for (i = 0; i < ARRAY_SIZE(msr_range_array); i++) {
+               index_min = msr_range_array[i].min;
+               index_max = msr_range_array[i].max;
+               for (index = index_min; index < index_max; index++) {
+                       if (rdmsrl_amd_safe(index, &val))
+                               continue;
+                       printk(KERN_INFO " MSR%08x: %016llx\n", index, val);
                }
+       }
+ }
  
-               index_msb = get_count_order(smp_num_siblings);
-               c->phys_proc_id = phys_pkg_id(c->initial_apicid, index_msb);
-               printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
-                      c->phys_proc_id);
-               smp_num_siblings = smp_num_siblings / c->x86_max_cores;
-               index_msb = get_count_order(smp_num_siblings) ;
+ static int show_msr __cpuinitdata;
+ static __init int setup_show_msr(char *arg)
+ {
+       int num;
  
-               core_bits = get_count_order(c->x86_max_cores);
+       get_option(&arg, &num);
  
-               c->cpu_core_id = phys_pkg_id(c->initial_apicid, index_msb) &
-                                              ((1 << core_bits) - 1);
-               if (c->x86_max_cores > 1)
-                       printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
-                              c->cpu_core_id);
-       }
+       if (num > 0)
+               show_msr = num;
+       return 1;
  }
- #endif
+ __setup("show_msr=", setup_show_msr);
  
  static __init int setup_noclflush(char *arg)
  {
@@@ -605,17 -818,25 +798,25 @@@ void __cpuinit print_cpu_info(struct cp
                vendor = c->x86_vendor_id;
  
        if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor)))
-               printk("%s ", vendor);
+               printk(KERN_CONT "%s ", vendor);
  
-       if (!c->x86_model_id[0])
-               printk("%d86", c->x86);
+       if (c->x86_model_id[0])
+               printk(KERN_CONT "%s", c->x86_model_id);
        else
-               printk("%s", c->x86_model_id);
+               printk(KERN_CONT "%d86", c->x86);
  
        if (c->x86_mask || c->cpuid_level >= 0)
-               printk(" stepping %02x\n", c->x86_mask);
+               printk(KERN_CONT " stepping %02x\n", c->x86_mask);
        else
-               printk("\n");
+               printk(KERN_CONT "\n");
+ #ifdef CONFIG_SMP
+       if (c->cpu_index < show_msr)
+               print_cpu_msr();
+ #else
+       if (show_msr)
+               print_cpu_msr();
+ #endif
  }
  
  static __init int setup_disablecpuid(char *arg)
@@@ -631,19 -852,89 +832,89 @@@ __setup("clearcpuid=", setup_disablecpu
  
  cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE;
  
- void __init early_cpu_init(void)
+ #ifdef CONFIG_X86_64
+ struct x8664_pda **_cpu_pda __read_mostly;
+ EXPORT_SYMBOL(_cpu_pda);
+ struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table };
+ char boot_cpu_stack[IRQSTACKSIZE] __page_aligned_bss;
+ void __cpuinit pda_init(int cpu)
+ {
+       struct x8664_pda *pda = cpu_pda(cpu);
+       /* Setup up data that may be needed in __get_free_pages early */
+       loadsegment(fs, 0);
+       loadsegment(gs, 0);
+       /* Memory clobbers used to order PDA accessed */
+       mb();
+       wrmsrl(MSR_GS_BASE, pda);
+       mb();
+       pda->cpunumber = cpu;
+       pda->irqcount = -1;
+       pda->kernelstack = (unsigned long)stack_thread_info() -
+                                PDA_STACKOFFSET + THREAD_SIZE;
+       pda->active_mm = &init_mm;
+       pda->mmu_state = 0;
+       if (cpu == 0) {
+               /* others are initialized in smpboot.c */
+               pda->pcurrent = &init_task;
+               pda->irqstackptr = boot_cpu_stack;
+               pda->irqstackptr += IRQSTACKSIZE - 64;
+       } else {
+               if (!pda->irqstackptr) {
+                       pda->irqstackptr = (char *)
+                               __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
+                       if (!pda->irqstackptr)
+                               panic("cannot allocate irqstack for cpu %d",
+                                     cpu);
+                       pda->irqstackptr += IRQSTACKSIZE - 64;
+               }
+               if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE)
+                       pda->nodenumber = cpu_to_node(cpu);
+       }
+ }
+ char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ +
+                          DEBUG_STKSZ] __page_aligned_bss;
+ extern asmlinkage void ignore_sysret(void);
+ /* May not be marked __init: used by software suspend */
+ void syscall_init(void)
  {
-       struct cpu_vendor_dev *cvdev;
+       /*
+        * LSTAR and STAR live in a bit strange symbiosis.
+        * They both write to the same internal register. STAR allows to
+        * set CS/DS but only a 32bit target. LSTAR sets the 64bit rip.
+        */
+       wrmsrl(MSR_STAR,  ((u64)__USER32_CS)<<48  | ((u64)__KERNEL_CS)<<32);
+       wrmsrl(MSR_LSTAR, system_call);
+       wrmsrl(MSR_CSTAR, ignore_sysret);
  
-       for (cvdev = __x86cpuvendor_start ;
-            cvdev < __x86cpuvendor_end   ;
-            cvdev++)
-               cpu_devs[cvdev->vendor] = cvdev->cpu_dev;
+ #ifdef CONFIG_IA32_EMULATION
+       syscall32_cpu_init();
+ #endif
  
-       early_cpu_detect();
-       validate_pat_support(&boot_cpu_data);
+       /* Flags to clear on syscall */
+       wrmsrl(MSR_SYSCALL_MASK,
+              X86_EFLAGS_TF|X86_EFLAGS_DF|X86_EFLAGS_IF|X86_EFLAGS_IOPL);
  }
  
+ unsigned long kernel_eflags;
+ /*
+  * Copies of the original ist values from the tss are only accessed during
+  * debugging, no special alignment required.
+  */
+ DEFINE_PER_CPU(struct orig_ist, orig_ist);
+ #else
  /* Make sure %fs is initialized properly in idle threads */
  struct pt_regs * __cpuinit idle_regs(struct pt_regs *regs)
  {
        regs->fs = __KERNEL_PERCPU;
        return regs;
  }
- /* Current gdt points %fs at the "master" per-cpu area: after this,
-  * it's on the real one. */
- void switch_to_new_gdt(void)
- {
-       struct desc_ptr gdt_descr;
-       gdt_descr.address = (long)get_cpu_gdt_table(smp_processor_id());
-       gdt_descr.size = GDT_SIZE - 1;
-       load_gdt(&gdt_descr);
-       asm("mov %0, %%fs" : : "r" (__KERNEL_PERCPU) : "memory");
- }
+ #endif
  
  /*
   * cpu_init() initializes state that is per-CPU. Some data is already
   * initialized (naturally) in the bootstrap process, such as the GDT
   * and IDT. We reload them nevertheless, this function acts as a
   * 'CPU state barrier', nothing should get across.
+  * A lot of state is already set up in PDA init for 64 bit
   */
+ #ifdef CONFIG_X86_64
+ void __cpuinit cpu_init(void)
+ {
+       int cpu = stack_smp_processor_id();
+       struct tss_struct *t = &per_cpu(init_tss, cpu);
+       struct orig_ist *orig_ist = &per_cpu(orig_ist, cpu);
+       unsigned long v;
+       char *estacks = NULL;
+       struct task_struct *me;
+       int i;
+       /* CPU 0 is initialised in head64.c */
+       if (cpu != 0)
+               pda_init(cpu);
+       else
+               estacks = boot_exception_stacks;
+       me = current;
+       if (cpu_test_and_set(cpu, cpu_initialized))
+               panic("CPU#%d already initialized!\n", cpu);
+       printk(KERN_INFO "Initializing CPU#%d\n", cpu);
+       clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
+       /*
+        * Initialize the per-CPU GDT with the boot GDT,
+        * and set up the GDT descriptor:
+        */
+       switch_to_new_gdt();
+       load_idt((const struct desc_ptr *)&idt_descr);
+       memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8);
+       syscall_init();
+       wrmsrl(MSR_FS_BASE, 0);
+       wrmsrl(MSR_KERNEL_GS_BASE, 0);
+       barrier();
+       check_efer();
+       if (cpu != 0 && x2apic)
+               enable_x2apic();
+       /*
+        * set up and load the per-CPU TSS
+        */
+       if (!orig_ist->ist[0]) {
+               static const unsigned int order[N_EXCEPTION_STACKS] = {
+                 [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
+                 [DEBUG_STACK - 1] = DEBUG_STACK_ORDER
+               };
+               for (v = 0; v < N_EXCEPTION_STACKS; v++) {
+                       if (cpu) {
+                               estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
+                               if (!estacks)
+                                       panic("Cannot allocate exception "
+                                             "stack %ld %d\n", v, cpu);
+                       }
+                       estacks += PAGE_SIZE << order[v];
+                       orig_ist->ist[v] = t->x86_tss.ist[v] =
+                                       (unsigned long)estacks;
+               }
+       }
+       t->x86_tss.io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
+       /*
+        * <= is required because the CPU will access up to
+        * 8 bits beyond the end of the IO permission bitmap.
+        */
+       for (i = 0; i <= IO_BITMAP_LONGS; i++)
+               t->io_bitmap[i] = ~0UL;
+       atomic_inc(&init_mm.mm_count);
+       me->active_mm = &init_mm;
+       if (me->mm)
+               BUG();
+       enter_lazy_tlb(&init_mm, me);
+       load_sp0(t, &current->thread);
+       set_tss_desc(cpu, t);
+       load_TR_desc();
+       load_LDT(&init_mm.context);
+ #ifdef CONFIG_KGDB
+       /*
+        * If the kgdb is connected no debug regs should be altered.  This
+        * is only applicable when KGDB and a KGDB I/O module are built
+        * into the kernel and you are using early debugging with
+        * kgdbwait. KGDB will control the kernel HW breakpoint registers.
+        */
+       if (kgdb_connected && arch_kgdb_ops.correct_hw_break)
+               arch_kgdb_ops.correct_hw_break();
+       else {
+ #endif
+       /*
+        * Clear all 6 debug registers:
+        */
+       set_debugreg(0UL, 0);
+       set_debugreg(0UL, 1);
+       set_debugreg(0UL, 2);
+       set_debugreg(0UL, 3);
+       set_debugreg(0UL, 6);
+       set_debugreg(0UL, 7);
+ #ifdef CONFIG_KGDB
+       /* If the kgdb is connected no debug regs should be altered. */
+       }
+ #endif
+       fpu_init();
+       raw_local_save_flags(kernel_eflags);
+       if (is_uv_system())
+               uv_cpu_init();
+ }
+ #else
  void __cpuinit cpu_init(void)
  {
        int cpu = smp_processor_id();
        /*
         * Force FPU initialization:
         */
-       current_thread_info()->status = 0;
+       if (cpu_has_xsave)
+               current_thread_info()->status = TS_XSAVE;
+       else
+               current_thread_info()->status = 0;
        clear_used_math();
        mxcsr_feature_mask_init();
+       /*
+        * Boot processor to setup the FP and extended state context info.
+        */
+       if (!smp_processor_id())
+               init_thread_xstate();
+       xsave_init();
  }
  
  #ifdef CONFIG_HOTPLUG_CPU
@@@ -739,3 -1152,5 +1132,5 @@@ void __cpuinit cpu_uninit(void
        per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm;
  }
  #endif
+ #endif
index ec7a2ba9bce8062d870448ce5a5292b81b0d6dd8,9f94bb1c81170f8b047aaf7782291e13919fc15a..c622772744d86fcb0dcd3e6c46a6de5323508c40
@@@ -15,7 -15,6 +15,6 @@@ unsigned long idle_nomwait
  EXPORT_SYMBOL(idle_nomwait);
  
  struct kmem_cache *task_xstate_cachep;
- static int force_mwait __cpuinitdata;
  
  int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
  {
@@@ -185,8 -184,7 +184,8 @@@ static void mwait_idle(void
  static void poll_idle(void)
  {
        local_irq_enable();
 -      cpu_relax();
 +      while (!need_resched())
 +              cpu_relax();
  }
  
  /*
@@@ -247,14 -245,6 +246,14 @@@ static int __cpuinit check_c1e_idle(con
        return 1;
  }
  
 +static cpumask_t c1e_mask = CPU_MASK_NONE;
 +static int c1e_detected;
 +
 +void c1e_remove_cpu(int cpu)
 +{
 +      cpu_clear(cpu, c1e_mask);
 +}
 +
  /*
   * C1E aware idle routine. We check for C1E active in the interrupt
   * pending message MSR. If we detect C1E, then we handle it the same
   */
  static void c1e_idle(void)
  {
 -      static cpumask_t c1e_mask = CPU_MASK_NONE;
 -      static int c1e_detected;
 -
        if (need_resched())
                return;
  
                rdmsr(MSR_K8_INT_PENDING_MSG, lo, hi);
                if (lo & K8_INTP_C1E_ACTIVE_MASK) {
                        c1e_detected = 1;
 -                      mark_tsc_unstable("TSC halt in C1E");
 -                      printk(KERN_INFO "System has C1E enabled\n");
 +                      if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
 +                              mark_tsc_unstable("TSC halt in AMD C1E");
 +                      printk(KERN_INFO "System has AMD C1E enabled\n");
 +                      set_cpu_cap(&boot_cpu_data, X86_FEATURE_AMDC1E);
                }
        }
  
index 8b4956e800acd4394c06e303989982c85ad04e53,6dd7e2b70a4b8d8e0994760698025e384058c68e..cc673aa55ce4d8fb7eeb82e8cd21a773ca8f6213
@@@ -3,9 -3,18 +3,18 @@@ struct sigframe 
        char __user *pretcode;
        int sig;
        struct sigcontext sc;
-       struct _fpstate fpstate;
+       /*
+        * fpstate is unused. fpstate is moved/allocated after
+        * retcode[] below. This movement allows to have the FP state and the
+        * future state extensions (xsave) stay together.
+        * And at the same time retaining the unused fpstate, prevents changing
+        * the offset of extramask[] in the sigframe and thus prevent any
+        * legacy application accessing/modifying it.
+        */
+       struct _fpstate fpstate_unused;
        unsigned long extramask[_NSIG_WORDS-1];
        char retcode[8];
+       /* fp state follows here */
  };
  
  struct rt_sigframe {
        void __user *puc;
        struct siginfo info;
        struct ucontext uc;
-       struct _fpstate fpstate;
        char retcode[8];
+       /* fp state follows here */
  };
  #else
  struct rt_sigframe {
        char __user *pretcode;
        struct ucontext uc;
        struct siginfo info;
+       /* fp state follows here */
  };
 +
 +int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 +              sigset_t *set, struct pt_regs *regs);
 +int ia32_setup_frame(int sig, struct k_sigaction *ka,
 +              sigset_t *set, struct pt_regs *regs);
  #endif
index 2a2435d3037d9ac9dd8fab949c3c57c775e426e4,8d380b699c0cc4327e2afc8581ac8449928d76a8..b21070ea33a485c314ed8538288632fb8fa2a869
@@@ -17,7 -17,6 +17,7 @@@
  #include <linux/errno.h>
  #include <linux/sched.h>
  #include <linux/wait.h>
 +#include <linux/tracehook.h>
  #include <linux/elf.h>
  #include <linux/smp.h>
  #include <linux/mm.h>
@@@ -161,28 -160,14 +161,14 @@@ restore_sigcontext(struct pt_regs *regs
        }
  
        {
-               struct _fpstate __user *buf;
+               void __user *buf;
  
                err |= __get_user(buf, &sc->fpstate);
-               if (buf) {
-                       if (!access_ok(VERIFY_READ, buf, sizeof(*buf)))
-                               goto badframe;
-                       err |= restore_i387(buf);
-               } else {
-                       struct task_struct *me = current;
-                       if (used_math()) {
-                               clear_fpu(me);
-                               clear_used_math();
-                       }
-               }
+               err |= restore_i387_xstate(buf);
        }
  
        err |= __get_user(*pax, &sc->ax);
        return err;
- badframe:
-       return 1;
  }
  
  asmlinkage unsigned long sys_sigreturn(unsigned long __unused)
@@@ -264,7 -249,7 +250,7 @@@ badframe
   * Set up a signal frame.
   */
  static int
- setup_sigcontext(struct sigcontext __user *sc, struct _fpstate __user *fpstate,
+ setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate,
                 struct pt_regs *regs, unsigned long mask)
  {
        int tmp, err = 0;
        err |= __put_user(regs->sp, &sc->sp_at_signal);
        err |= __put_user(regs->ss, (unsigned int __user *)&sc->ss);
  
-       tmp = save_i387(fpstate);
+       tmp = save_i387_xstate(fpstate);
        if (tmp < 0)
                err = 1;
        else
   * Determine which stack to use..
   */
  static inline void __user *
- get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
+ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size,
+            void **fpstate)
  {
        unsigned long sp;
  
                        sp = (unsigned long) ka->sa.sa_restorer;
        }
  
+       if (used_math()) {
+               sp = sp - sig_xstate_size;
+               *fpstate = (struct _fpstate *) sp;
+       }
        sp -= frame_size;
        /*
         * Align the stack pointer according to the i386 ABI,
@@@ -352,8 -343,9 +344,9 @@@ setup_frame(int sig, struct k_sigactio
        void __user *restorer;
        int err = 0;
        int usig;
+       void __user *fpstate = NULL;
  
-       frame = get_sigframe(ka, regs, sizeof(*frame));
+       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
  
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                goto give_sigsegv;
        if (err)
                goto give_sigsegv;
  
-       err = setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]);
+       err = setup_sigcontext(&frame->sc, fpstate, regs, set->sig[0]);
        if (err)
                goto give_sigsegv;
  
@@@ -429,8 -421,9 +422,9 @@@ static int setup_rt_frame(int sig, stru
        void __user *restorer;
        int err = 0;
        int usig;
+       void __user *fpstate = NULL;
  
-       frame = get_sigframe(ka, regs, sizeof(*frame));
+       frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate);
  
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                goto give_sigsegv;
                goto give_sigsegv;
  
        /* Create the ucontext.  */
-       err |= __put_user(0, &frame->uc.uc_flags);
+       if (cpu_has_xsave)
+               err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags);
+       else
+               err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
        err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
        err |= __put_user(sas_ss_flags(regs->sp),
                          &frame->uc.uc_stack.ss_flags);
        err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-       err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
+       err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate,
                                regs, set->sig[0]);
        err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
        if (err)
@@@ -560,6 -556,8 +557,6 @@@ handle_signal(unsigned long sig, siginf
         * handler too.
         */
        regs->flags &= ~X86_EFLAGS_TF;
 -      if (test_thread_flag(TIF_SINGLESTEP))
 -              ptrace_notify(SIGTRAP);
  
        spin_lock_irq(&current->sighand->siglock);
        sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
  
 +      tracehook_signal_handler(sig, info, ka, regs,
 +                               test_thread_flag(TIF_SINGLESTEP));
 +
        return 0;
  }
  
@@@ -664,10 -659,5 +661,10 @@@ do_notify_resume(struct pt_regs *regs, 
        if (thread_info_flags & _TIF_SIGPENDING)
                do_signal(regs);
  
 +      if (thread_info_flags & _TIF_NOTIFY_RESUME) {
 +              clear_thread_flag(TIF_NOTIFY_RESUME);
 +              tracehook_notify_resume(regs);
 +      }
 +
        clear_thread_flag(TIF_IRET);
  }
index 694aa888bb1993d7d7a38f8fe09b15a607867c7c,4665b598a376fac194136444ab3a4f6655120936..823a55bf8c3901d4c429073c445bb1ddcc21643d
  #include <linux/errno.h>
  #include <linux/wait.h>
  #include <linux/ptrace.h>
 +#include <linux/tracehook.h>
  #include <linux/unistd.h>
  #include <linux/stddef.h>
  #include <linux/personality.h>
  #include <linux/compiler.h>
 +#include <linux/uaccess.h>
 +
  #include <asm/processor.h>
  #include <asm/ucontext.h>
 -#include <asm/uaccess.h>
  #include <asm/i387.h>
  #include <asm/proto.h>
  #include <asm/ia32_unistd.h>
  #include <asm/mce.h>
 +#include <asm/syscall.h>
  #include <asm/syscalls.h>
  #include "sigframe.h"
  
  # define FIX_EFLAGS   __FIX_EFLAGS
  #endif
  
 -int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 -               sigset_t *set, struct pt_regs * regs); 
 -int ia32_setup_frame(int sig, struct k_sigaction *ka,
 -            sigset_t *set, struct pt_regs * regs); 
 -
  asmlinkage long
  sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
                struct pt_regs *regs)
        return do_sigaltstack(uss, uoss, regs->sp);
  }
  
- /*
-  * Signal frame handlers.
-  */
- static inline int save_i387(struct _fpstate __user *buf)
- {
-       struct task_struct *tsk = current;
-       int err = 0;
-       BUILD_BUG_ON(sizeof(struct user_i387_struct) !=
-                       sizeof(tsk->thread.xstate->fxsave));
-       if ((unsigned long)buf % 16)
-               printk("save_i387: bad fpstate %p\n", buf);
-       if (!used_math())
-               return 0;
-       clear_used_math(); /* trigger finit */
-       if (task_thread_info(tsk)->status & TS_USEDFPU) {
-               err = save_i387_checking((struct i387_fxsave_struct __user *)
-                                        buf);
-               if (err)
-                       return err;
-               task_thread_info(tsk)->status &= ~TS_USEDFPU;
-               stts();
-       } else {
-               if (__copy_to_user(buf, &tsk->thread.xstate->fxsave,
-                                  sizeof(struct i387_fxsave_struct)))
-                       return -1;
-       }
-       return 1;
- }
- /*
-  * This restores directly out of user space. Exceptions are handled.
-  */
- static inline int restore_i387(struct _fpstate __user *buf)
- {
-       struct task_struct *tsk = current;
-       int err;
-       if (!used_math()) {
-               err = init_fpu(tsk);
-               if (err)
-                       return err;
-       }
-       if (!(task_thread_info(current)->status & TS_USEDFPU)) {
-               clts();
-               task_thread_info(current)->status |= TS_USEDFPU;
-       }
-       err = restore_fpu_checking((__force struct i387_fxsave_struct *)buf);
-       if (unlikely(err)) {
-               /*
-                * Encountered an error while doing the restore from the
-                * user buffer, clear the fpu state.
-                */
-               clear_fpu(tsk);
-               clear_used_math();
-       }
-       return err;
- }
  /*
   * Do a signal return; undo the signal stack.
   */
@@@ -127,7 -66,7 +64,7 @@@ restore_sigcontext(struct pt_regs *regs
        /* Always make any pending restarted system calls return -EINTR */
        current_thread_info()->restart_block.fn = do_no_restart_syscall;
  
 -#define COPY(x)               err |= __get_user(regs->x, &sc->x)
 +#define COPY(x)               (err |= __get_user(regs->x, &sc->x))
  
        COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx);
        COPY(dx); COPY(cx); COPY(ip);
        }
  
        {
 -              struct _fpstate __user * buf;
 +              struct _fpstate __user *buf;
                err |= __get_user(buf, &sc->fpstate);
-               if (buf) {
-                       if (!access_ok(VERIFY_READ, buf, sizeof(*buf)))
-                               goto badframe;
-                       err |= restore_i387(buf);
-               } else {
-                       struct task_struct *me = current;
-                       if (used_math()) {
-                               clear_fpu(me);
-                               clear_used_math();
-                       }
-               }
+               err |= restore_i387_xstate(buf);
        }
  
        err |= __get_user(*pax, &sc->ax);
        return err;
- badframe:
-       return 1;
  }
  
  asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
        current->blocked = set;
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
 -      
 +
        if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax))
                goto badframe;
  
        return ax;
  
  badframe:
 -      signal_fault(regs,frame,"sigreturn");
 +      signal_fault(regs, frame, "sigreturn");
        return 0;
 -}     
 +}
  
  /*
   * Set up a signal frame.
   */
  
  static inline int
 -setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned long mask, struct task_struct *me)
 +setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
 +              unsigned long mask, struct task_struct *me)
  {
        int err = 0;
  
@@@ -269,41 -193,41 +192,41 @@@ get_stack(struct k_sigaction *ka, struc
                        sp = current->sas_ss_sp + current->sas_ss_size;
        }
  
-       return (void __user *)round_down(sp - size, 16);
+       return (void __user *)round_down(sp - size, 64);
  }
  
  static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 -                         sigset_t *set, struct pt_regs * regs)
 +                         sigset_t *set, struct pt_regs *regs)
  {
        struct rt_sigframe __user *frame;
-       struct _fpstate __user *fp = NULL;
+       void __user *fp = NULL;
        int err = 0;
        struct task_struct *me = current;
  
        if (used_math()) {
-               fp = get_stack(ka, regs, sizeof(struct _fpstate));
+               fp = get_stack(ka, regs, sig_xstate_size);
                frame = (void __user *)round_down(
                        (unsigned long)fp - sizeof(struct rt_sigframe), 16) - 8;
  
-               if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate)))
-                       goto give_sigsegv;
-               if (save_i387(fp) < 0)
+               if (save_i387_xstate(fp) < 0)
 -                      err |= -1; 
 +                      err |= -1;
        } else
                frame = get_stack(ka, regs, sizeof(struct rt_sigframe)) - 8;
  
        if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
                goto give_sigsegv;
  
 -      if (ka->sa.sa_flags & SA_SIGINFO) { 
 +      if (ka->sa.sa_flags & SA_SIGINFO) {
                err |= copy_siginfo_to_user(&frame->info, info);
                if (err)
                        goto give_sigsegv;
        }
 -              
 +
        /* Create the ucontext.  */
-       err |= __put_user(0, &frame->uc.uc_flags);
+       if (cpu_has_xsave)
+               err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags);
+       else
+               err |= __put_user(0, &frame->uc.uc_flags);
        err |= __put_user(0, &frame->uc.uc_link);
        err |= __put_user(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
        err |= __put_user(sas_ss_flags(regs->sp),
        err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size);
        err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0], me);
        err |= __put_user(fp, &frame->uc.uc_mcontext.fpstate);
 -      if (sizeof(*set) == 16) { 
 +      if (sizeof(*set) == 16) {
                __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]);
 -              __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); 
 +              __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]);
        } else
                err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
  
                err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
        } else {
                /* could use a vstub here */
 -              goto give_sigsegv; 
 +              goto give_sigsegv;
        }
  
        if (err)
  
        /* Set up registers for signal handler */
        regs->di = sig;
 -      /* In case the signal handler was declared without prototypes */ 
 +      /* In case the signal handler was declared without prototypes */
        regs->ax = 0;
  
        /* This also works for non SA_SIGINFO handlers because they expect the
@@@ -354,9 -278,38 +277,9 @@@ give_sigsegv
        return -EFAULT;
  }
  
 -/*
 - * Return -1L or the syscall number that @regs is executing.
 - */
 -static long current_syscall(struct pt_regs *regs)
 -{
 -      /*
 -       * We always sign-extend a -1 value being set here,
 -       * so this is always either -1L or a syscall number.
 -       */
 -      return regs->orig_ax;
 -}
 -
 -/*
 - * Return a value that is -EFOO if the system call in @regs->orig_ax
 - * returned an error.  This only works for @regs from @current.
 - */
 -static long current_syscall_ret(struct pt_regs *regs)
 -{
 -#ifdef CONFIG_IA32_EMULATION
 -      if (test_thread_flag(TIF_IA32))
 -              /*
 -               * Sign-extend the value so (int)-EFOO becomes (long)-EFOO
 -               * and will match correctly in comparisons.
 -               */
 -              return (int) regs->ax;
 -#endif
 -      return regs->ax;
 -}
 -
  /*
   * OK, we're invoking a handler
 - */   
 + */
  
  static int
  handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
        int ret;
  
        /* Are we from a system call? */
 -      if (current_syscall(regs) >= 0) {
 +      if (syscall_get_nr(current, regs) >= 0) {
                /* If so, check system call restarting.. */
 -              switch (current_syscall_ret(regs)) {
 +              switch (syscall_get_error(current, regs)) {
                case -ERESTART_RESTARTBLOCK:
                case -ERESTARTNOHAND:
                        regs->ax = -EINTR;
                        ret = ia32_setup_rt_frame(sig, ka, info, oldset, regs);
                else
                        ret = ia32_setup_frame(sig, ka, oldset, regs);
 -      } else 
 +      } else
  #endif
        ret = setup_rt_frame(sig, ka, info, oldset, regs);
  
                 * handler too.
                 */
                regs->flags &= ~X86_EFLAGS_TF;
 -              if (test_thread_flag(TIF_SINGLESTEP))
 -                      ptrace_notify(SIGTRAP);
  
                spin_lock_irq(&current->sighand->siglock);
 -              sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
 +              sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
                if (!(ka->sa.sa_flags & SA_NODEFER))
 -                      sigaddset(&current->blocked,sig);
 +                      sigaddset(&current->blocked, sig);
                recalc_sigpending();
                spin_unlock_irq(&current->sighand->siglock);
 +
 +              tracehook_signal_handler(sig, info, ka, regs,
 +                                       test_thread_flag(TIF_SINGLESTEP));
        }
  
        return ret;
@@@ -490,9 -442,9 +413,9 @@@ static void do_signal(struct pt_regs *r
        }
  
        /* Did we come from a system call? */
 -      if (current_syscall(regs) >= 0) {
 +      if (syscall_get_nr(current, regs) >= 0) {
                /* Restart the system call - no handlers present */
 -              switch (current_syscall_ret(regs)) {
 +              switch (syscall_get_error(current, regs)) {
                case -ERESTARTNOHAND:
                case -ERESTARTSYS:
                case -ERESTARTNOINTR:
@@@ -530,23 -482,17 +453,23 @@@ void do_notify_resume(struct pt_regs *r
        /* deal with pending signal delivery */
        if (thread_info_flags & _TIF_SIGPENDING)
                do_signal(regs);
 +
 +      if (thread_info_flags & _TIF_NOTIFY_RESUME) {
 +              clear_thread_flag(TIF_NOTIFY_RESUME);
 +              tracehook_notify_resume(regs);
 +      }
  }
  
  void signal_fault(struct pt_regs *regs, void __user *frame, char *where)
 -{ 
 -      struct task_struct *me = current; 
 +{
 +      struct task_struct *me = current;
        if (show_unhandled_signals && printk_ratelimit()) {
                printk("%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx",
 -             me->comm,me->pid,where,frame,regs->ip,regs->sp,regs->orig_ax);
 +             me->comm, me->pid, where, frame, regs->ip,
 +                 regs->sp, regs->orig_ax);
                print_vma_addr(" in ", regs->ip);
                printk("\n");
        }
  
 -      force_sig(SIGSEGV, me); 
 -} 
 +      force_sig(SIGSEGV, me);
 +}
index 7a31f104bef9136538a304715557480243022655,b42068fb7b76fcbabe19c734cd0a973fa2c562f6..2887a789e38fab315c7ce618a40aa947fe58915c
@@@ -32,8 -32,6 +32,8 @@@
  #include <linux/bug.h>
  #include <linux/nmi.h>
  #include <linux/mm.h>
 +#include <linux/smp.h>
 +#include <linux/io.h>
  
  #if defined(CONFIG_EDAC)
  #include <linux/edac.h>
@@@ -47,6 -45,9 +47,6 @@@
  #include <asm/unwind.h>
  #include <asm/desc.h>
  #include <asm/i387.h>
 -#include <asm/nmi.h>
 -#include <asm/smp.h>
 -#include <asm/io.h>
  #include <asm/pgalloc.h>
  #include <asm/proto.h>
  #include <asm/pda.h>
@@@ -84,8 -85,7 +84,8 @@@ static inline void preempt_conditional_
  
  void printk_address(unsigned long address, int reliable)
  {
 -      printk(" [<%016lx>] %s%pS\n", address, reliable ? "": "? ", (void *) address);
 +      printk(" [<%016lx>] %s%pS\n",
 +                      address, reliable ?     "" : "? ", (void *) address);
  }
  
  static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
@@@ -98,8 -98,7 +98,8 @@@
                [STACKFAULT_STACK - 1] = "#SS",
                [MCE_STACK - 1] = "#MC",
  #if DEBUG_STKSZ > EXCEPTION_STKSZ
 -              [N_EXCEPTION_STACKS ... N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]"
 +              [N_EXCEPTION_STACKS ...
 +                      N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]"
  #endif
        };
        unsigned k;
  }
  
  /*
 - * x86-64 can have up to three kernel stacks: 
 + * x86-64 can have up to three kernel stacks:
   * process stack
   * interrupt stack
   * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack
@@@ -220,7 -219,7 +220,7 @@@ void dump_trace(struct task_struct *tas
                const struct stacktrace_ops *ops, void *data)
  {
        const unsigned cpu = get_cpu();
 -      unsigned long *irqstack_end = (unsigned long*)cpu_pda(cpu)->irqstackptr;
 +      unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr;
        unsigned used = 0;
        struct thread_info *tinfo;
  
        if (!bp) {
                if (task == current) {
                        /* Grab bp right from our regs */
 -                      asm("movq %%rbp, %0" : "=r" (bp) :);
 +                      asm("movq %%rbp, %0" : "=r" (bp) : );
                } else {
                        /* bp is the last reg pushed by switch_to */
                        bp = *(unsigned long *) task->thread.sp;
@@@ -357,15 -356,11 +357,15 @@@ show_stack_log_lvl(struct task_struct *
        unsigned long *stack;
        int i;
        const int cpu = smp_processor_id();
 -      unsigned long *irqstack_end = (unsigned long *) (cpu_pda(cpu)->irqstackptr);
 -      unsigned long *irqstack = (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE);
 +      unsigned long *irqstack_end =
 +              (unsigned long *) (cpu_pda(cpu)->irqstackptr);
 +      unsigned long *irqstack =
 +              (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE);
  
 -      // debugging aid: "show_stack(NULL, NULL);" prints the
 -      // back trace for this cpu.
 +      /*
 +       * debugging aid: "show_stack(NULL, NULL);" prints the
 +       * back trace for this cpu.
 +       */
  
        if (sp == NULL) {
                if (task)
@@@ -409,7 -404,7 +409,7 @@@ void dump_stack(void
  
  #ifdef CONFIG_FRAME_POINTER
        if (!bp)
 -              asm("movq %%rbp, %0" : "=r" (bp):);
 +              asm("movq %%rbp, %0" : "=r" (bp) : );
  #endif
  
        printk("Pid: %d, comm: %.20s %s %s %.*s\n",
                init_utsname()->version);
        show_trace(NULL, NULL, &stack, bp);
  }
 -
  EXPORT_SYMBOL(dump_stack);
  
  void show_registers(struct pt_regs *regs)
@@@ -496,7 -492,7 +496,7 @@@ unsigned __kprobes long oops_begin(void
        raw_local_irq_save(flags);
        cpu = smp_processor_id();
        if (!__raw_spin_trylock(&die_lock)) {
 -              if (cpu == die_owner) 
 +              if (cpu == die_owner)
                        /* nested oops. should stop eventually */;
                else
                        __raw_spin_lock(&die_lock);
@@@ -641,7 -637,7 +641,7 @@@ kernel_trap
  }
  
  #define DO_ERROR(trapnr, signr, str, name) \
 -asmlinkage void do_##name(struct pt_regs * regs, long error_code)     \
 +asmlinkage void do_##name(struct pt_regs *regs, long error_code)      \
  {                                                                     \
        if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr)  \
                                                        == NOTIFY_STOP) \
  }
  
  #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr)               \
 -asmlinkage void do_##name(struct pt_regs * regs, long error_code)     \
 +asmlinkage void do_##name(struct pt_regs *regs, long error_code)      \
  {                                                                     \
        siginfo_t info;                                                 \
        info.si_signo = signr;                                          \
@@@ -686,7 -682,7 +686,7 @@@ asmlinkage void do_stack_segment(struc
        preempt_conditional_cli(regs);
  }
  
 -asmlinkage void do_double_fault(struct pt_regs * regs, long error_code)
 +asmlinkage void do_double_fault(struct pt_regs *regs, long error_code)
  {
        static const char str[] = "double fault";
        struct task_struct *tsk = current;
@@@ -781,10 -777,9 +781,10 @@@ io_check_error(unsigned char reason, st
  }
  
  static notrace __kprobes void
 -unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
 +unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
  {
 -      if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
 +      if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) ==
 +                      NOTIFY_STOP)
                return;
        printk(KERN_EMERG "Uhhuh. NMI received for unknown reason %02x.\n",
                reason);
@@@ -886,7 -881,7 +886,7 @@@ asmlinkage __kprobes struct pt_regs *sy
        else if (user_mode(eregs))
                regs = task_pt_regs(current);
        /* Exception from kernel and interrupts are enabled. Move to
 -         kernel process stack. */
 +         kernel process stack. */
        else if (eregs->flags & X86_EFLAGS_IF)
                regs = (struct pt_regs *)(eregs->sp -= sizeof(struct pt_regs));
        if (eregs != regs)
  }
  
  /* runs on IST stack. */
 -asmlinkage void __kprobes do_debug(struct pt_regs * regs,
 +asmlinkage void __kprobes do_debug(struct pt_regs *regs,
                                   unsigned long error_code)
  {
        struct task_struct *tsk = current;
@@@ -1039,7 -1034,7 +1039,7 @@@ asmlinkage void do_coprocessor_error(st
  
  asmlinkage void bad_intr(void)
  {
 -      printk("bad interrupt"); 
 +      printk("bad interrupt");
  }
  
  asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs)
  
        conditional_sti(regs);
        if (!user_mode(regs) &&
 -              kernel_math_error(regs, "kernel simd math error", 19))
 +                      kernel_math_error(regs, "kernel simd math error", 19))
                return;
  
        /*
        force_sig_info(SIGFPE, &info, task);
  }
  
 -asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs)
 +asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs)
  {
  }
  
@@@ -1138,7 -1133,7 +1138,7 @@@ asmlinkage void math_state_restore(void
        /*
         * Paranoid restore. send a SIGSEGV if we fail to restore the state.
         */
-       if (unlikely(restore_fpu_checking(&me->thread.xstate->fxsave))) {
+       if (unlikely(restore_fpu_checking(me))) {
                stts();
                force_sig(SIGSEGV, me);
                return;
@@@ -1153,10 -1148,8 +1153,10 @@@ void __init trap_init(void
        set_intr_gate(0, &divide_error);
        set_intr_gate_ist(1, &debug, DEBUG_STACK);
        set_intr_gate_ist(2, &nmi, NMI_STACK);
 -      set_system_gate_ist(3, &int3, DEBUG_STACK); /* int3 can be called from all */
 -      set_system_gate(4, &overflow); /* int4 can be called from all */
 +      /* int3 can be called from all */
 +      set_system_gate_ist(3, &int3, DEBUG_STACK);
 +      /* int4 can be called from all */
 +      set_system_gate(4, &overflow);
        set_intr_gate(5, &bounds);
        set_intr_gate(6, &invalid_op);
        set_intr_gate(7, &device_not_available);
  #ifdef CONFIG_IA32_EMULATION
        set_system_gate(IA32_SYSCALL_VECTOR, ia32_syscall);
  #endif
-       /*
-        * initialize the per thread extended state:
-        */
-       init_thread_xstate();
        /*
         * Should be a barrier for any external CPU state:
         */
diff --combined arch/x86/kvm/vmx.h
index 23e8373507adec0d49cec6ab7637c17da2fc61b2,b32d4e5b123d7b99a9ea60c91138c26dbd6e33db..17e25995b65b62986ec2d4bbff7f7e9ce6d162f6
@@@ -331,21 -331,6 +331,6 @@@ enum vmcs_field 
  
  #define AR_RESERVD_MASK 0xfffe0f00
  
- #define MSR_IA32_VMX_BASIC                      0x480
- #define MSR_IA32_VMX_PINBASED_CTLS              0x481
- #define MSR_IA32_VMX_PROCBASED_CTLS             0x482
- #define MSR_IA32_VMX_EXIT_CTLS                  0x483
- #define MSR_IA32_VMX_ENTRY_CTLS                 0x484
- #define MSR_IA32_VMX_MISC                       0x485
- #define MSR_IA32_VMX_CR0_FIXED0                 0x486
- #define MSR_IA32_VMX_CR0_FIXED1                 0x487
- #define MSR_IA32_VMX_CR4_FIXED0                 0x488
- #define MSR_IA32_VMX_CR4_FIXED1                 0x489
- #define MSR_IA32_VMX_VMCS_ENUM                  0x48a
- #define MSR_IA32_VMX_PROCBASED_CTLS2            0x48b
- #define MSR_IA32_VMX_EPT_VPID_CAP               0x48c
- #define MSR_IA32_FEATURE_CONTROL                0x3a
  #define MSR_IA32_FEATURE_CONTROL_LOCKED         0x1
  #define MSR_IA32_FEATURE_CONTROL_VMXON_ENABLED  0x4
  
  #define VMX_EPT_READABLE_MASK                 0x1ull
  #define VMX_EPT_WRITABLE_MASK                 0x2ull
  #define VMX_EPT_EXECUTABLE_MASK                       0x4ull
 -#define VMX_EPT_FAKE_ACCESSED_MASK            (1ull << 62)
 -#define VMX_EPT_FAKE_DIRTY_MASK                       (1ull << 63)
  
  #define VMX_EPT_IDENTITY_PAGETABLE_ADDR               0xfffbc000ul
  
diff --combined arch/x86/mm/init_64.c
index fb30486c82f7f7c21e036feebb9cb58f957d8a36,1f6806b62eb8712a91f12e74dfa9bc09b81f395f..83e13f2d53d2a94d95f3e4657eb570ea784c4a72
@@@ -88,6 -88,62 +88,62 @@@ early_param("gbpages", parse_direct_gbp
  
  int after_bootmem;
  
+ unsigned long __supported_pte_mask __read_mostly = ~0UL;
+ EXPORT_SYMBOL_GPL(__supported_pte_mask);
+ static int do_not_nx __cpuinitdata;
+ /*
+  * noexec=on|off
+  * Control non-executable mappings for 64-bit processes.
+  *
+  * on Enable (default)
+  * off        Disable
+  */
+ static int __init nonx_setup(char *str)
+ {
+       if (!str)
+               return -EINVAL;
+       if (!strncmp(str, "on", 2)) {
+               __supported_pte_mask |= _PAGE_NX;
+               do_not_nx = 0;
+       } else if (!strncmp(str, "off", 3)) {
+               do_not_nx = 1;
+               __supported_pte_mask &= ~_PAGE_NX;
+       }
+       return 0;
+ }
+ early_param("noexec", nonx_setup);
+ void __cpuinit check_efer(void)
+ {
+       unsigned long efer;
+       rdmsrl(MSR_EFER, efer);
+       if (!(efer & EFER_NX) || do_not_nx)
+               __supported_pte_mask &= ~_PAGE_NX;
+ }
+ int force_personality32;
+ /*
+  * noexec32=on|off
+  * Control non executable heap for 32bit processes.
+  * To control the stack too use noexec=off
+  *
+  * on PROT_READ does not imply PROT_EXEC for 32-bit processes (default)
+  * off        PROT_READ implies PROT_EXEC
+  */
+ static int __init nonx32_setup(char *str)
+ {
+       if (!strcmp(str, "on"))
+               force_personality32 &= ~READ_IMPLIES_EXEC;
+       else if (!strcmp(str, "off"))
+               force_personality32 |= READ_IMPLIES_EXEC;
+       return 1;
+ }
+ __setup("noexec32=", nonx32_setup);
  /*
   * NOTE: This function is marked __ref because it calls __init function
   * (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0.
@@@ -225,7 -281,7 +281,7 @@@ void __init init_extra_mapping_uc(unsig
  void __init cleanup_highmap(void)
  {
        unsigned long vaddr = __START_KERNEL_map;
 -      unsigned long end = round_up((unsigned long)_end, PMD_SIZE) - 1;
 +      unsigned long end = roundup((unsigned long)_end, PMD_SIZE) - 1;
        pmd_t *pmd = level2_kernel_pgt;
        pmd_t *last_pmd = pmd + PTRS_PER_PMD;
  
@@@ -271,8 -327,7 +327,8 @@@ static __ref void unmap_low_page(void *
  }
  
  static unsigned long __meminit
 -phys_pte_init(pte_t *pte_page, unsigned long addr, unsigned long end)
 +phys_pte_init(pte_t *pte_page, unsigned long addr, unsigned long end,
 +            pgprot_t prot)
  {
        unsigned pages = 0;
        unsigned long last_map_addr = end;
                        break;
                }
  
 +              /*
 +               * We will re-use the existing mapping.
 +               * Xen for example has some special requirements, like mapping
 +               * pagetable pages as RO. So assume someone who pre-setup
 +               * these mappings are more intelligent.
 +               */
                if (pte_val(*pte))
                        continue;
  
                if (0)
                        printk("   pte=%p addr=%lx pte=%016lx\n",
                               pte, addr, pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL).pte);
 -              set_pte(pte, pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL));
 -              last_map_addr = (addr & PAGE_MASK) + PAGE_SIZE;
                pages++;
 +              set_pte(pte, pfn_pte(addr >> PAGE_SHIFT, prot));
 +              last_map_addr = (addr & PAGE_MASK) + PAGE_SIZE;
        }
 +
        update_page_count(PG_LEVEL_4K, pages);
  
        return last_map_addr;
  }
  
  static unsigned long __meminit
 -phys_pte_update(pmd_t *pmd, unsigned long address, unsigned long end)
 +phys_pte_update(pmd_t *pmd, unsigned long address, unsigned long end,
 +              pgprot_t prot)
  {
        pte_t *pte = (pte_t *)pmd_page_vaddr(*pmd);
  
 -      return phys_pte_init(pte, address, end);
 +      return phys_pte_init(pte, address, end, prot);
  }
  
  static unsigned long __meminit
  phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
 -                       unsigned long page_size_mask)
 +            unsigned long page_size_mask, pgprot_t prot)
  {
        unsigned long pages = 0;
        unsigned long last_map_addr = end;
 -      unsigned long start = address;
  
        int i = pmd_index(address);
  
                unsigned long pte_phys;
                pmd_t *pmd = pmd_page + pmd_index(address);
                pte_t *pte;
 +              pgprot_t new_prot = prot;
  
                if (address >= end) {
                        if (!after_bootmem) {
                        if (!pmd_large(*pmd)) {
                                spin_lock(&init_mm.page_table_lock);
                                last_map_addr = phys_pte_update(pmd, address,
 -                                                              end);
 +                                                              end, prot);
                                spin_unlock(&init_mm.page_table_lock);
 +                              continue;
                        }
 -                      /* Count entries we're using from level2_ident_pgt */
 -                      if (start == 0)
 -                              pages++;
 -                      continue;
 +                      /*
 +                       * If we are ok with PG_LEVEL_2M mapping, then we will
 +                       * use the existing mapping,
 +                       *
 +                       * Otherwise, we will split the large page mapping but
 +                       * use the same existing protection bits except for
 +                       * large page, so that we don't violate Intel's TLB
 +                       * Application note (317080) which says, while changing
 +                       * the page sizes, new and old translations should
 +                       * not differ with respect to page frame and
 +                       * attributes.
 +                       */
 +                      if (page_size_mask & (1 << PG_LEVEL_2M))
 +                              continue;
 +                      new_prot = pte_pgprot(pte_clrhuge(*(pte_t *)pmd));
                }
  
                if (page_size_mask & (1<<PG_LEVEL_2M)) {
                        pages++;
                        spin_lock(&init_mm.page_table_lock);
                        set_pte((pte_t *)pmd,
 -                              pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL_LARGE));
 +                              pfn_pte(address >> PAGE_SHIFT,
 +                                      __pgprot(pgprot_val(prot) | _PAGE_PSE)));
                        spin_unlock(&init_mm.page_table_lock);
                        last_map_addr = (address & PMD_MASK) + PMD_SIZE;
                        continue;
                }
  
                pte = alloc_low_page(&pte_phys);
 -              last_map_addr = phys_pte_init(pte, address, end);
 +              last_map_addr = phys_pte_init(pte, address, end, new_prot);
                unmap_low_page(pte);
  
                spin_lock(&init_mm.page_table_lock);
  
  static unsigned long __meminit
  phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end,
 -                       unsigned long page_size_mask)
 +              unsigned long page_size_mask, pgprot_t prot)
  {
        pmd_t *pmd = pmd_offset(pud, 0);
        unsigned long last_map_addr;
  
 -      last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask);
 +      last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask, prot);
        __flush_tlb_all();
        return last_map_addr;
  }
@@@ -416,7 -450,6 +472,7 @@@ phys_pud_init(pud_t *pud_page, unsigne
                unsigned long pmd_phys;
                pud_t *pud = pud_page + pud_index(addr);
                pmd_t *pmd;
 +              pgprot_t prot = PAGE_KERNEL;
  
                if (addr >= end)
                        break;
                }
  
                if (pud_val(*pud)) {
 -                      if (!pud_large(*pud))
 +                      if (!pud_large(*pud)) {
                                last_map_addr = phys_pmd_update(pud, addr, end,
 -                                                       page_size_mask);
 -                      continue;
 +                                                       page_size_mask, prot);
 +                              continue;
 +                      }
 +                      /*
 +                       * If we are ok with PG_LEVEL_1G mapping, then we will
 +                       * use the existing mapping.
 +                       *
 +                       * Otherwise, we will split the gbpage mapping but use
 +                       * the same existing protection  bits except for large
 +                       * page, so that we don't violate Intel's TLB
 +                       * Application note (317080) which says, while changing
 +                       * the page sizes, new and old translations should
 +                       * not differ with respect to page frame and
 +                       * attributes.
 +                       */
 +                      if (page_size_mask & (1 << PG_LEVEL_1G))
 +                              continue;
 +                      prot = pte_pgprot(pte_clrhuge(*(pte_t *)pud));
                }
  
                if (page_size_mask & (1<<PG_LEVEL_1G)) {
                }
  
                pmd = alloc_low_page(&pmd_phys);
 -              last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask);
 +              last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask,
 +                                            prot);
                unmap_low_page(pmd);
  
                spin_lock(&init_mm.page_table_lock);
                spin_unlock(&init_mm.page_table_lock);
        }
        __flush_tlb_all();
 +
        update_page_count(PG_LEVEL_1G, pages);
  
        return last_map_addr;
@@@ -487,28 -502,27 +543,28 @@@ phys_pud_update(pgd_t *pgd, unsigned lo
        return phys_pud_init(pud, addr, end, page_size_mask);
  }
  
 -static void __init find_early_table_space(unsigned long end)
 +static void __init find_early_table_space(unsigned long end, int use_pse,
 +                                        int use_gbpages)
  {
        unsigned long puds, pmds, ptes, tables, start;
  
        puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
 -      tables = round_up(puds * sizeof(pud_t), PAGE_SIZE);
 -      if (direct_gbpages) {
 +      tables = roundup(puds * sizeof(pud_t), PAGE_SIZE);
 +      if (use_gbpages) {
                unsigned long extra;
                extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT);
                pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT;
        } else
                pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
 -      tables += round_up(pmds * sizeof(pmd_t), PAGE_SIZE);
 +      tables += roundup(pmds * sizeof(pmd_t), PAGE_SIZE);
  
 -      if (cpu_has_pse) {
 +      if (use_pse) {
                unsigned long extra;
                extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT);
                ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT;
        } else
                ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT;
 -      tables += round_up(ptes * sizeof(pte_t), PAGE_SIZE);
 +      tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE);
  
        /*
         * RED-PEN putting page tables only on node 0 could
@@@ -570,7 -584,6 +626,7 @@@ static unsigned long __init kernel_phys
                pgd_populate(&init_mm, pgd, __va(pud_phys));
                spin_unlock(&init_mm.page_table_lock);
        }
 +      __flush_tlb_all();
  
        return last_map_addr;
  }
@@@ -614,7 -627,6 +670,7 @@@ unsigned long __init_refok init_memory_
  
        struct map_range mr[NR_RANGE_MR];
        int nr_range, i;
 +      int use_pse, use_gbpages;
  
        printk(KERN_INFO "init_memory_mapping\n");
  
        if (!after_bootmem)
                init_gbpages();
  
 -      if (direct_gbpages)
 +#ifdef CONFIG_DEBUG_PAGEALLOC
 +      /*
 +       * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages.
 +       * This will simplify cpa(), which otherwise needs to support splitting
 +       * large pages into small in interrupt context, etc.
 +       */
 +      use_pse = use_gbpages = 0;
 +#else
 +      use_pse = cpu_has_pse;
 +      use_gbpages = direct_gbpages;
 +#endif
 +
 +      if (use_gbpages)
                page_size_mask |= 1 << PG_LEVEL_1G;
 -      if (cpu_has_pse)
 +      if (use_pse)
                page_size_mask |= 1 << PG_LEVEL_2M;
  
        memset(mr, 0, sizeof(mr));
                         (mr[i].page_size_mask & (1<<PG_LEVEL_2M))?"2M":"4k"));
  
        if (!after_bootmem)
 -              find_early_table_space(end);
 +              find_early_table_space(end, use_pse, use_gbpages);
  
        for (i = 0; i < nr_range; i++)
                last_map_addr = kernel_physical_mapping_init(
@@@ -862,6 -862,8 +918,6 @@@ void __init mem_init(void
                reservedpages << (PAGE_SHIFT-10),
                datasize >> 10,
                initsize >> 10);
 -
 -      cpa_init();
  }
  
  void free_init_pages(char *what, unsigned long begin, unsigned long end)
index 065c6a86ed802c7ab986bcf095a06aafdf11b666,8d45690bef5fb5e8ccf2ff74d7c28aa24e9ab17d..adfeae6586e175f9972012a94c823ede9527d0d1
@@@ -6,7 -6,13 +6,13 @@@
  
  #include <asm/required-features.h>
  
- #define NCAPINTS      8       /* N 32-bit words worth of info */
+ #define NCAPINTS      9       /* N 32-bit words worth of info */
+ /*
+  * Note: If the comment begins with a quoted string, that string is used
+  * in /proc/cpuinfo instead of the macro name.  If the string is "",
+  * this feature bit is not displayed in /proc/cpuinfo at all.
+  */
  
  /* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */
  #define X86_FEATURE_FPU               (0*32+ 0) /* Onboard FPU */
@@@ -14,7 -20,7 +20,7 @@@
  #define X86_FEATURE_DE                (0*32+ 2) /* Debugging Extensions */
  #define X86_FEATURE_PSE               (0*32+ 3) /* Page Size Extensions */
  #define X86_FEATURE_TSC               (0*32+ 4) /* Time Stamp Counter */
- #define X86_FEATURE_MSR               (0*32+ 5) /* Model-Specific Registers, RDMSR, WRMSR */
+ #define X86_FEATURE_MSR               (0*32+ 5) /* Model-Specific Registers */
  #define X86_FEATURE_PAE               (0*32+ 6) /* Physical Address Extensions */
  #define X86_FEATURE_MCE               (0*32+ 7) /* Machine Check Architecture */
  #define X86_FEATURE_CX8               (0*32+ 8) /* CMPXCHG8 instruction */
  #define X86_FEATURE_MTRR      (0*32+12) /* Memory Type Range Registers */
  #define X86_FEATURE_PGE               (0*32+13) /* Page Global Enable */
  #define X86_FEATURE_MCA               (0*32+14) /* Machine Check Architecture */
- #define X86_FEATURE_CMOV      (0*32+15) /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */
+ #define X86_FEATURE_CMOV      (0*32+15) /* CMOV instructions */
+                                         /* (plus FCMOVcc, FCOMI with FPU) */
  #define X86_FEATURE_PAT               (0*32+16) /* Page Attribute Table */
  #define X86_FEATURE_PSE36     (0*32+17) /* 36-bit PSEs */
  #define X86_FEATURE_PN                (0*32+18) /* Processor serial number */
- #define X86_FEATURE_CLFLSH    (0*32+19) /* Supports the CLFLUSH instruction */
- #define X86_FEATURE_DS                (0*32+21) /* Debug Store */
+ #define X86_FEATURE_CLFLSH    (0*32+19) /* "clflush" CLFLUSH instruction */
+ #define X86_FEATURE_DS                (0*32+21) /* "dts" Debug Store */
  #define X86_FEATURE_ACPI      (0*32+22) /* ACPI via MSR */
  #define X86_FEATURE_MMX               (0*32+23) /* Multimedia Extensions */
- #define X86_FEATURE_FXSR      (0*32+24) /* FXSAVE and FXRSTOR instructions (fast save and restore */
-                                         /* of FPU context), and CR4.OSFXSR available */
- #define X86_FEATURE_XMM               (0*32+25) /* Streaming SIMD Extensions */
- #define X86_FEATURE_XMM2      (0*32+26) /* Streaming SIMD Extensions-2 */
- #define X86_FEATURE_SELFSNOOP (0*32+27) /* CPU self snoop */
+ #define X86_FEATURE_FXSR      (0*32+24) /* FXSAVE/FXRSTOR, CR4.OSFXSR */
+ #define X86_FEATURE_XMM               (0*32+25) /* "sse" */
+ #define X86_FEATURE_XMM2      (0*32+26) /* "sse2" */
+ #define X86_FEATURE_SELFSNOOP (0*32+27) /* "ss" CPU self snoop */
  #define X86_FEATURE_HT                (0*32+28) /* Hyper-Threading */
- #define X86_FEATURE_ACC               (0*32+29) /* Automatic clock control */
+ #define X86_FEATURE_ACC               (0*32+29) /* "tm" Automatic clock control */
  #define X86_FEATURE_IA64      (0*32+30) /* IA-64 processor */
+ #define X86_FEATURE_PBE               (0*32+31) /* Pending Break Enable */
  
  /* AMD-defined CPU features, CPUID level 0x80000001, word 1 */
  /* Don't duplicate feature flags which are redundant with Intel! */
@@@ -46,7 -53,8 +53,8 @@@
  #define X86_FEATURE_MP                (1*32+19) /* MP Capable. */
  #define X86_FEATURE_NX                (1*32+20) /* Execute Disable */
  #define X86_FEATURE_MMXEXT    (1*32+22) /* AMD MMX extensions */
- #define X86_FEATURE_GBPAGES   (1*32+26) /* GB pages */
+ #define X86_FEATURE_FXSR_OPT  (1*32+25) /* FXSAVE/FXRSTOR optimizations */
+ #define X86_FEATURE_GBPAGES   (1*32+26) /* "pdpe1gb" GB pages */
  #define X86_FEATURE_RDTSCP    (1*32+27) /* RDTSCP */
  #define X86_FEATURE_LM                (1*32+29) /* Long Mode (x86-64) */
  #define X86_FEATURE_3DNOWEXT  (1*32+30) /* AMD 3DNow! extensions */
  #define X86_FEATURE_CYRIX_ARR (3*32+ 2) /* Cyrix ARRs (= MTRRs) */
  #define X86_FEATURE_CENTAUR_MCR       (3*32+ 3) /* Centaur MCRs (= MTRRs) */
  /* cpu types for specific tunings: */
- #define X86_FEATURE_K8                (3*32+ 4) /* Opteron, Athlon64 */
- #define X86_FEATURE_K7                (3*32+ 5) /* Athlon */
- #define X86_FEATURE_P3                (3*32+ 6) /* P3 */
- #define X86_FEATURE_P4                (3*32+ 7) /* P4 */
+ #define X86_FEATURE_K8                (3*32+ 4) /* "" Opteron, Athlon64 */
+ #define X86_FEATURE_K7                (3*32+ 5) /* "" Athlon */
+ #define X86_FEATURE_P3                (3*32+ 6) /* "" P3 */
+ #define X86_FEATURE_P4                (3*32+ 7) /* "" P4 */
  #define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */
  #define X86_FEATURE_UP                (3*32+ 9) /* smp kernel running on up */
- #define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* FXSAVE leaks FOP/FIP/FOP */
+ #define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* "" FXSAVE leaks FOP/FIP/FOP */
  #define X86_FEATURE_ARCH_PERFMON (3*32+11) /* Intel Architectural PerfMon */
++#define X86_FEATURE_NOPL      (3*32+20) /* The NOPL (0F 1F) instructions */
  #define X86_FEATURE_PEBS      (3*32+12) /* Precise-Event Based Sampling */
  #define X86_FEATURE_BTS               (3*32+13) /* Branch Trace Store */
- #define X86_FEATURE_SYSCALL32 (3*32+14) /* syscall in ia32 userspace */
- #define X86_FEATURE_SYSENTER32        (3*32+15) /* sysenter in ia32 userspace */
- #define X86_FEATURE_REP_GOOD  (3*32+16) /* rep microcode works well on this CPU */
- #define X86_FEATURE_MFENCE_RDTSC (3*32+17) /* Mfence synchronizes RDTSC */
- #define X86_FEATURE_LFENCE_RDTSC (3*32+18) /* Lfence synchronizes RDTSC */
- #define X86_FEATURE_11AP      (3*32+19) /* Bad local APIC aka 11AP */
+ #define X86_FEATURE_SYSCALL32 (3*32+14) /* "" syscall in ia32 userspace */
+ #define X86_FEATURE_SYSENTER32        (3*32+15) /* "" sysenter in ia32 userspace */
+ #define X86_FEATURE_REP_GOOD  (3*32+16) /* rep microcode works well */
+ #define X86_FEATURE_MFENCE_RDTSC (3*32+17) /* "" Mfence synchronizes RDTSC */
+ #define X86_FEATURE_LFENCE_RDTSC (3*32+18) /* "" Lfence synchronizes RDTSC */
+ #define X86_FEATURE_11AP      (3*32+19) /* "" Bad local APIC aka 11AP */
  #define X86_FEATURE_NOPL      (3*32+20) /* The NOPL (0F 1F) instructions */
 +#define X86_FEATURE_AMDC1E    (3*32+21) /* AMD C1E detected */
+ #define X86_FEATURE_XTOPOLOGY (3*32+21) /* cpu topology enum extensions */
  
  /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
- #define X86_FEATURE_XMM3      (4*32+ 0) /* Streaming SIMD Extensions-3 */
- #define X86_FEATURE_MWAIT     (4*32+ 3) /* Monitor/Mwait support */
- #define X86_FEATURE_DSCPL     (4*32+ 4) /* CPL Qualified Debug Store */
+ #define X86_FEATURE_XMM3      (4*32+ 0) /* "pni" SSE-3 */
+ #define X86_FEATURE_PCLMULQDQ (4*32+ 1) /* PCLMULQDQ instruction */
+ #define X86_FEATURE_DTES64    (4*32+ 2) /* 64-bit Debug Store */
+ #define X86_FEATURE_MWAIT     (4*32+ 3) /* "monitor" Monitor/Mwait support */
+ #define X86_FEATURE_DSCPL     (4*32+ 4) /* "ds_cpl" CPL Qual. Debug Store */
+ #define X86_FEATURE_VMX               (4*32+ 5) /* Hardware virtualization */
+ #define X86_FEATURE_SMX               (4*32+ 6) /* Safer mode */
  #define X86_FEATURE_EST               (4*32+ 7) /* Enhanced SpeedStep */
  #define X86_FEATURE_TM2               (4*32+ 8) /* Thermal Monitor 2 */
+ #define X86_FEATURE_SSSE3     (4*32+ 9) /* Supplemental SSE-3 */
  #define X86_FEATURE_CID               (4*32+10) /* Context ID */
+ #define X86_FEATURE_FMA               (4*32+12) /* Fused multiply-add */
  #define X86_FEATURE_CX16      (4*32+13) /* CMPXCHG16B */
  #define X86_FEATURE_XTPR      (4*32+14) /* Send Task Priority Messages */
+ #define X86_FEATURE_PDCM      (4*32+15) /* Performance Capabilities */
  #define X86_FEATURE_DCA               (4*32+18) /* Direct Cache Access */
+ #define X86_FEATURE_XMM4_1    (4*32+19) /* "sse4_1" SSE-4.1 */
+ #define X86_FEATURE_XMM4_2    (4*32+20) /* "sse4_2" SSE-4.2 */
  #define X86_FEATURE_X2APIC    (4*32+21) /* x2APIC */
- #define X86_FEATURE_XMM4_2    (4*32+20) /* Streaming SIMD Extensions-4.2 */
+ #define X86_FEATURE_AES               (4*32+25) /* AES instructions */
+ #define X86_FEATURE_XSAVE     (4*32+26) /* XSAVE/XRSTOR/XSETBV/XGETBV */
+ #define X86_FEATURE_OSXSAVE   (4*32+27) /* "" XSAVE enabled in the OS */
+ #define X86_FEATURE_AVX               (4*32+28) /* Advanced Vector Extensions */
  
  /* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */
- #define X86_FEATURE_XSTORE    (5*32+ 2) /* on-CPU RNG present (xstore insn) */
- #define X86_FEATURE_XSTORE_EN (5*32+ 3) /* on-CPU RNG enabled */
- #define X86_FEATURE_XCRYPT    (5*32+ 6) /* on-CPU crypto (xcrypt insn) */
- #define X86_FEATURE_XCRYPT_EN (5*32+ 7) /* on-CPU crypto enabled */
+ #define X86_FEATURE_XSTORE    (5*32+ 2) /* "rng" RNG present (xstore) */
+ #define X86_FEATURE_XSTORE_EN (5*32+ 3) /* "rng_en" RNG enabled */
+ #define X86_FEATURE_XCRYPT    (5*32+ 6) /* "ace" on-CPU crypto (xcrypt) */
+ #define X86_FEATURE_XCRYPT_EN (5*32+ 7) /* "ace_en" on-CPU crypto enabled */
  #define X86_FEATURE_ACE2      (5*32+ 8) /* Advanced Cryptography Engine v2 */
  #define X86_FEATURE_ACE2_EN   (5*32+ 9) /* ACE v2 enabled */
- #define X86_FEATURE_PHE               (5*32+ 10) /* PadLock Hash Engine */
- #define X86_FEATURE_PHE_EN    (5*32+ 11) /* PHE enabled */
- #define X86_FEATURE_PMM               (5*32+ 12) /* PadLock Montgomery Multiplier */
- #define X86_FEATURE_PMM_EN    (5*32+ 13) /* PMM enabled */
+ #define X86_FEATURE_PHE               (5*32+10) /* PadLock Hash Engine */
+ #define X86_FEATURE_PHE_EN    (5*32+11) /* PHE enabled */
+ #define X86_FEATURE_PMM               (5*32+12) /* PadLock Montgomery Multiplier */
+ #define X86_FEATURE_PMM_EN    (5*32+13) /* PMM enabled */
  
  /* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */
  #define X86_FEATURE_LAHF_LM   (6*32+ 0) /* LAHF/SAHF in long mode */
  #define X86_FEATURE_CMP_LEGACY        (6*32+ 1) /* If yes HyperThreading not valid */
- #define X86_FEATURE_IBS               (6*32+ 10) /* Instruction Based Sampling */
+ #define X86_FEATURE_SVM               (6*32+ 2) /* Secure virtual machine */
+ #define X86_FEATURE_EXTAPIC   (6*32+ 3) /* Extended APIC space */
+ #define X86_FEATURE_CR8_LEGACY        (6*32+ 4) /* CR8 in 32-bit mode */
+ #define X86_FEATURE_ABM               (6*32+ 5) /* Advanced bit manipulation */
+ #define X86_FEATURE_SSE4A     (6*32+ 6) /* SSE-4A */
+ #define X86_FEATURE_MISALIGNSSE (6*32+ 7) /* Misaligned SSE mode */
+ #define X86_FEATURE_3DNOWPREFETCH (6*32+ 8) /* 3DNow prefetch instructions */
+ #define X86_FEATURE_OSVW      (6*32+ 9) /* OS Visible Workaround */
+ #define X86_FEATURE_IBS               (6*32+10) /* Instruction Based Sampling */
+ #define X86_FEATURE_SSE5      (6*32+11) /* SSE-5 */
+ #define X86_FEATURE_SKINIT    (6*32+12) /* SKINIT/STGI instructions */
+ #define X86_FEATURE_WDT               (6*32+13) /* Watchdog timer */
  
  /*
   * Auxiliary flags: Linux defined - For features scattered in various
   */
  #define X86_FEATURE_IDA               (7*32+ 0) /* Intel Dynamic Acceleration */
  
+ /* Virtualization flags: Linux defined */
+ #define X86_FEATURE_TPR_SHADOW  (8*32+ 0) /* Intel TPR Shadow */
+ #define X86_FEATURE_VNMI        (8*32+ 1) /* Intel Virtual NMI */
+ #define X86_FEATURE_FLEXPRIORITY (8*32+ 2) /* Intel FlexPriority */
+ #define X86_FEATURE_EPT         (8*32+ 3) /* Intel Extended Page Table */
+ #define X86_FEATURE_VPID        (8*32+ 4) /* Intel Virtual Processor ID */
  #if defined(__KERNEL__) && !defined(__ASSEMBLY__)
  
  #include <linux/bitops.h>
@@@ -152,7 -190,7 +192,7 @@@ extern const char * const x86_power_fla
  } while (0)
  #define setup_force_cpu_cap(bit) do { \
        set_cpu_cap(&boot_cpu_data, bit);       \
-       clear_bit(bit, (unsigned long *)cleared_cpu_caps);      \
+       clear_bit(bit, (unsigned long *)cleared_cpu_caps);      \
  } while (0)
  
  #define cpu_has_fpu           boot_cpu_has(X86_FEATURE_FPU)
  #define cpu_has_gbpages               boot_cpu_has(X86_FEATURE_GBPAGES)
  #define cpu_has_arch_perfmon  boot_cpu_has(X86_FEATURE_ARCH_PERFMON)
  #define cpu_has_pat           boot_cpu_has(X86_FEATURE_PAT)
- #define cpu_has_x2apic                boot_cpu_has(X86_FEATURE_X2APIC)
+ #define cpu_has_xmm4_1                boot_cpu_has(X86_FEATURE_XMM4_1)
  #define cpu_has_xmm4_2                boot_cpu_has(X86_FEATURE_XMM4_2)
+ #define cpu_has_x2apic                boot_cpu_has(X86_FEATURE_X2APIC)
+ #define cpu_has_xsave         boot_cpu_has(X86_FEATURE_XSAVE)
  
  #if defined(CONFIG_X86_INVLPG) || defined(CONFIG_X86_64)
  # define cpu_has_invlpg               1
index 4db0066a3a3597fab71fc9079bb5b55180ab1070,30586f2ee5580e942f4efa464db35cc0fa864907..3f4e52bb77f56449adc92d2bd08f48da4803a78c
@@@ -71,7 -71,6 +71,7 @@@ struct thread_info 
   * Warning: layout of LSW is hardcoded in entry.S
   */
  #define TIF_SYSCALL_TRACE     0       /* syscall trace active */
 +#define TIF_NOTIFY_RESUME     1       /* callback before returning to user */
  #define TIF_SIGPENDING                2       /* signal pending */
  #define TIF_NEED_RESCHED      3       /* rescheduling necessary */
  #define TIF_SINGLESTEP                4       /* reenable singlestep on user return*/
@@@ -94,7 -93,6 +94,7 @@@
  #define TIF_BTS_TRACE_TS      27      /* record scheduling event timestamps */
  
  #define _TIF_SYSCALL_TRACE    (1 << TIF_SYSCALL_TRACE)
 +#define _TIF_NOTIFY_RESUME    (1 << TIF_NOTIFY_RESUME)
  #define _TIF_SIGPENDING               (1 << TIF_SIGPENDING)
  #define _TIF_SINGLESTEP               (1 << TIF_SINGLESTEP)
  #define _TIF_NEED_RESCHED     (1 << TIF_NEED_RESCHED)
  
  /* Only used for 64 bit */
  #define _TIF_DO_NOTIFY_MASK                                           \
 -      (_TIF_SIGPENDING|_TIF_MCE_NOTIFY)
 +      (_TIF_SIGPENDING|_TIF_MCE_NOTIFY|_TIF_NOTIFY_RESUME)
  
  /* flags to check in __switch_to() */
  #define _TIF_WORK_CTXSW                                                       \
@@@ -241,6 -239,7 +241,7 @@@ static inline struct thread_info *stack
  #define TS_POLLING            0x0004  /* true if in idle loop
                                           and not sleeping */
  #define TS_RESTORE_SIGMASK    0x0008  /* restore signal mask in do_signal() */
+ #define TS_XSAVE              0x0010  /* Use xsave/xrstor */
  
  #define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING)
  
diff --combined include/linux/ioport.h
index 350033e8f4e1936b6ca85bf097de153aef707929,fded376b94e3fdb53aa532408b63c4059502e24d..ee9bcc6f32b62efab5c3e93a1b4fe488e7be4448
@@@ -108,6 -108,9 +108,9 @@@ extern struct resource iomem_resource
  
  extern int request_resource(struct resource *root, struct resource *new);
  extern int release_resource(struct resource *new);
+ extern void reserve_region_with_split(struct resource *root,
+                            resource_size_t start, resource_size_t end,
+                            const char *name);
  extern int insert_resource(struct resource *parent, struct resource *new);
  extern void insert_resource_expand_to_fit(struct resource *root, struct resource *new);
  extern int allocate_resource(struct resource *root, struct resource *new,
@@@ -159,9 -162,9 +162,9 @@@ extern struct resource * __devm_request
                                struct resource *parent, resource_size_t start,
                                resource_size_t n, const char *name);
  
 -#define devm_release_region(start,n) \
 +#define devm_release_region(dev, start, n) \
        __devm_release_region(dev, &ioport_resource, (start), (n))
 -#define devm_release_mem_region(start,n) \
 +#define devm_release_mem_region(dev, start, n) \
        __devm_release_region(dev, &iomem_resource, (start), (n))
  
  extern void __devm_release_region(struct device *dev, struct resource *parent,