14baa9922SRussell King #ifndef _ASMARM_UCONTEXT_H 24baa9922SRussell King #define _ASMARM_UCONTEXT_H 34baa9922SRussell King 44baa9922SRussell King #include <asm/fpstate.h> 54baa9922SRussell King 64baa9922SRussell King /* 74baa9922SRussell King * struct sigcontext only has room for the basic registers, but struct 84baa9922SRussell King * ucontext now has room for all registers which need to be saved and 94baa9922SRussell King * restored. Coprocessor registers are stored in uc_regspace. Each 104baa9922SRussell King * coprocessor's saved state should start with a documented 32-bit magic 114baa9922SRussell King * number, followed by a 32-bit word giving the coproccesor's saved size. 124baa9922SRussell King * uc_regspace may be expanded if necessary, although this takes some 134baa9922SRussell King * coordination with glibc. 144baa9922SRussell King */ 154baa9922SRussell King 164baa9922SRussell King struct ucontext { 174baa9922SRussell King unsigned long uc_flags; 184baa9922SRussell King struct ucontext *uc_link; 194baa9922SRussell King stack_t uc_stack; 204baa9922SRussell King struct sigcontext uc_mcontext; 214baa9922SRussell King sigset_t uc_sigmask; 224baa9922SRussell King /* Allow for uc_sigmask growth. Glibc uses a 1024-bit sigset_t. */ 234baa9922SRussell King int __unused[32 - (sizeof (sigset_t) / sizeof (int))]; 244baa9922SRussell King /* Last for extensibility. Eight byte aligned because some 254baa9922SRussell King coprocessors require eight byte alignment. */ 264baa9922SRussell King unsigned long uc_regspace[128] __attribute__((__aligned__(8))); 274baa9922SRussell King }; 284baa9922SRussell King 294baa9922SRussell King #ifdef __KERNEL__ 304baa9922SRussell King 314baa9922SRussell King /* 324baa9922SRussell King * Coprocessor save state. The magic values and specific 334baa9922SRussell King * coprocessor's layouts are part of the userspace ABI. Each one of 344baa9922SRussell King * these should be a multiple of eight bytes and aligned to eight 354baa9922SRussell King * bytes, to prevent unpredictable padding in the signal frame. 364baa9922SRussell King */ 374baa9922SRussell King 384baa9922SRussell King #ifdef CONFIG_CRUNCH 394baa9922SRussell King #define CRUNCH_MAGIC 0x5065cf03 404baa9922SRussell King #define CRUNCH_STORAGE_SIZE (CRUNCH_SIZE + 8) 414baa9922SRussell King 424baa9922SRussell King struct crunch_sigframe { 434baa9922SRussell King unsigned long magic; 444baa9922SRussell King unsigned long size; 454baa9922SRussell King struct crunch_state storage; 464baa9922SRussell King } __attribute__((__aligned__(8))); 474baa9922SRussell King #endif 484baa9922SRussell King 494baa9922SRussell King #ifdef CONFIG_IWMMXT 504baa9922SRussell King /* iwmmxt_area is 0x98 bytes long, preceeded by 8 bytes of signature */ 514baa9922SRussell King #define IWMMXT_MAGIC 0x12ef842a 524baa9922SRussell King #define IWMMXT_STORAGE_SIZE (IWMMXT_SIZE + 8) 534baa9922SRussell King 544baa9922SRussell King struct iwmmxt_sigframe { 554baa9922SRussell King unsigned long magic; 564baa9922SRussell King unsigned long size; 574baa9922SRussell King struct iwmmxt_struct storage; 584baa9922SRussell King } __attribute__((__aligned__(8))); 594baa9922SRussell King #endif /* CONFIG_IWMMXT */ 604baa9922SRussell King 614baa9922SRussell King #ifdef CONFIG_VFP 624baa9922SRussell King #define VFP_MAGIC 0x56465001 634baa9922SRussell King 644baa9922SRussell King struct vfp_sigframe 654baa9922SRussell King { 664baa9922SRussell King unsigned long magic; 674baa9922SRussell King unsigned long size; 6882c6f5a5SImre Deak struct user_vfp ufp; 6982c6f5a5SImre Deak struct user_vfp_exc ufp_exc; 7082c6f5a5SImre Deak } __attribute__((__aligned__(8))); 7182c6f5a5SImre Deak 7282c6f5a5SImre Deak /* 7382c6f5a5SImre Deak * 8 byte for magic and size, 264 byte for ufp, 12 bytes for ufp_exc, 7482c6f5a5SImre Deak * 4 bytes padding. 7582c6f5a5SImre Deak */ 7682c6f5a5SImre Deak #define VFP_STORAGE_SIZE sizeof(struct vfp_sigframe) 7782c6f5a5SImre Deak 784baa9922SRussell King #endif /* CONFIG_VFP */ 794baa9922SRussell King 804baa9922SRussell King /* 814baa9922SRussell King * Auxiliary signal frame. This saves stuff like FP state. 824baa9922SRussell King * The layout of this structure is not part of the user ABI, 834baa9922SRussell King * because the config options aren't. uc_regspace is really 844baa9922SRussell King * one of these. 854baa9922SRussell King */ 864baa9922SRussell King struct aux_sigframe { 874baa9922SRussell King #ifdef CONFIG_CRUNCH 884baa9922SRussell King struct crunch_sigframe crunch; 894baa9922SRussell King #endif 904baa9922SRussell King #ifdef CONFIG_IWMMXT 914baa9922SRussell King struct iwmmxt_sigframe iwmmxt; 924baa9922SRussell King #endif 9382c6f5a5SImre Deak #ifdef CONFIG_VFP 944baa9922SRussell King struct vfp_sigframe vfp; 954baa9922SRussell King #endif 964baa9922SRussell King /* Something that isn't a valid magic number for any coprocessor. */ 974baa9922SRussell King unsigned long end_magic; 984baa9922SRussell King } __attribute__((__aligned__(8))); 994baa9922SRussell King 1004baa9922SRussell King #endif 1014baa9922SRussell King 1024baa9922SRussell King #endif /* !_ASMARM_UCONTEXT_H */ 103