fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / asm-arm / fpstate.h
index 785749b..f31cda5 100644 (file)
 #ifndef __ASM_ARM_FPSTATE_H
 #define __ASM_ARM_FPSTATE_H
 
-#define FP_SIZE 35
+
+#ifndef __ASSEMBLY__
+
+/*
+ * VFP storage area has:
+ *  - FPEXC, FPSCR, FPINST and FPINST2.
+ *  - 16 double precision data registers
+ *  - an implementation-dependant word of state for FLDMX/FSTMX
+ * 
+ *  FPEXC will always be non-zero once the VFP has been used in this process.
+ */
+
+struct vfp_hard_struct {
+       __u64 fpregs[16];
+#if __LINUX_ARM_ARCH__ < 6
+       __u32 fpmx_state;
+#endif
+       __u32 fpexc;
+       __u32 fpscr;
+       /*
+        * VFP implementation specific state
+        */
+       __u32 fpinst;
+       __u32 fpinst2;
+#ifdef CONFIG_SMP
+       __u32 cpu;
+#endif
+};
+
+union vfp_state {
+       struct vfp_hard_struct  hard;
+};
+
+extern void vfp_flush_thread(union vfp_state *);
+extern void vfp_release_thread(union vfp_state *);
+
+#define FP_HARD_SIZE 35
 
 struct fp_hard_struct {
-       unsigned int save[FP_SIZE];             /* as yet undefined */
+       unsigned int save[FP_HARD_SIZE];                /* as yet undefined */
 };
 
+#define FP_SOFT_SIZE 35
+
 struct fp_soft_struct {
-       unsigned int save[FP_SIZE];             /* undefined information */
+       unsigned int save[FP_SOFT_SIZE];                /* undefined information */
+};
+
+#define IWMMXT_SIZE    0x98
+
+struct iwmmxt_struct {
+       unsigned int save[IWMMXT_SIZE / sizeof(unsigned int)];
 };
 
 union fp_state {
        struct fp_hard_struct   hard;
        struct fp_soft_struct   soft;
+#ifdef CONFIG_IWMMXT
+       struct iwmmxt_struct    iwmmxt;
+#endif
 };
 
+#define FP_SIZE (sizeof(union fp_state) / sizeof(int))
+
+struct crunch_state {
+       unsigned int    mvdx[16][2];
+       unsigned int    mvax[4][3];
+       unsigned int    dspsc[2];
+};
+
+#define CRUNCH_SIZE    sizeof(struct crunch_state)
+
+#endif
+
 #endif