Move fpusave() wrapper for suspend hander to sys/amd64/amd64/fpu.c.

Inspired by:	jhb
This commit is contained in:
Jung-uk Kim 2014-03-04 21:35:57 +00:00
parent be2d4fcf68
commit 1d22d877b8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=262752
6 changed files with 14 additions and 16 deletions

View File

@ -546,16 +546,3 @@ ENTRY(resumectx)
xorl %eax,%eax
ret
END(resumectx)
/*
* Wrapper around fpusave to care about CR0_TS.
*/
ENTRY(ctx_fpusave)
movq %cr0,%rax
pushq %rax
clts
call fpusave
popq %rax
movq %rax,%cr0
ret
END(ctx_fpusave)

View File

@ -162,6 +162,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.

View File

@ -1464,7 +1464,7 @@ cpususpend_handler(void)
cpu = PCPU_GET(cpuid);
if (savectx(susppcbs[cpu])) {
ctx_fpusave(susppcbs[cpu]->pcb_fpususpend);
fpususpend(susppcbs[cpu]->pcb_fpususpend);
wbinvd();
CPU_SET_ATOMIC(cpu, &suspended_cpus);
} else {

View File

@ -63,6 +63,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_sse(void);
int fputrap_x87(void);
void fpuuserinited(struct thread *td);

View File

@ -89,7 +89,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));

View File

@ -202,7 +202,7 @@ acpi_sleep_machdep(struct acpi_softc *sc, int state)
if (savectx(susppcbs[0])) {
#ifdef __amd64__
ctx_fpusave(susppcbs[0]->pcb_fpususpend);
fpususpend(susppcbs[0]->pcb_fpususpend);
#endif
#ifdef SMP
if (!CPU_EMPTY(&suspcpus) && suspend_cpus(suspcpus) == 0) {