From 17a7526fa25ffc815c2dbe0f27acba61eaa8a587 Mon Sep 17 00:00:00 2001 From: jkim Date: Mon, 10 Mar 2014 20:47:24 +0000 Subject: [PATCH] MFC: r262746, r262748, r262750, r262752 Move fpusave() wrapper for suspend hander to sys/amd64/amd64/fpu.c. git-svn-id: svn://svn.freebsd.org/base/stable/8@262981 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/amd64/acpica/acpi_wakeup.c | 2 +- sys/amd64/amd64/cpu_switch.S | 17 ++--------------- sys/amd64/amd64/fpu.c | 11 +++++++++++ sys/amd64/amd64/mp_machdep.c | 2 +- sys/amd64/include/fpu.h | 1 + sys/amd64/include/md_var.h | 1 - 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/amd64/acpica/acpi_wakeup.c index b4cecd098..043c5e2fe 100644 --- a/sys/amd64/acpica/acpi_wakeup.c +++ b/sys/amd64/acpica/acpi_wakeup.c @@ -247,7 +247,7 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state) load_cr3(KPML4phys); if (savectx(susppcbs[0])) { - ctx_fpusave(suspfpusave[0]); + fpususpend(suspfpusave[0]); #ifdef SMP if (wakeup_cpus != 0 && suspend_cpus(wakeup_cpus) == 0) { device_printf(sc->acpi_dev, diff --git a/sys/amd64/amd64/cpu_switch.S b/sys/amd64/amd64/cpu_switch.S index 6f694830c..695e6e1a1 100644 --- a/sys/amd64/amd64/cpu_switch.S +++ b/sys/amd64/amd64/cpu_switch.S @@ -326,8 +326,8 @@ ENTRY(savectx) movq %r14,PCB_R14(%rdi) movq %r15,PCB_R15(%rdi) - movq %cr0,%rsi - movq %rsi,PCB_CR0(%rdi) + movq %cr0,%rax + movq %rax,PCB_CR0(%rdi) movq %cr2,%rax movq %rax,PCB_CR2(%rdi) movq %cr3,%rax @@ -366,19 +366,6 @@ ENTRY(savectx) sldt PCB_LDT(%rdi) str PCB_TR(%rdi) -2: movq %rsi,%cr0 /* The previous %cr0 is saved in %rsi. */ - movl $1,%eax ret END(savectx) - -/* - * Wrapper around fpusave to care about TS0_CR. - */ -ENTRY(ctx_fpusave) - movq %cr0,%rsi - clts - call fpusave - movq %rsi,%cr0 - ret -END(ctx_fpusave) diff --git a/sys/amd64/amd64/fpu.c b/sys/amd64/amd64/fpu.c index 001ef5ca6..a99ff7e92 100644 --- a/sys/amd64/amd64/fpu.c +++ b/sys/amd64/amd64/fpu.c @@ -179,6 +179,17 @@ fpurestore(void *addr) fxrstor((char *)addr); } +void +fpususpend(void *addr) +{ + u_long cr0; + + cr0 = rcr0(); + stop_emulating(); + fpusave(addr); + load_cr0(cr0); +} + /* * Enable XSAVE if supported and allowed by user. * Calculate the xsave_mask. diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index ce66f3e75..36a9fc04a 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -1352,7 +1352,7 @@ cpususpend_handler(void) cr3 = rcr3(); if (savectx(susppcbs[cpu])) { - ctx_fpusave(suspfpusave[cpu]); + fpususpend(suspfpusave[cpu]); wbinvd(); atomic_set_int(&stopped_cpus, cpumask); } else { diff --git a/sys/amd64/include/fpu.h b/sys/amd64/include/fpu.h index d20878993..448452362 100644 --- a/sys/amd64/include/fpu.h +++ b/sys/amd64/include/fpu.h @@ -145,6 +145,7 @@ int fpusetregs(struct thread *td, struct savefpu *addr, char *xfpustate, size_t xfpustate_size); int fpusetxstate(struct thread *td, char *xfpustate, size_t xfpustate_size); +void fpususpend(void *addr); int fputrap(void); void fpuuserinited(struct thread *td); struct fpu_kern_ctx *fpu_kern_alloc_ctx(u_int flags); diff --git a/sys/amd64/include/md_var.h b/sys/amd64/include/md_var.h index ff322bb45..123ed5115 100644 --- a/sys/amd64/include/md_var.h +++ b/sys/amd64/include/md_var.h @@ -85,7 +85,6 @@ void *alloc_fpusave(int flags); void amd64_syscall(struct thread *td, int traced); void busdma_swi(void); void cpu_setregs(void); -void ctx_fpusave(void *); void doreti_iret(void) __asm(__STRING(doreti_iret)); void doreti_iret_fault(void) __asm(__STRING(doreti_iret_fault)); void ld_ds(void) __asm(__STRING(ld_ds)); -- 2.45.0