- Restore XCR0 before restoring extended FPU states.

- Update my copyright dates.

Reviewed by:	kib
This commit is contained in:
Jung-uk Kim 2012-01-31 17:51:30 +00:00
parent d38d1fbc53
commit db25e24c2f
3 changed files with 22 additions and 15 deletions

View File

@ -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

View File

@ -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:

View File

@ -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_softc *sc)
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;