]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/x86/power/cpu_32.c
Merge branch 'x86/cpu' into x86/xsave
[linux-2.6-omap-h63xx.git] / arch / x86 / power / cpu_32.c
index 7dc5d5cf50a2c85c2cad15c84f5e455abd42a34e..274d06082f4851bfcf71c621f7a62db447e54876 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/suspend.h>
 #include <asm/mtrr.h>
 #include <asm/mce.h>
+#include <asm/xcr.h>
 
 static struct saved_context saved_context;
 
@@ -45,7 +46,7 @@ static void __save_processor_state(struct saved_context *ctxt)
        ctxt->cr0 = read_cr0();
        ctxt->cr2 = read_cr2();
        ctxt->cr3 = read_cr3();
-       ctxt->cr4 = read_cr4();
+       ctxt->cr4 = read_cr4_safe();
 }
 
 /* Needed by apm.c */
@@ -98,7 +99,9 @@ static void __restore_processor_state(struct saved_context *ctxt)
        /*
         * control registers
         */
-       write_cr4(ctxt->cr4);
+       /* cr4 was introduced in the Pentium CPU */
+       if (ctxt->cr4)
+               write_cr4(ctxt->cr4);
        write_cr3(ctxt->cr3);
        write_cr2(ctxt->cr2);
        write_cr0(ctxt->cr0);
@@ -124,6 +127,12 @@ static void __restore_processor_state(struct saved_context *ctxt)
        if (boot_cpu_has(X86_FEATURE_SEP))
                enable_sep_cpu();
 
+       /*
+        * restore XCR0 for xsave capable cpu's.
+        */
+       if (cpu_has_xsave)
+               xsetbv(XCR_XFEATURE_ENABLED_MASK, pcntxt_mask);
+
        fix_processor_context();
        do_fpu_end();
        mtrr_ap_init();