-typedef struct savearea {
-
-/* The following area corresponds to ppc_saved_state and ppc_thread_state */
-
-/* offset 0x0000 */
- unsigned int save_srr0;
- unsigned int save_srr1;
- unsigned int save_r0;
- unsigned int save_r1;
- unsigned int save_r2;
- unsigned int save_r3;
- unsigned int save_r4;
- unsigned int save_r5;
-
- unsigned int save_r6;
- unsigned int save_r7;
- unsigned int save_r8;
- unsigned int save_r9;
- unsigned int save_r10;
- unsigned int save_r11;
- unsigned int save_r12;
- unsigned int save_r13;
-
- unsigned int save_r14;
- unsigned int save_r15;
- unsigned int save_r16;
- unsigned int save_r17;
- unsigned int save_r18;
- unsigned int save_r19;
- unsigned int save_r20;
- unsigned int save_r21;
-
- unsigned int save_r22;
- unsigned int save_r23;
- unsigned int save_r24;
- unsigned int save_r25;
- unsigned int save_r26;
- unsigned int save_r27;
- unsigned int save_r28;
- unsigned int save_r29;
-
- unsigned int save_r30;
- unsigned int save_r31;
- unsigned int save_cr;
- unsigned int save_xer;
- unsigned int save_lr;
- unsigned int save_ctr;
- unsigned int save_mq;
- unsigned int save_vrsave;
-
- unsigned int save_sr_copyin;
- unsigned int save_space;
- unsigned int save_xfpscrpad;
- unsigned int save_xfpscr;
- unsigned int save_pad2[4];
-
-
-/* The following corresponds to ppc_exception_state */
-
-/* offset 0x00C0 */
- unsigned int save_dar;
- unsigned int save_dsisr;
- unsigned int save_exception;
- unsigned int save_pad3[5];
-
-/* The following corresponds to ppc_float_state */
-
-/* offset 0x00E0 */
- double save_fp0;
- double save_fp1;
- double save_fp2;
- double save_fp3;
-
- double save_fp4;
- double save_fp5;
- double save_fp6;
- double save_fp7;
-
- double save_fp8;
- double save_fp9;
- double save_fp10;
- double save_fp11;
-
- double save_fp12;
- double save_fp13;
- double save_fp14;
- double save_fp15;
-
- double save_fp16;
- double save_fp17;
- double save_fp18;
- double save_fp19;
-
- double save_fp20;
- double save_fp21;
- double save_fp22;
- double save_fp23;
-
- double save_fp24;
- double save_fp25;
- double save_fp26;
- double save_fp27;
-
- double save_fp28;
- double save_fp29;
- double save_fp30;
- double save_fp31;
-
- unsigned int save_fpscr_pad;
- unsigned int save_fpscr;
- unsigned int save_pad4[6];
-
-/* The following is the save area for the VMX registers */
-
-/* offset 0x0200 */
- unsigned int save_vr0[4];
- unsigned int save_vr1[4];
- unsigned int save_vr2[4];
- unsigned int save_vr3[4];
- unsigned int save_vr4[4];
- unsigned int save_vr5[4];
- unsigned int save_vr6[4];
- unsigned int save_vr7[4];
- unsigned int save_vr8[4];
- unsigned int save_vr9[4];
- unsigned int save_vr10[4];
- unsigned int save_vr11[4];
- unsigned int save_vr12[4];
- unsigned int save_vr13[4];
- unsigned int save_vr14[4];
- unsigned int save_vr15[4];
- unsigned int save_vr16[4];
- unsigned int save_vr17[4];
- unsigned int save_vr18[4];
- unsigned int save_vr19[4];
- unsigned int save_vr20[4];
- unsigned int save_vr21[4];
- unsigned int save_vr22[4];
- unsigned int save_vr23[4];
- unsigned int save_vr24[4];
- unsigned int save_vr25[4];
- unsigned int save_vr26[4];
- unsigned int save_vr27[4];
- unsigned int save_vr28[4];
- unsigned int save_vr29[4];
- unsigned int save_vr30[4];
- unsigned int save_vr31[4];
- unsigned int save_vscr[4]; /* Note that this is always valid if VMX has been used */
- unsigned int save_pad5[4]; /* Insures that vrvalid is on a cache line */
- unsigned int save_vrvalid; /* VRs that have been saved */
- unsigned int save_pad6[7];
-
-/* The following is the save area for the segment registers */
-
-/* offset 0x0440 */
-
- unsigned int save_sr0;
- unsigned int save_sr1;
- unsigned int save_sr2;
- unsigned int save_sr3;
- unsigned int save_sr4;
- unsigned int save_sr5;
- unsigned int save_sr6;
- unsigned int save_sr7;
-
- unsigned int save_sr8;
- unsigned int save_sr9;
- unsigned int save_sr10;
- unsigned int save_sr11;
- unsigned int save_sr12;
- unsigned int save_sr13;
- unsigned int save_sr14;
- unsigned int save_sr15;
-
-/* The following are the control area for this save area */
-
-/* offset 0x0480 */
-
- struct savearea *save_prev; /* The address of the previous normal savearea */
- struct savearea *save_prev_float; /* The address of the previous floating point savearea */
- struct savearea *save_prev_vector; /* The address of the previous vector savearea */
- struct savearea *save_qfret; /* The "quick release" chain */
- struct savearea *save_phys; /* The physical address of this savearea */
- struct thread_activation *save_act; /* Pointer to the associated activation */
- unsigned int save_flags; /* Various flags */
-#define save_perm 0x80000000 /* Permanent area, cannot be released */
- unsigned int save_level_fp; /* Level that floating point state belongs to */
- unsigned int save_level_vec; /* Level that vector state belongs to */
-
-} savearea;
-
-typedef struct savectl { /* Savearea control */
-
- unsigned int *sac_next; /* Points to next savearea page that has a free slot - real */
- unsigned int sac_vrswap; /* XOR mask to swap V to R or vice versa */
- unsigned int sac_alloc; /* Bitmap of allocated slots */
- unsigned int sac_flags; /* Various flags */
-} savectl;
-
-struct Saveanchor {
- unsigned int savelock; /* Lock word for savearea manipulation */
- int savecount; /* The total number of save areas allocated */
- int saveinuse; /* Number of areas in use */
- int savemin; /* We abend if lower than this */
- int saveneghyst; /* The negative hysteresis value */
- int savetarget; /* The target point for free save areas */
- int saveposhyst; /* The positive hysteresis value */
- unsigned int savefree; /* Anchor for the freelist queue */
- /* Cache line (32-byte) boundary */
- int savextnd; /* Free list extention count */
- int saveneed; /* Number of savearea's needed. So far, we assume we need 3 per activation */
- int savemaxcount;
- int savespare[5]; /* Spare */