

/*
 * 287/387 NPX Coprocessor Data Structures and Constants
 * W. Jolitz 1/90
 */

#ifndef _MACHINE_NPX_H_
#define	_MACHINE_NPX_H_

#include <x86/fpu.h>

#ifdef _KERNEL

struct fpu_kern_ctx;

#define	PCB_USER_FPU(pcb) (((pcb)->pcb_flags & PCB_KERNNPX) == 0)

#define	XSAVE_AREA_ALIGN	64

int	npxdna(void);
void	npxdrop(void);
void	npxexit(struct thread *td);
int	npxformat(void);
int	npxgetregs(struct thread *td);
void	npxinit(bool bsp);
void	npxresume(union savefpu *addr);
void	npxsave(union savefpu *addr);
int	npxsetregs(struct thread *td, union savefpu *addr,
	    char *xfpustate, size_t xfpustate_size);
int	npxsetxstate(struct thread *td, char *xfpustate,
	    size_t xfpustate_size);
void	npxsuspend(union savefpu *addr);
int	npxtrap_x87(void);
int	npxtrap_sse(void);
void	npxuserinited(struct thread *);
struct fpu_kern_ctx *fpu_kern_alloc_ctx(u_int flags);
void	fpu_kern_free_ctx(struct fpu_kern_ctx *ctx);
int	fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx,
	    u_int flags);
int	fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx);
int	fpu_kern_thread(u_int flags);
int	is_fpu_kern_thread(u_int flags);

union savefpu	*fpu_save_area_alloc(void);
void	fpu_save_area_free(union savefpu *fsa);
void	fpu_save_area_reset(union savefpu *fsa);

/*
 * Flags for fpu_kern_alloc_ctx(), fpu_kern_enter() and fpu_kern_thread().
 */
#define	FPU_KERN_NORMAL	0x0000
#define	FPU_KERN_NOWAIT	0x0001
#define	FPU_KERN_KTHR	0x0002

#endif

#endif /* !_MACHINE_NPX_H_ */
