svn commit: r232076 - stable/9/sys/amd64/acpica
Jung-uk Kim
jkim at FreeBSD.org
Thu Feb 23 21:44:44 UTC 2012
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 <takawata at jp.freebsd.org>
* Copyright (c) 2001 Mitsuru IWASAKI <iwasaki at jp.freebsd.org>
- * Copyright (c) 2008-2010 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <jkim at 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 <takawata at jp.freebsd.org>
* Copyright (c) 2001 Mitsuru IWASAKI <iwasaki at jp.freebsd.org>
* Copyright (c) 2003 Peter Wemm
- * Copyright (c) 2008-2010 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <jkim at 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 <takawata at jp.freebsd.org>
* Copyright (c) 2001 Mitsuru IWASAKI <iwasaki at jp.freebsd.org>
* Copyright (c) 2003 Peter Wemm
- * Copyright (c) 2008-2010 Jung-uk Kim <jkim at FreeBSD.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <jkim at 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;
More information about the svn-src-stable-9
mailing list