#ifndef _PPC_EXCEPTION_H_
#define _PPC_EXCEPTION_H_
#include <ppc/savearea.h>
#ifndef ASSEMBLER
#include <mach_kdb.h>
#include <mach_kdp.h>
#include <mach/machine/vm_types.h>
#include <mach/boolean.h>
#include <kern/ast.h>
#include <kern/cpu_data.h>
#include <pexpert/pexpert.h>
#include <IOKit/IOInterrupts.h>
#include <ppc/machine_routines.h>
#include <ppc/pms.h>
#include <ppc/rtclock.h>
#pragma pack(4)
struct procFeatures {
unsigned int Available;
#define pfFloat 0x80000000
#define pfFloatb 0
#define pfAltivec 0x40000000
#define pfAltivecb 1
#define pfAvJava 0x20000000
#define pfAvJavab 2
#define pfSMPcap 0x10000000
#define pfSMPcapb 3
#define pfCanSleep 0x08000000
#define pfCanSleepb 4
#define pfCanNap 0x04000000
#define pfCanNapb 5
#define pfCanDoze 0x02000000
#define pfCanDozeb 6
#define pfSlowNap 0x00400000
#define pfSlowNapb 9
#define pfNoMuMMCK 0x00200000
#define pfNoMuMMCKb 10
#define pfNoL2PFNap 0x00100000
#define pfNoL2PFNapb 11
#define pfSCOMFixUp 0x00080000
#define pfSCOMFixUpb 12
#define pfHasDcba 0x00040000
#define pfHasDcbab 13
#define pfL1fa 0x00010000
#define pfL1fab 15
#define pfL2 0x00008000
#define pfL2b 16
#define pfL2fa 0x00004000
#define pfL2fab 17
#define pfL2i 0x00002000
#define pfL2ib 18
#define pfLClck 0x00001000
#define pfLClckb 19
#define pfWillNap 0x00000800
#define pfWillNapb 20
#define pfNoMSRir 0x00000400
#define pfNoMSRirb 21
#define pfL3pdet 0x00000200
#define pfL3pdetb 22
#define pf128Byte 0x00000080
#define pf128Byteb 24
#define pf32Byte 0x00000020
#define pf32Byteb 26
#define pf64Bit 0x00000010
#define pf64Bitb 27
#define pfL3 0x00000004
#define pfL3b 29
#define pfL3fa 0x00000002
#define pfL3fab 30
#define pfValid 0x00000001
#define pfValidb 31
unsigned short rptdProc;
unsigned short lineSize;
unsigned int l1iSize;
unsigned int l1dSize;
unsigned int l2cr;
unsigned int l2Size;
unsigned int l3cr;
unsigned int l3Size;
unsigned int pfMSSCR0;
unsigned int pfMSSCR1;
unsigned int pfICTRL;
unsigned int pfLDSTCR;
unsigned int pfLDSTDB;
unsigned int pfMaxVAddr;
unsigned int pfMaxPAddr;
unsigned int pfPTEG;
uint64_t pfHID0;
uint64_t pfHID1;
uint64_t pfHID2;
uint64_t pfHID3;
uint64_t pfHID4;
uint64_t pfHID5;
unsigned int l2crOriginal;
unsigned int l3crOriginal;
unsigned int pfBootConfig;
unsigned int pfPowerModes;
#define pmDPLLVmin 0x00010000
#define pmDPLLVminb 15
#define pmType 0x000000FF
#define pmPowerTune 0x00000003
#define pmDFS 0x00000002
#define pmDualPLL 0x00000001
unsigned int pfPowerTune0;
unsigned int pfPowerTune1;
unsigned int rsrvd88[6];
};
#pragma pack()
typedef struct procFeatures procFeatures;
#pragma pack(4)
struct hwCtrs {
unsigned int hwInVains;
unsigned int hwResets;
unsigned int hwMachineChecks;
unsigned int hwDSIs;
unsigned int hwISIs;
unsigned int hwExternals;
unsigned int hwAlignments;
unsigned int hwPrograms;
unsigned int hwFloatPointUnavailable;
unsigned int hwDecrementers;
unsigned int hwIOErrors;
unsigned int hwrsvd0;
unsigned int hwSystemCalls;
unsigned int hwTraces;
unsigned int hwFloatingPointAssists;
unsigned int hwPerformanceMonitors;
unsigned int hwAltivecs;
unsigned int hwrsvd1;
unsigned int hwrsvd2;
unsigned int hwrsvd3;
unsigned int hwInstBreakpoints;
unsigned int hwSystemManagements;
unsigned int hwAltivecAssists;
unsigned int hwThermal;
unsigned int hwrsvd5;
unsigned int hwrsvd6;
unsigned int hwrsvd7;
unsigned int hwrsvd8;
unsigned int hwrsvd9;
unsigned int hwrsvd10;
unsigned int hwrsvd11;
unsigned int hwrsvd12;
unsigned int hwrsvd13;
unsigned int hwTrace601;
unsigned int hwSIGPs;
unsigned int hwPreemptions;
unsigned int hwContextSwitchs;
unsigned int hwShutdowns;
unsigned int hwChokes;
unsigned int hwDataSegments;
unsigned int hwInstructionSegments;
unsigned int hwSoftPatches;
unsigned int hwMaintenances;
unsigned int hwInstrumentations;
unsigned int hwrsvd14;
unsigned int hwhdec;
unsigned int hwspare0[11];
unsigned int hwspare0a;
unsigned int hwspare0b;
unsigned int hwspare0c;
unsigned int hwspare0d;
unsigned int hwIgnored;
unsigned int hwRedrives;
unsigned int hwSteals;
unsigned int hwMckHang;
unsigned int hwMckSLBPE;
unsigned int hwMckTLBPE;
unsigned int hwMckERCPE;
unsigned int hwMckL1DPE;
unsigned int hwMckL1TPE;
unsigned int hwMckUE;
unsigned int hwMckIUE;
unsigned int hwMckIUEr;
unsigned int hwMckDUE;
unsigned int hwMckDTW;
unsigned int hwMckUnk;
unsigned int hwMckExt;
unsigned int hwMckICachePE;
unsigned int hwMckITagPE;
unsigned int hwMckIEratPE;
unsigned int hwMckDEratPE;
unsigned int hwspare2[15];
unsigned int napStamp[2];
unsigned int napTotal[2];
unsigned int numSIGPast;
unsigned int numSIGPcpureq;
unsigned int numSIGPdebug;
unsigned int numSIGPwake;
unsigned int numSIGPtimo;
unsigned int numSIGPmast;
unsigned int numSIGPmwake;
unsigned int hwWalkPhys;
unsigned int hwWalkFull;
unsigned int hwWalkMerge;
unsigned int hwWalkQuick;
unsigned int numSIGPcall;
unsigned int hwspare3[16];
};
#pragma pack()
typedef struct hwCtrs hwCtrs;
struct patch_entry {
unsigned int *addr;
unsigned int data;
unsigned int type;
unsigned int value;
};
typedef struct patch_entry patch_entry_t;
#define PATCH_INVALID 0
#define PATCH_PROCESSOR 1
#define PATCH_FEATURE 2
#define PATCH_END_OF_TABLE 3
#define PatchExt32 0x80000000
#define PatchExt32b 0
#define PatchLwsync 0x40000000
#define PatchLwsyncb 1
#pragma pack(4)
struct per_proc_info {
unsigned short cpu_number;
unsigned short cpu_flags;
vm_offset_t istackptr;
vm_offset_t intstack_top_ss;
vm_offset_t debstackptr;
vm_offset_t debstack_top_ss;
unsigned int spcFlags;
unsigned int old_thread;
ast_t pending_ast;
int cpu_type;
int cpu_subtype;
int cpu_threadtype;
struct facility_context *FPU_owner;
unsigned int liveVRSave;
struct facility_context *VMX_owner;
unsigned int spcTRc;
unsigned int spcTRp;
addr64_t quickfret;
addr64_t lclfree;
unsigned int lclfreecnt;
unsigned int holdQFret;
uint64_t rtcPop;
boolean_t interrupts_enabled;
IOInterruptHandler interrupt_handler;
void * interrupt_nub;
unsigned int interrupt_source;
void * interrupt_target;
void * interrupt_refCon;
uint64_t next_savearea;
unsigned int MPsigpStat;
#define MPsigpMsgp 0xC0000000
#define MPsigpBusy 0x80000000
#define MPsigpPass 0x40000000
#define MPsigpAck 0x20000000
#define MPsigpSrc 0x000000FF
#define MPsigpFunc 0x0000FF00
#define MPsigpIdle 0x00
#define MPsigpSigp 0x04
unsigned int MPsigpParm0;
unsigned int MPsigpParm1;
unsigned int MPsigpParm2;
cpu_id_t cpu_id;
vm_offset_t start_paddr;
unsigned int ruptStamp[2];
procFeatures pf;
void * pp_cbfr;
void * pp_chud;
uint64_t rtclock_tick_deadline;
rtclock_timer_t rtclock_timer;
unsigned int ppbbTaskEnv;
struct savearea * db_saved_state;
time_base_enable_t time_base_enable;
int ppXFlags;
int running;
int debugger_is_slave;
int debugger_active;
int debugger_pending;
int debugger_holdoff;
uint64_t Uassist;
uint64_t validSegs;
addr64_t ppUserPmap;
unsigned int ppUserPmapVirt;
unsigned int ppMapFlags;
unsigned short ppInvSeg;
unsigned short ppCurSeg;
unsigned int ppSegSteal;
ppnum_t VMMareaPhys;
unsigned int VMMXAFlgs;
unsigned int FAMintercept;
unsigned int hibernate;
uint32_t save_tbl;
uint32_t save_tbu;
unsigned int ppUMWmp[16];
uint64_t tempr0;
uint64_t tempr1;
uint64_t tempr2;
uint64_t tempr3;
uint64_t tempr4;
uint64_t tempr5;
uint64_t tempr6;
uint64_t tempr7;
uint64_t tempr8;
uint64_t tempr9;
uint64_t tempr10;
uint64_t tempr11;
uint64_t tempr12;
uint64_t tempr13;
uint64_t tempr14;
uint64_t tempr15;
uint64_t tempr16;
uint64_t tempr17;
uint64_t tempr18;
uint64_t tempr19;
uint64_t tempr20;
uint64_t tempr21;
uint64_t tempr22;
uint64_t tempr23;
uint64_t tempr24;
uint64_t tempr25;
uint64_t tempr26;
uint64_t tempr27;
uint64_t tempr28;
uint64_t tempr29;
uint64_t tempr30;
uint64_t tempr31;
double emfp0;
double emfp1;
double emfp2;
double emfp3;
double emfp4;
double emfp5;
double emfp6;
double emfp7;
double emfp8;
double emfp9;
double emfp10;
double emfp11;
double emfp12;
double emfp13;
double emfp14;
double emfp15;
double emfp16;
double emfp17;
double emfp18;
double emfp19;
double emfp20;
double emfp21;
double emfp22;
double emfp23;
double emfp24;
double emfp25;
double emfp26;
double emfp27;
double emfp28;
double emfp29;
double emfp30;
double emfp31;
unsigned int emfpscr_pad;
unsigned int emfpscr;
unsigned int empadfp[6];
unsigned int emvr0[4];
unsigned int emvr1[4];
unsigned int emvr2[4];
unsigned int emvr3[4];
unsigned int emvr4[4];
unsigned int emvr5[4];
unsigned int emvr6[4];
unsigned int emvr7[4];
unsigned int emvr8[4];
unsigned int emvr9[4];
unsigned int emvr10[4];
unsigned int emvr11[4];
unsigned int emvr12[4];
unsigned int emvr13[4];
unsigned int emvr14[4];
unsigned int emvr15[4];
unsigned int emvr16[4];
unsigned int emvr17[4];
unsigned int emvr18[4];
unsigned int emvr19[4];
unsigned int emvr20[4];
unsigned int emvr21[4];
unsigned int emvr22[4];
unsigned int emvr23[4];
unsigned int emvr24[4];
unsigned int emvr25[4];
unsigned int emvr26[4];
unsigned int emvr27[4];
unsigned int emvr28[4];
unsigned int emvr29[4];
unsigned int emvr30[4];
unsigned int emvr31[4];
unsigned int emvscr[4];
unsigned int empadvr[4];
addr64_t skipListPrev[28];
unsigned int patcharea[56];
hwCtrs hwCtr;
addr64_t pp2ndPage;
uint32_t pprsvd0A08[6];
pmsd pms;
unsigned int pprsvd0A40[368];
unsigned int processor[384];
unsigned int pprsvd1[640];
};
#pragma pack()
#define PROCESSOR_TO_PER_PROC(x) \
((struct per_proc_info*)((unsigned int)(x) \
- (unsigned int)(((struct per_proc_info *)0)->processor)))
extern struct per_proc_info BootProcInfo;
#define MAX_CPUS 256
struct per_proc_entry {
addr64_t ppe_paddr;
unsigned int ppe_pad4[1];
struct per_proc_info *ppe_vaddr;
};
extern struct per_proc_entry PerProcTable[MAX_CPUS-1];
extern char *trap_type[];
#endif
#define SIGPactive 0x8000
#define needSRload 0x4000
#define turnEEon 0x2000
#define traceBE 0x1000
#define traceBEb 3
#define SleepState 0x0800
#define SleepStateb 4
#define mcountOff 0x0400
#define SignalReady 0x0200
#define BootDone 0x0100
#define loadMSR 0x7FF4
#define SignalReadyWait 0x00000001
#define T_VECTOR_SIZE 4
#define T_IN_VAIN (0x00 * T_VECTOR_SIZE)
#define T_RESET (0x01 * T_VECTOR_SIZE)
#define T_MACHINE_CHECK (0x02 * T_VECTOR_SIZE)
#define T_DATA_ACCESS (0x03 * T_VECTOR_SIZE)
#define T_INSTRUCTION_ACCESS (0x04 * T_VECTOR_SIZE)
#define T_INTERRUPT (0x05 * T_VECTOR_SIZE)
#define T_ALIGNMENT (0x06 * T_VECTOR_SIZE)
#define T_PROGRAM (0x07 * T_VECTOR_SIZE)
#define T_FP_UNAVAILABLE (0x08 * T_VECTOR_SIZE)
#define T_DECREMENTER (0x09 * T_VECTOR_SIZE)
#define T_IO_ERROR (0x0a * T_VECTOR_SIZE)
#define T_RESERVED (0x0b * T_VECTOR_SIZE)
#define T_SYSTEM_CALL (0x0c * T_VECTOR_SIZE)
#define T_TRACE (0x0d * T_VECTOR_SIZE)
#define T_FP_ASSIST (0x0e * T_VECTOR_SIZE)
#define T_PERF_MON (0x0f * T_VECTOR_SIZE)
#define T_VMX (0x10 * T_VECTOR_SIZE)
#define T_INVALID_EXCP0 (0x11 * T_VECTOR_SIZE)
#define T_INVALID_EXCP1 (0x12 * T_VECTOR_SIZE)
#define T_INVALID_EXCP2 (0x13 * T_VECTOR_SIZE)
#define T_INSTRUCTION_BKPT (0x14 * T_VECTOR_SIZE)
#define T_SYSTEM_MANAGEMENT (0x15 * T_VECTOR_SIZE)
#define T_ALTIVEC_ASSIST (0x16 * T_VECTOR_SIZE)
#define T_THERMAL (0x17 * T_VECTOR_SIZE)
#define T_INVALID_EXCP5 (0x18 * T_VECTOR_SIZE)
#define T_INVALID_EXCP6 (0x19 * T_VECTOR_SIZE)
#define T_INVALID_EXCP7 (0x1A * T_VECTOR_SIZE)
#define T_INVALID_EXCP8 (0x1B * T_VECTOR_SIZE)
#define T_INVALID_EXCP9 (0x1C * T_VECTOR_SIZE)
#define T_INVALID_EXCP10 (0x1D * T_VECTOR_SIZE)
#define T_INVALID_EXCP11 (0x1E * T_VECTOR_SIZE)
#define T_INVALID_EXCP12 (0x1F * T_VECTOR_SIZE)
#define T_EMULATE (0x20 * T_VECTOR_SIZE)
#define T_RUNMODE_TRACE (0x21 * T_VECTOR_SIZE)
#define T_SIGP (0x22 * T_VECTOR_SIZE)
#define T_PREEMPT (0x23 * T_VECTOR_SIZE)
#define T_CSWITCH (0x24 * T_VECTOR_SIZE)
#define T_SHUTDOWN (0x25 * T_VECTOR_SIZE)
#define T_CHOKE (0x26 * T_VECTOR_SIZE)
#define T_DATA_SEGMENT (0x27 * T_VECTOR_SIZE)
#define T_INSTRUCTION_SEGMENT (0x28 * T_VECTOR_SIZE)
#define T_SOFT_PATCH (0x29 * T_VECTOR_SIZE)
#define T_MAINTENANCE (0x2A * T_VECTOR_SIZE)
#define T_INSTRUMENTATION (0x2B * T_VECTOR_SIZE)
#define T_ARCHDEP0 (0x2C * T_VECTOR_SIZE)
#define T_HDEC (0x2D * T_VECTOR_SIZE)
#define T_AST (0x100 * T_VECTOR_SIZE)
#define T_MAX T_CHOKE
#define T_FAM 0x00004000
#define EXCEPTION_VECTOR(exception) (exception * 0x100 / T_VECTOR_SIZE )
#define failDebug 0
#define failStack 1
#define failMapping 2
#define failContext 3
#define failNoSavearea 4
#define failSaveareaCorr 5
#define failBadLiveContext 6
#define failSkipLists 7
#define failUnalignedStk 8
#define failPmap 9
#define failTimeout 10
#define failUnknown 11
#ifndef ASSEMBLER
#pragma pack(4)
typedef struct resethandler {
unsigned int type;
vm_offset_t call_paddr;
vm_offset_t arg__paddr;
} resethandler_t;
#pragma pack()
extern resethandler_t ResetHandler;
#endif
#define RESET_HANDLER_NULL 0x0
#define RESET_HANDLER_START 0x1
#define RESET_HANDLER_BUPOR 0x2
#define RESET_HANDLER_IGNORE 0x3
#endif