Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/amd64/fpu.c
Show First 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | |||||
#include <machine/segments.h> | #include <machine/segments.h> | ||||
#include <machine/ucontext.h> | #include <machine/ucontext.h> | ||||
#include <x86/ifunc.h> | #include <x86/ifunc.h> | ||||
/* | /* | ||||
* Floating point support. | * Floating point support. | ||||
*/ | */ | ||||
#if defined(__GNUCLIKE_ASM) && !defined(lint) | |||||
#define fldcw(cw) __asm __volatile("fldcw %0" : : "m" (cw)) | #define fldcw(cw) __asm __volatile("fldcw %0" : : "m" (cw)) | ||||
#define fnclex() __asm __volatile("fnclex") | #define fnclex() __asm __volatile("fnclex") | ||||
#define fninit() __asm __volatile("fninit") | #define fninit() __asm __volatile("fninit") | ||||
#define fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr))) | #define fnstcw(addr) __asm __volatile("fnstcw %0" : "=m" (*(addr))) | ||||
#define fnstsw(addr) __asm __volatile("fnstsw %0" : "=am" (*(addr))) | #define fnstsw(addr) __asm __volatile("fnstsw %0" : "=am" (*(addr))) | ||||
#define fxrstor(addr) __asm __volatile("fxrstor %0" : : "m" (*(addr))) | #define fxrstor(addr) __asm __volatile("fxrstor %0" : : "m" (*(addr))) | ||||
#define fxsave(addr) __asm __volatile("fxsave %0" : "=m" (*(addr))) | #define fxsave(addr) __asm __volatile("fxsave %0" : "=m" (*(addr))) | ||||
#define ldmxcsr(csr) __asm __volatile("ldmxcsr %0" : : "m" (csr)) | #define ldmxcsr(csr) __asm __volatile("ldmxcsr %0" : : "m" (csr)) | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
uint32_t low, hi; | uint32_t low, hi; | ||||
low = mask; | low = mask; | ||||
hi = mask >> 32; | hi = mask >> 32; | ||||
__asm __volatile("xsaveopt64 %0" : "=m" (*addr) : "a" (low), "d" (hi) : | __asm __volatile("xsaveopt64 %0" : "=m" (*addr) : "a" (low), "d" (hi) : | ||||
"memory"); | "memory"); | ||||
} | } | ||||
#else /* !(__GNUCLIKE_ASM && !lint) */ | |||||
void fldcw(u_short cw); | |||||
void fnclex(void); | |||||
void fninit(void); | |||||
void fnstcw(caddr_t addr); | |||||
void fnstsw(caddr_t addr); | |||||
void fxsave(caddr_t addr); | |||||
void fxrstor(caddr_t addr); | |||||
void ldmxcsr(u_int csr); | |||||
void stmxcsr(u_int *csr); | |||||
void xrstor32(char *addr, uint64_t mask); | |||||
void xrstor64(char *addr, uint64_t mask); | |||||
void xsave32(char *addr, uint64_t mask); | |||||
void xsave64(char *addr, uint64_t mask); | |||||
void xsaveopt32(char *addr, uint64_t mask); | |||||
void xsaveopt64(char *addr, uint64_t mask); | |||||
#endif /* __GNUCLIKE_ASM && !lint */ | |||||
#define start_emulating() load_cr0(rcr0() | CR0_TS) | #define start_emulating() load_cr0(rcr0() | CR0_TS) | ||||
#define stop_emulating() clts() | #define stop_emulating() clts() | ||||
CTASSERT(sizeof(struct savefpu) == 512); | CTASSERT(sizeof(struct savefpu) == 512); | ||||
CTASSERT(sizeof(struct xstate_hdr) == 64); | CTASSERT(sizeof(struct xstate_hdr) == 64); | ||||
CTASSERT(sizeof(struct savefpu_ymm) == 832); | CTASSERT(sizeof(struct savefpu_ymm) == 832); | ||||
▲ Show 20 Lines • Show All 1,122 Lines • Show Last 20 Lines |