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 #define FP_HARD_SIZE 35 50 51 struct fp_hard_struct { 52 unsigned int save[FP_HARD_SIZE]; /* as yet undefined */ 53 }; 54 55 #define FP_SOFT_SIZE 35 56 57 struct fp_soft_struct { 58 unsigned int save[FP_SOFT_SIZE]; /* undefined information */ 59 }; 60 61 #define IWMMXT_SIZE 0x98 62 63 struct iwmmxt_struct { 64 unsigned int save[IWMMXT_SIZE / sizeof(unsigned int)]; 65 }; 66 67 union fp_state { 68 struct fp_hard_struct hard; 69 struct fp_soft_struct soft; 70 #ifdef CONFIG_IWMMXT 71 struct iwmmxt_struct iwmmxt; 72 #endif 73 }; 74 75 #define FP_SIZE (sizeof(union fp_state) / sizeof(int)) 76 77 #endif 78 79 #endif 80