svn commit: r230830 - head/sys/amd64/acpica

Jung-uk Kim jkim at FreeBSD.org
Tue Jan 31 17:51:31 UTC 2012


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 <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: 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 <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: 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 <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-all mailing list