xref: /freebsd/sys/arm64/include/vfp.h (revision 332c426328dbb30a6b2e69d9b1e8298d77d85bd1)
1e5acd89cSAndrew Turner /*-
2e5acd89cSAndrew Turner  * Copyright (c) 2015 The FreeBSD Foundation
3e5acd89cSAndrew Turner  *
4e5acd89cSAndrew Turner  * This software was developed by Andrew Turner under
5e5acd89cSAndrew Turner  * sponsorship from the FreeBSD Foundation.
6e5acd89cSAndrew Turner  *
7e5acd89cSAndrew Turner  * Redistribution and use in source and binary forms, with or without
8e5acd89cSAndrew Turner  * modification, are permitted provided that the following conditions
9e5acd89cSAndrew Turner  * are met:
10e5acd89cSAndrew Turner  * 1. Redistributions of source code must retain the above copyright
11e5acd89cSAndrew Turner  *    notice, this list of conditions and the following disclaimer.
12e5acd89cSAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright
13e5acd89cSAndrew Turner  *    notice, this list of conditions and the following disclaimer in the
14e5acd89cSAndrew Turner  *    documentation and/or other materials provided with the distribution.
15e5acd89cSAndrew Turner  *
16e5acd89cSAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17e5acd89cSAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18e5acd89cSAndrew Turner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19e5acd89cSAndrew Turner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20e5acd89cSAndrew Turner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21e5acd89cSAndrew Turner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22e5acd89cSAndrew Turner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23e5acd89cSAndrew Turner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24e5acd89cSAndrew Turner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25e5acd89cSAndrew Turner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26e5acd89cSAndrew Turner  * SUCH DAMAGE.
27e5acd89cSAndrew Turner  */
28e5acd89cSAndrew Turner 
29d5d97bedSMike Karels #ifdef __arm__
30d5d97bedSMike Karels #include <arm/vfp.h>
31d5d97bedSMike Karels #else /* !__arm__ */
32d5d97bedSMike Karels 
33e5acd89cSAndrew Turner #ifndef _MACHINE_VFP_H_
34e5acd89cSAndrew Turner #define	_MACHINE_VFP_H_
35e5acd89cSAndrew Turner 
3665618fddSMichal Meloun /* VFPCR */
3765618fddSMichal Meloun #define	VFPCR_AHP		(0x04000000)	/* alt. half-precision: */
3865618fddSMichal Meloun #define	VFPCR_DN		(0x02000000)	/* default NaN enable */
3965618fddSMichal Meloun #define	VFPCR_FZ		(0x01000000)	/* flush to zero enabled */
40fd860aceSAndrew Turner #define	VFPCR_INIT		0		/* Default fpcr after exec */
4165618fddSMichal Meloun 
4265618fddSMichal Meloun #define	VFPCR_RMODE_OFF		22		/* rounding mode offset */
4365618fddSMichal Meloun #define	VFPCR_RMODE_MASK	(0x00c00000)	/* rounding mode mask */
4465618fddSMichal Meloun #define	VFPCR_RMODE_RN		(0x00000000)	/* round nearest */
4565618fddSMichal Meloun #define	VFPCR_RMODE_RPI		(0x00400000)	/* round to plus infinity */
4665618fddSMichal Meloun #define	VFPCR_RMODE_RNI		(0x00800000)	/* round to neg infinity */
4765618fddSMichal Meloun #define	VFPCR_RMODE_RM		(0x00c00000)	/* round to zero */
4865618fddSMichal Meloun 
4965618fddSMichal Meloun #define	VFPCR_STRIDE_OFF	20		/* vector stride -1 */
5065618fddSMichal Meloun #define	VFPCR_STRIDE_MASK	(0x00300000)
5165618fddSMichal Meloun #define	VFPCR_LEN_OFF		16		/* vector length -1 */
5265618fddSMichal Meloun #define	VFPCR_LEN_MASK		(0x00070000)
5365618fddSMichal Meloun #define	VFPCR_IDE		(0x00008000)	/* input subnormal exc enable */
5465618fddSMichal Meloun #define	VFPCR_IXE		(0x00001000)	/* inexact exception enable */
5565618fddSMichal Meloun #define	VFPCR_UFE		(0x00000800)	/* underflow exception enable */
5665618fddSMichal Meloun #define	VFPCR_OFE		(0x00000400)	/* overflow exception enable */
5765618fddSMichal Meloun #define	VFPCR_DZE		(0x00000200)	/* div by zero exception en */
5865618fddSMichal Meloun #define	VFPCR_IOE		(0x00000100)	/* invalid op exec enable */
5965618fddSMichal Meloun 
60e5acd89cSAndrew Turner #ifndef LOCORE
618ff00301SAndrew Turner struct vfpstate {
628ff00301SAndrew Turner 	__uint128_t	vfp_regs[32];
638ff00301SAndrew Turner 	uint32_t	vfp_fpcr;
648ff00301SAndrew Turner 	uint32_t	vfp_fpsr;
658ff00301SAndrew Turner };
668ff00301SAndrew Turner 
67d88a17ddSAndrew Turner #ifdef _KERNEL
6852453d22SAndrew Turner struct pcb;
69400c0119SAndrew Turner struct thread;
7052453d22SAndrew Turner 
71df0d0fc9SAndrew Turner void	vfp_init_secondary(void);
72255adf35SAndrew Turner void	vfp_enable(void);
73255adf35SAndrew Turner void	vfp_disable(void);
74e5acd89cSAndrew Turner void	vfp_discard(struct thread *);
75255adf35SAndrew Turner void	vfp_store(struct vfpstate *);
76255adf35SAndrew Turner void	vfp_restore(struct vfpstate *);
77baf8f20aSAndrew Turner void	vfp_new_thread(struct thread *, struct thread *, bool);
78953a7d7cSAlex Richardson void	vfp_reset_state(struct thread *, struct pcb *);
79e5acd89cSAndrew Turner void	vfp_restore_state(void);
80f692e325SAndrew Turner void	vfp_save_state(struct thread *, struct pcb *);
8112257233SAndrew Turner void	vfp_save_state_savectx(struct pcb *);
82a30149b2SAndrew Turner void	vfp_save_state_switch(struct thread *);
83*332c4263SAndrew Turner void	vfp_to_sve_sync(struct thread *);
84*332c4263SAndrew Turner void	sve_to_vfp_sync(struct thread *);
85*332c4263SAndrew Turner 
86*332c4263SAndrew Turner size_t	sve_max_buf_size(void);
87*332c4263SAndrew Turner size_t	sve_buf_size(struct thread *);
88*332c4263SAndrew Turner bool	sve_restore_state(struct thread *);
896ed982a2SAndrew Turner 
906ed982a2SAndrew Turner struct fpu_kern_ctx;
916ed982a2SAndrew Turner 
926ed982a2SAndrew Turner /*
936ed982a2SAndrew Turner  * Flags for fpu_kern_alloc_ctx(), fpu_kern_enter() and fpu_kern_thread().
946ed982a2SAndrew Turner  */
956ed982a2SAndrew Turner #define	FPU_KERN_NORMAL	0x0000
966ed982a2SAndrew Turner #define	FPU_KERN_NOWAIT	0x0001
976ed982a2SAndrew Turner #define	FPU_KERN_KTHR	0x0002
98a2d16bc5SAndrew Turner #define	FPU_KERN_NOCTX	0x0004
996ed982a2SAndrew Turner 
1006ed982a2SAndrew Turner struct fpu_kern_ctx *fpu_kern_alloc_ctx(u_int);
1016ed982a2SAndrew Turner void fpu_kern_free_ctx(struct fpu_kern_ctx *);
102849ce31aSConrad Meyer void fpu_kern_enter(struct thread *, struct fpu_kern_ctx *, u_int);
1036ed982a2SAndrew Turner int fpu_kern_leave(struct thread *, struct fpu_kern_ctx *);
1046ed982a2SAndrew Turner int fpu_kern_thread(u_int);
1056ed982a2SAndrew Turner int is_fpu_kern_thread(u_int);
1066ed982a2SAndrew Turner 
107df0d0fc9SAndrew Turner struct vfpstate *fpu_save_area_alloc(void);
108df0d0fc9SAndrew Turner void fpu_save_area_free(struct vfpstate *fsa);
109df0d0fc9SAndrew Turner void fpu_save_area_reset(struct vfpstate *fsa);
110df0d0fc9SAndrew Turner 
1118c9c3144SOlivier Houchard /* Convert to and from Aarch32 FPSCR to Aarch64 FPCR/FPSR */
1128c9c3144SOlivier Houchard #define VFP_FPSCR_FROM_SRCR(vpsr, vpcr) ((vpsr) | ((vpcr) & 0x7c00000))
1138c9c3144SOlivier Houchard #define VFP_FPSR_FROM_FPSCR(vpscr) ((vpscr) &~ 0x7c00000)
1148c9c3144SOlivier Houchard #define VFP_FPCR_FROM_FPSCR(vpsrc) ((vpsrc) & 0x7c00000)
1158c9c3144SOlivier Houchard 
116add00c38SJohn Baldwin #ifdef COMPAT_FREEBSD32
117add00c38SJohn Baldwin void get_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp);
118add00c38SJohn Baldwin void set_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp);
119add00c38SJohn Baldwin #endif
120add00c38SJohn Baldwin 
121e5acd89cSAndrew Turner #endif
122e5acd89cSAndrew Turner 
123e5acd89cSAndrew Turner #endif
124e5acd89cSAndrew Turner 
125e5acd89cSAndrew Turner #endif /* !_MACHINE_VFP_H_ */
126d5d97bedSMike Karels 
127d5d97bedSMike Karels #endif /* !__arm__ */
128