Move fpusave() wrapper for suspend hander to sys/amd64/amd64/fpu.c.
Inspired by: jhb
This commit is contained in:
parent
be2d4fcf68
commit
1d22d877b8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=262752
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user