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 <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: 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 <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: 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 <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-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"