1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 24baa9922SRussell King /* 34baa9922SRussell King * arch/arm/include/asm/fpstate.h 44baa9922SRussell King * 54baa9922SRussell King * Copyright (C) 1995 Russell King 64baa9922SRussell King */ 74baa9922SRussell King 84baa9922SRussell King #ifndef __ASM_ARM_FPSTATE_H 94baa9922SRussell King #define __ASM_ARM_FPSTATE_H 104baa9922SRussell King 114baa9922SRussell King 124baa9922SRussell King #ifndef __ASSEMBLY__ 134baa9922SRussell King 144baa9922SRussell King /* 154baa9922SRussell King * VFP storage area has: 164baa9922SRussell King * - FPEXC, FPSCR, FPINST and FPINST2. 174baa9922SRussell King * - 16 or 32 double precision data registers 1825985edcSLucas De Marchi * - an implementation-dependent word of state for FLDMX/FSTMX (pre-ARMv6) 194baa9922SRussell King * 204baa9922SRussell King * FPEXC will always be non-zero once the VFP has been used in this process. 214baa9922SRussell King */ 224baa9922SRussell King 234baa9922SRussell King struct vfp_hard_struct { 244baa9922SRussell King #ifdef CONFIG_VFPv3 254baa9922SRussell King __u64 fpregs[32]; 264baa9922SRussell King #else 274baa9922SRussell King __u64 fpregs[16]; 284baa9922SRussell King #endif 294baa9922SRussell King #if __LINUX_ARM_ARCH__ < 6 304baa9922SRussell King __u32 fpmx_state; 314baa9922SRussell King #endif 324baa9922SRussell King __u32 fpexc; 334baa9922SRussell King __u32 fpscr; 344baa9922SRussell King /* 354baa9922SRussell King * VFP implementation specific state 364baa9922SRussell King */ 374baa9922SRussell King __u32 fpinst; 384baa9922SRussell King __u32 fpinst2; 394baa9922SRussell King 404baa9922SRussell King #ifdef CONFIG_SMP 414baa9922SRussell King __u32 cpu; 424baa9922SRussell King #endif 434baa9922SRussell King }; 444baa9922SRussell King 454baa9922SRussell King union vfp_state { 464baa9922SRussell King struct vfp_hard_struct hard; 474baa9922SRussell King }; 484baa9922SRussell King 494baa9922SRussell King #define FP_HARD_SIZE 35 504baa9922SRussell King 514baa9922SRussell King struct fp_hard_struct { 524baa9922SRussell King unsigned int save[FP_HARD_SIZE]; /* as yet undefined */ 534baa9922SRussell King }; 544baa9922SRussell King 554baa9922SRussell King #define FP_SOFT_SIZE 35 564baa9922SRussell King 574baa9922SRussell King struct fp_soft_struct { 584baa9922SRussell King unsigned int save[FP_SOFT_SIZE]; /* undefined information */ 594baa9922SRussell King }; 604baa9922SRussell King 614baa9922SRussell King #define IWMMXT_SIZE 0x98 624baa9922SRussell King 634baa9922SRussell King struct iwmmxt_struct { 644baa9922SRussell King unsigned int save[IWMMXT_SIZE / sizeof(unsigned int)]; 654baa9922SRussell King }; 664baa9922SRussell King 674baa9922SRussell King union fp_state { 684baa9922SRussell King struct fp_hard_struct hard; 694baa9922SRussell King struct fp_soft_struct soft; 704baa9922SRussell King #ifdef CONFIG_IWMMXT 714baa9922SRussell King struct iwmmxt_struct iwmmxt; 724baa9922SRussell King #endif 734baa9922SRussell King }; 744baa9922SRussell King 754baa9922SRussell King #define FP_SIZE (sizeof(union fp_state) / sizeof(int)) 764baa9922SRussell King 774baa9922SRussell King #endif 784baa9922SRussell King 794baa9922SRussell King #endif 80