1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 24baa9922SRussell King #ifndef _ASMARM_UCONTEXT_H 34baa9922SRussell King #define _ASMARM_UCONTEXT_H 44baa9922SRussell King 54baa9922SRussell King #include <asm/fpstate.h> 65c165953SNicolas Pitre #include <asm/user.h> 74baa9922SRussell King 84baa9922SRussell King /* 94baa9922SRussell King * struct sigcontext only has room for the basic registers, but struct 104baa9922SRussell King * ucontext now has room for all registers which need to be saved and 114baa9922SRussell King * restored. Coprocessor registers are stored in uc_regspace. Each 124baa9922SRussell King * coprocessor's saved state should start with a documented 32-bit magic 134baa9922SRussell King * number, followed by a 32-bit word giving the coproccesor's saved size. 144baa9922SRussell King * uc_regspace may be expanded if necessary, although this takes some 154baa9922SRussell King * coordination with glibc. 164baa9922SRussell King */ 174baa9922SRussell King 184baa9922SRussell King struct ucontext { 194baa9922SRussell King unsigned long uc_flags; 204baa9922SRussell King struct ucontext *uc_link; 214baa9922SRussell King stack_t uc_stack; 224baa9922SRussell King struct sigcontext uc_mcontext; 234baa9922SRussell King sigset_t uc_sigmask; 244baa9922SRussell King /* Allow for uc_sigmask growth. Glibc uses a 1024-bit sigset_t. */ 254baa9922SRussell King int __unused[32 - (sizeof (sigset_t) / sizeof (int))]; 264baa9922SRussell King /* Last for extensibility. Eight byte aligned because some 274baa9922SRussell King coprocessors require eight byte alignment. */ 284baa9922SRussell King unsigned long uc_regspace[128] __attribute__((__aligned__(8))); 294baa9922SRussell King }; 304baa9922SRussell King 314baa9922SRussell King #ifdef __KERNEL__ 324baa9922SRussell King 334baa9922SRussell King /* 344baa9922SRussell King * Coprocessor save state. The magic values and specific 354baa9922SRussell King * coprocessor's layouts are part of the userspace ABI. Each one of 364baa9922SRussell King * these should be a multiple of eight bytes and aligned to eight 374baa9922SRussell King * bytes, to prevent unpredictable padding in the signal frame. 384baa9922SRussell King */ 394baa9922SRussell King 40ce184a0dSDave Martin /* 41ce184a0dSDave Martin * Dummy padding block: if this magic is encountered, the block should 42ce184a0dSDave Martin * be skipped using the corresponding size field. 43ce184a0dSDave Martin */ 44ce184a0dSDave Martin #define DUMMY_MAGIC 0xb0d9ed01 45ce184a0dSDave Martin 464baa9922SRussell King #ifdef CONFIG_IWMMXT 4725985edcSLucas De Marchi /* iwmmxt_area is 0x98 bytes long, preceded by 8 bytes of signature */ 484baa9922SRussell King #define IWMMXT_MAGIC 0x12ef842a 494baa9922SRussell King #define IWMMXT_STORAGE_SIZE (IWMMXT_SIZE + 8) 504baa9922SRussell King 514baa9922SRussell King struct iwmmxt_sigframe { 524baa9922SRussell King unsigned long magic; 534baa9922SRussell King unsigned long size; 544baa9922SRussell King struct iwmmxt_struct storage; 554baa9922SRussell King } __attribute__((__aligned__(8))); 564baa9922SRussell King #endif /* CONFIG_IWMMXT */ 574baa9922SRussell King 584baa9922SRussell King #ifdef CONFIG_VFP 594baa9922SRussell King #define VFP_MAGIC 0x56465001 604baa9922SRussell King 614baa9922SRussell King struct vfp_sigframe 624baa9922SRussell King { 634baa9922SRussell King unsigned long magic; 644baa9922SRussell King unsigned long size; 6582c6f5a5SImre Deak struct user_vfp ufp; 6682c6f5a5SImre Deak struct user_vfp_exc ufp_exc; 6782c6f5a5SImre Deak } __attribute__((__aligned__(8))); 6882c6f5a5SImre Deak 6982c6f5a5SImre Deak /* 7082c6f5a5SImre Deak * 8 byte for magic and size, 264 byte for ufp, 12 bytes for ufp_exc, 7182c6f5a5SImre Deak * 4 bytes padding. 7282c6f5a5SImre Deak */ 7382c6f5a5SImre Deak #define VFP_STORAGE_SIZE sizeof(struct vfp_sigframe) 7482c6f5a5SImre Deak 754baa9922SRussell King #endif /* CONFIG_VFP */ 764baa9922SRussell King 774baa9922SRussell King /* 784baa9922SRussell King * Auxiliary signal frame. This saves stuff like FP state. 794baa9922SRussell King * The layout of this structure is not part of the user ABI, 804baa9922SRussell King * because the config options aren't. uc_regspace is really 814baa9922SRussell King * one of these. 824baa9922SRussell King */ 834baa9922SRussell King struct aux_sigframe { 844baa9922SRussell King #ifdef CONFIG_IWMMXT 854baa9922SRussell King struct iwmmxt_sigframe iwmmxt; 864baa9922SRussell King #endif 8782c6f5a5SImre Deak #ifdef CONFIG_VFP 884baa9922SRussell King struct vfp_sigframe vfp; 894baa9922SRussell King #endif 904baa9922SRussell King /* Something that isn't a valid magic number for any coprocessor. */ 914baa9922SRussell King unsigned long end_magic; 924baa9922SRussell King } __attribute__((__aligned__(8))); 934baa9922SRussell King 944baa9922SRussell King #endif 954baa9922SRussell King 964baa9922SRussell King #endif /* !_ASMARM_UCONTEXT_H */ 97