1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * arch/arm/include/asm/fpstate.h 4 * 5 * Copyright (C) 1995 Russell King 6 */ 7 8 #ifndef __ASM_ARM_FPSTATE_H 9 #define __ASM_ARM_FPSTATE_H 10 11 12 #ifndef __ASSEMBLY__ 13 14 /* 15 * VFP storage area has: 16 * - FPEXC, FPSCR, FPINST and FPINST2. 17 * - 16 or 32 double precision data registers 18 * - an implementation-dependent word of state for FLDMX/FSTMX (pre-ARMv6) 19 * 20 * FPEXC will always be non-zero once the VFP has been used in this process. 21 */ 22 23 struct vfp_hard_struct { 24 #ifdef CONFIG_VFPv3 25 __u64 fpregs[32]; 26 #else 27 __u64 fpregs[16]; 28 #endif 29 #if __LINUX_ARM_ARCH__ < 6 30 __u32 fpmx_state; 31 #endif 32 __u32 fpexc; 33 __u32 fpscr; 34 /* 35 * VFP implementation specific state 36 */ 37 __u32 fpinst; 38 __u32 fpinst2; 39 40 #ifdef CONFIG_SMP 41 __u32 cpu; 42 #endif 43 }; 44 45 union vfp_state { 46 struct vfp_hard_struct hard; 47 }; 48 49 extern void vfp_flush_thread(union vfp_state *); 50 extern void vfp_release_thread(union vfp_state *); 51 52 #define FP_HARD_SIZE 35 53 54 struct fp_hard_struct { 55 unsigned int save[FP_HARD_SIZE]; /* as yet undefined */ 56 }; 57 58 #define FP_SOFT_SIZE 35 59 60 struct fp_soft_struct { 61 unsigned int save[FP_SOFT_SIZE]; /* undefined information */ 62 }; 63 64 #define IWMMXT_SIZE 0x98 65 66 struct iwmmxt_struct { 67 unsigned int save[IWMMXT_SIZE / sizeof(unsigned int)]; 68 }; 69 70 union fp_state { 71 struct fp_hard_struct hard; 72 struct fp_soft_struct soft; 73 #ifdef CONFIG_IWMMXT 74 struct iwmmxt_struct iwmmxt; 75 #endif 76 }; 77 78 #define FP_SIZE (sizeof(union fp_state) / sizeof(int)) 79 80 #endif 81 82 #endif 83