Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Feb 2012 21:44:44 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r232076 - stable/9/sys/amd64/acpica
Message-ID:  <201202232144.q1NLiiiL024491@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@jp.freebsd.org>
  * Copyright (c) 2001 Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
- * Copyright (c) 2008-2010 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <jkim@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@jp.freebsd.org>
  * Copyright (c) 2001 Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
  * Copyright (c) 2003 Peter Wemm
- * Copyright (c) 2008-2010 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <jkim@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@jp.freebsd.org>
  * Copyright (c) 2001 Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
  * Copyright (c) 2003 Peter Wemm
- * Copyright (c) 2008-2010 Jung-uk Kim <jkim@FreeBSD.org>
+ * Copyright (c) 2008-2012 Jung-uk Kim <jkim@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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202232144.q1NLiiiL024491>