Author: jkim
Date: Tue Jan 31 17:51:30 2012
New Revision: 230830
URL: http://svn.freebsd.org/changeset/base/230830

Log:
  - Restore XCR0 before restoring extended FPU states.
  - Update my copyright dates.
  
  Reviewed by:  kib

Modified:
  head/sys/amd64/acpica/acpi_switch.S
  head/sys/amd64/acpica/acpi_wakecode.S
  head/sys/amd64/acpica/acpi_wakeup.c

Modified: head/sys/amd64/acpica/acpi_switch.S
==============================================================================
--- head/sys/amd64/acpica/acpi_switch.S Tue Jan 31 17:24:08 2012        
(r230829)
+++ head/sys/amd64/acpica/acpi_switch.S Tue Jan 31 17:51:30 2012        
(r230830)
@@ -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: head/sys/amd64/acpica/acpi_wakecode.S
==============================================================================
--- head/sys/amd64/acpica/acpi_wakecode.S       Tue Jan 31 17:24:08 2012        
(r230829)
+++ head/sys/amd64/acpica/acpi_wakecode.S       Tue Jan 31 17:51:30 2012        
(r230830)
@@ -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: head/sys/amd64/acpica/acpi_wakeup.c
==============================================================================
--- head/sys/amd64/acpica/acpi_wakeup.c Tue Jan 31 17:24:08 2012        
(r230829)
+++ head/sys/amd64/acpica/acpi_wakeup.c Tue Jan 31 17:51:30 2012        
(r230830)
@@ -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-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to