#ifndef _PPC_THREAD_ACT_H_
#define _PPC_THREAD_ACT_H_
#include <mach_kgdb.h>
#include <mach/boolean.h>
#include <mach/ppc/vm_types.h>
#include <mach/thread_status.h>
#include <kern/lock.h>
#include <kern/clock.h>
#include <ppc/savearea.h>
typedef struct savearea pcb;
typedef struct savearea *pcb_t;
struct facility_context {
savearea_fpu *FPUsave;
savearea *FPUlevel;
unsigned int FPUcpu;
savearea_vec *VMXsave;
savearea *VMXlevel;
unsigned int VMXcpu;
struct thread_activation *facAct;
};
typedef struct facility_context facility_context;
extern unsigned int state_count[];
#define USER_REGS(ThrAct) ((ThrAct)->mact.pcb)
#define user_pc(ThrAct) ((ThrAct)->mact.pcb->save_srr0)
#define act_machine_state_ptr(ThrAct) (thread_state_t)USER_REGS(ThrAct)
typedef struct MachineThrAct {
savearea *pcb;
facility_context *curctx;
facility_context *deferctx;
facility_context facctx;
struct vmmCntrlEntry *vmmCEntry;
struct vmmCntrlTable *vmmControl;
uint64_t qactTimer;
unsigned int ksp;
unsigned int bbDescAddr;
unsigned int bbUserDA;
unsigned int bbTableStart;
unsigned int emPendRupts;
unsigned int bbTaskID;
unsigned int bbTaskEnv;
unsigned int specFlags;
#define ignoreZeroFaultbit 0
#define floatUsedbit 1
#define vectorUsedbit 2
#define runningVMbit 4
#define floatCngbit 5
#define vectorCngbit 6
#define timerPopbit 7
#define userProtKeybit 8
#define trapUnalignbit 9
#define notifyUnalignbit 10
#define FamVMenabit 11
#define FamVMmodebit 12
#define bbThreadbit 28
#define bbNoMachSCbit 29
#define bbPreemptivebit 30
#define spfReserved1 31
#define ignoreZeroFault (1<<(31-ignoreZeroFaultbit))
#define floatUsed (1<<(31-floatUsedbit))
#define vectorUsed (1<<(31-vectorUsedbit))
#define runningVM (1<<(31-runningVMbit))
#define floatCng (1<<(31-floatCngbit))
#define vectorCng (1<<(31-vectorCngbit))
#define timerPop (1<<(31-timerPopbit))
#define userProtKey (1<<(31-userProtKeybit))
#define trapUnalign (1<<(31-trapUnalignbit))
#define notifyUnalign (1<<(31-notifyUnalignbit))
#define FamVMena (1<<(31-FamVMenabit))
#define FamVMmode (1<<(31-FamVMmodebit))
#define bbThread (1<<(31-bbThreadbit))
#define bbNoMachSC (1<<(31-bbNoMachSCbit))
#define bbPreemptive (1<<(31-bbPreemptivebit))
#define fvChkb 0
#define fvChk 0x80000000
#ifdef MACH_BSD
unsigned long cthread_self;
#endif
} MachineThrAct, *MachineThrAct_t;
extern struct savearea *find_user_regs(thread_act_t act);
extern struct savearea *get_user_regs(thread_act_t);
extern struct savearea_fpu *find_user_fpu(thread_act_t act);
extern struct savearea_vec *find_user_vec(thread_act_t act);
extern int thread_enable_fpe(thread_act_t act, int onoff);
extern void *act_thread_csave(void);
extern void act_thread_catt(void *ctx);
extern void act_thread_cfree(void *ctx);
#define current_act_fast() current_act()
#endif