Author: jkim
Date: Thu Feb 23 21:44:44 2012
New Revision: 232076
URL: http://svn.freebsd.org/changeset/base/232076

Log:
  MFC:  r230830
  
  Restore XCR0 before restoring extended FPU states.

Modified:
  stable/9/sys/amd64/acpica/acpi_switch.S
  stable/9/sys/amd64/acpica/acpi_wakecode.S
  stable/9/sys/amd64/acpica/acpi_wakeup.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/amd64/acpica/acpi_switch.S
==============================================================================
--- stable/9/sys/amd64/acpica/acpi_switch.S     Thu Feb 23 21:42:41 2012        
(r232075)
+++ stable/9/sys/amd64/acpica/acpi_switch.S     Thu Feb 23 21:44:44 2012        
(r232076)
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 2001 Takanori Watanabe <takaw...@jp.freebsd.org>
  * Copyright (c) 2001 Mitsuru IWASAKI <iwas...@jp.freebsd.org>
- * Copyright (c) 2008-2010 Jung-uk Kim <j...@freebsd.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <j...@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -95,7 +95,6 @@ ENTRY(acpi_restorecpu)
 
        /* Restore CR0 except for FPU mode. */
        movq    PCB_CR0(%rdi), %rax
-       movq    %rax, %rcx
        andq    $~(CR0_EM | CR0_TS), %rax
        movq    %rax, %cr0
 
@@ -146,21 +145,26 @@ ENTRY(acpi_restorecpu)
 
        /* Restore FPU state. */
        fninit
-       movq    WAKEUP_CTX(fpusave),%rdi
-       cmpl    $0,use_xsave
-       jne     1f
-       fxrstor (%rdi)
+       movq    WAKEUP_CTX(xsmask), %rax
+       testq   %rax, %rax
+       jz      1f
+       movq    %rax, %rdx
+       shrq    $32, %rdx
+       movl    $XCR0, %ecx
+/*     xsetbv  */
+       .byte   0x0f, 0x01, 0xd1
+       movq    WAKEUP_CTX(fpusave), %rcx
+/*     xrstor  (%rcx) */
+       .byte   0x0f, 0xae, 0x29
        jmp     2f
-1:     movl    xsave_mask,%eax
-       movl    xsave_mask+4,%edx
-/*     xrstor  (%rdi) */
-       .byte   0x0f,0xae,0x2f
+1:
+       movq    WAKEUP_CTX(fpusave), %rcx
+       fxrstor (%rcx)
 2:
 
        /* Reload CR0. */
-       movq    %rcx, %cr0
-
-       movq    WAKEUP_CTX(pcb),%rdi
+       movq    PCB_CR0(%rdi), %rax
+       movq    %rax, %cr0
 
        /* Restore return address. */
        movq    PCB_RIP(%rdi), %rax

Modified: stable/9/sys/amd64/acpica/acpi_wakecode.S
==============================================================================
--- stable/9/sys/amd64/acpica/acpi_wakecode.S   Thu Feb 23 21:42:41 2012        
(r232075)
+++ stable/9/sys/amd64/acpica/acpi_wakecode.S   Thu Feb 23 21:44:44 2012        
(r232076)
@@ -2,7 +2,7 @@
  * Copyright (c) 2001 Takanori Watanabe <takaw...@jp.freebsd.org>
  * Copyright (c) 2001 Mitsuru IWASAKI <iwas...@jp.freebsd.org>
  * Copyright (c) 2003 Peter Wemm
- * Copyright (c) 2008-2010 Jung-uk Kim <j...@freebsd.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <j...@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -284,6 +284,8 @@ wakeup_cstar:
        .quad   0
 wakeup_sfmask:
        .quad   0
+wakeup_xsmask:
+       .quad   0
 wakeup_cpu:
        .long   0
 dummy:

Modified: stable/9/sys/amd64/acpica/acpi_wakeup.c
==============================================================================
--- stable/9/sys/amd64/acpica/acpi_wakeup.c     Thu Feb 23 21:42:41 2012        
(r232075)
+++ stable/9/sys/amd64/acpica/acpi_wakeup.c     Thu Feb 23 21:44:44 2012        
(r232076)
@@ -2,7 +2,7 @@
  * Copyright (c) 2001 Takanori Watanabe <takaw...@jp.freebsd.org>
  * Copyright (c) 2001 Mitsuru IWASAKI <iwas...@jp.freebsd.org>
  * Copyright (c) 2003 Peter Wemm
- * Copyright (c) 2008-2010 Jung-uk Kim <j...@freebsd.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <j...@freebsd.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -386,6 +386,7 @@ acpi_install_wakeup_handler(struct acpi_
        WAKECODE_FIXUP(wakeup_lstar, uint64_t, rdmsr(MSR_LSTAR));
        WAKECODE_FIXUP(wakeup_cstar, uint64_t, rdmsr(MSR_CSTAR));
        WAKECODE_FIXUP(wakeup_sfmask, uint64_t, rdmsr(MSR_SF_MASK));
+       WAKECODE_FIXUP(wakeup_xsmask, uint64_t, xsave_mask);
 
        /* Build temporary page tables below realmode code. */
        pt4 = wakeaddr;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to