*
* @APPLE_LICENSE_HEADER_START@
*
- * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
+ * The contents of this file constitute Original Code as defined in and
+ * are subject to the Apple Public Source License Version 1.1 (the
+ * "License"). You may not use this file except in compliance with the
+ * License. Please obtain a copy of the License at
+ * http://www.apple.com/publicsource and read it before using this file.
*
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This Original Code and all software distributed under the License are
+ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+ * License for the specific language governing rights and limitations
+ * under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
#include <ppc/machine_routines.h>
/* Per processor CPU features */
-#pragma pack(4) /* Make sure the structure stays as we defined it */
struct procFeatures {
- unsigned int Available; /* 0x000 */
+ unsigned int Available;
#define pfFloat 0x80000000
#define pfFloatb 0
#define pfAltivec 0x40000000
#define pfThermalb 7
#define pfThermInt 0x00800000
#define pfThermIntb 8
-#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 pfNoL2PFNap 0x00008000
+#define pfNoL2PFNapb 16
+#define pfSlowNap 0x00004000
+#define pfSlowNapb 17
+#define pfNoMuMMCK 0x00002000
+#define pfNoMuMMCKb 18
#define pfLClck 0x00001000
#define pfLClckb 19
#define pfWillNap 0x00000800
#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 pfL1i 0x00000100
+#define pfL1ib 23
+#define pfL1d 0x00000080
+#define pfL1db 24
+#define pfL1fa 0x00000040
+#define pfL1fab 25
+#define pfL2 0x00000020
+#define pfL2b 26
+#define pfL2fa 0x00000010
+#define pfL2fab 27
+#define pfL2i 0x00000008
+#define pfL2ib 28
#define pfL3 0x00000004
#define pfL3b 29
#define pfL3fa 0x00000002
#define pfL3fab 30
#define pfValid 0x00000001
#define pfValidb 31
- unsigned short rptdProc; /* 0x004 */
- unsigned short lineSize; /* 0x006 */
- unsigned int l1iSize; /* 0x008 */
- unsigned int l1dSize; /* 0x00C */
- unsigned int l2cr; /* 0x010 */
- unsigned int l2Size; /* 0x014 */
- unsigned int l3cr; /* 0x018 */
- unsigned int l3Size; /* 0x01C */
- unsigned int pfMSSCR0; /* 0x020 */
- unsigned int pfMSSCR1; /* 0x024 */
- unsigned int pfICTRL; /* 0x028 */
- unsigned int pfLDSTCR; /* 0x02C */
- unsigned int pfLDSTDB; /* 0x030 */
- unsigned int pfMaxVAddr; /* 0x034 */
- unsigned int pfMaxPAddr; /* 0x038 */
- unsigned int pfPTEG; /* 0x03C */
- uint64_t pfHID0; /* 0x040 */
- uint64_t pfHID1; /* 0x048 */
- uint64_t pfHID2; /* 0x050 */
- uint64_t pfHID3; /* 0x058 */
- uint64_t pfHID4; /* 0x060 */
- uint64_t pfHID5; /* 0x068 */
- unsigned int l2crOriginal; /* 0x070 */
- unsigned int l3crOriginal; /* 0x074 */
- unsigned int pfBootConfig; /* 0x07C */
- unsigned int reserved[1]; /* 0x80 */
+ 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 pfHID0;
+ unsigned int pfHID1;
+ unsigned int pfHID2;
+ unsigned int pfHID3;
+ unsigned int pfMSSCR0;
+ unsigned int pfMSSCR1;
+ unsigned int pfICTRL;
+ unsigned int pfLDSTCR;
+ unsigned int pfLDSTDB;
+ unsigned int l2crOriginal;
+ unsigned int l3crOriginal;
+ unsigned int pfBootConfig;
+ unsigned int reserved[4];
};
-#pragma pack()
typedef struct procFeatures procFeatures;
-#pragma pack(4) /* Make sure the structure stays as we defined it */
struct thrmControl {
unsigned int maxTemp; /* Maximum temprature before damage */
unsigned int throttleTemp; /* Temprature at which to throttle down */
unsigned int thrm3val; /* Value for thrm3 register */
unsigned int rsvd[3]; /* Pad to cache line */
};
-#pragma pack()
typedef struct thrmControl thrmControl;
-/*
- *
- * Various performance counters
- */
-#pragma pack(4) /* Make sure the structure stays as we defined it */
-struct hwCtrs {
-
- unsigned int hwInVains; /* In vain */
- unsigned int hwResets; /* Reset */
- unsigned int hwMachineChecks; /* Machine check */
- unsigned int hwDSIs; /* DSIs */
- unsigned int hwISIs; /* ISIs */
- unsigned int hwExternals; /* Externals */
- unsigned int hwAlignments; /* Alignment */
- unsigned int hwPrograms; /* Program */
- unsigned int hwFloatPointUnavailable; /* Floating point */
- unsigned int hwDecrementers; /* Decrementer */
- unsigned int hwIOErrors; /* I/O error */
- unsigned int hwrsvd0; /* Reserved */
- unsigned int hwSystemCalls; /* System call */
- unsigned int hwTraces; /* Trace */
- unsigned int hwFloatingPointAssists; /* Floating point assist */
- unsigned int hwPerformanceMonitors; /* Performance monitor */
- unsigned int hwAltivecs; /* VMX */
- unsigned int hwrsvd1; /* Reserved */
- unsigned int hwrsvd2; /* Reserved */
- unsigned int hwrsvd3; /* Reserved */
- unsigned int hwInstBreakpoints; /* Instruction breakpoint */
- unsigned int hwSystemManagements; /* System management */
- unsigned int hwAltivecAssists; /* Altivec Assist */
- unsigned int hwThermal; /* Thermals */
- unsigned int hwrsvd5; /* Reserved */
- unsigned int hwrsvd6; /* Reserved */
- unsigned int hwrsvd7; /* Reserved */
- unsigned int hwrsvd8; /* Reserved */
- unsigned int hwrsvd9; /* Reserved */
- unsigned int hwrsvd10; /* Reserved */
- unsigned int hwrsvd11; /* Reserved */
- unsigned int hwrsvd12; /* Reserved */
- unsigned int hwrsvd13; /* Reserved */
- unsigned int hwTrace601; /* Trace */
- unsigned int hwSIGPs; /* SIGP */
- unsigned int hwPreemptions; /* Preemption */
- unsigned int hwContextSwitchs; /* Context switch */
- unsigned int hwShutdowns; /* Shutdowns */
- unsigned int hwChokes; /* System ABENDs */
- unsigned int hwDataSegments; /* Data Segment Interruptions */
- unsigned int hwInstructionSegments; /* Instruction Segment Interruptions */
- unsigned int hwSoftPatches; /* Soft Patch interruptions */
- unsigned int hwMaintenances; /* Maintenance interruptions */
- unsigned int hwInstrumentations; /* Instrumentation interruptions */
- unsigned int hwrsvd14; /* Reswerved */
-/* 0x0B4 */
-
- unsigned int hwspare0[17]; /* Reserved */
- unsigned int hwRedrives; /* Number of redriven interrupts */
- unsigned int hwSteals; /* PTE Steals */
-/* 0x100 */
-
- 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]; /* Pad to next 128 bndry */
-/* 0x180 */
-
- unsigned int napStamp[2]; /* Time base when we napped */
- unsigned int napTotal[2]; /* Total nap time in ticks */
- unsigned int numSIGPast; /* Number of SIGP asts recieved */
- unsigned int numSIGPcpureq; /* Number of SIGP cpu requests recieved */
- unsigned int numSIGPdebug; /* Number of SIGP debugs recieved */
- unsigned int numSIGPwake; /* Number of SIGP wakes recieved */
- unsigned int numSIGPtimo; /* Number of SIGP send timeouts */
- unsigned int numSIGPmast; /* Number of SIGPast messages merged */
- unsigned int numSIGPmwake; /* Number of SIGPwake messages merged */
-
- unsigned int hwspare3[21]; /* Pad to 512 */
-
-};
-#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_TABLE_SIZE 12
-
-#define PatchExt32 0x80000000
-#define PatchExt32b 0
-#define PatchLwsync 0x40000000
-#define PatchLwsyncb 1
-
/* When an exception is taken, this info is accessed via sprg0 */
/* We should always have this one on a cache line boundary */
-
-#pragma pack(4) /* Make sure the structure stays as we defined it */
struct per_proc_info {
unsigned short cpu_number;
unsigned short cpu_flags; /* Various low-level flags */
vm_offset_t debstackptr;
vm_offset_t debstack_top_ss;
- unsigned int spcFlags; /* Special thread flags */
- unsigned int Uassist; /* User Assist Word */
+ unsigned int tempwork1; /* Temp work area - monitor use carefully */
+ unsigned int save_exception_type;
unsigned int old_thread;
/* PPC cache line boundary here - 020 */
* Note: the following two pairs of words need to stay in order and each pair must
* be in the same reservation (line) granule
*/
- struct facility_context *FPU_owner; /* Owner of the FPU on this cpu */
- unsigned int liveVRSave; /* VRSave assiciated with live vector registers */
- struct facility_context *VMX_owner; /* Owner of the VMX on this cpu */
- unsigned int holdQFret; /* Hold off releasing quickfret list */
- unsigned int rsrvd03C[1];
+ struct facility_context *FPU_owner; /* Owner of the FPU on this cpu */
+ unsigned int pprsv1;
+ struct facility_context *VMX_owner; /* Owner of the VMX on this cpu */
+ unsigned int pprsv2;
+ unsigned int next_savearea; /* pointer to the next savearea */
/* PPC cache line boundary here - 040 */
- addr64_t quickfret; /* List of saveareas to release */
- addr64_t lclfree; /* Pointer to local savearea list */
+ unsigned int quickfret; /* List of saveareas to release */
+ unsigned int lclfree; /* Pointer to local savearea list */
unsigned int lclfreecnt; /* Entries in local savearea list */
- unsigned int spcTRc; /* Special trace count */
- unsigned int spcTRp; /* Special trace buffer pointer */
- unsigned int ppbbTaskEnv; /* BlueBox Task Environment */
+ unsigned int Lastpmap; /* Last user pmap loaded */
+ unsigned int userspace; /* Last loaded user memory space ID */
+ unsigned int userpmap; /* User pmap - real address */
+ unsigned int liveVRSave; /* VRSave assiciated with live vector registers */
+ unsigned int spcFlags; /* Special thread flags */
/* PPC cache line boundary here - 060 */
boolean_t interrupts_enabled;
+ unsigned int ppbbTaskEnv; /* BlueBox Task Environment */
IOInterruptHandler interrupt_handler;
void * interrupt_nub;
unsigned int interrupt_source;
void * interrupt_target;
void * interrupt_refCon;
- uint64_t next_savearea; /* pointer to the next savearea */
+ time_base_enable_t time_base_enable;
/* PPC cache line boundary here - 080 */
unsigned int MPsigpStat; /* Signal Processor status (interlocked update for this one) */
#define SIGPdebug 2 /* Requests a debugger entry */
#define SIGPwake 3 /* Wake up a sleeping processor */
#define CPRQtemp 0 /* Get temprature of processor */
-#define CPRQtimebase 1 /* Get timebase of processor */
-#define CPRQscom 2 /* SCOM */
+#define CPRQtimebase 1 /* Get timebase of processor */
unsigned int MPsigpParm0; /* SIGP parm 0 */
unsigned int MPsigpParm1; /* SIGP parm 1 */
unsigned int MPsigpParm2; /* SIGP parm 2 */
/* PPC cache line boundary here - 0A0 */
procFeatures pf; /* Processor features */
- /* PPC cache line boundary here - 120 */
+ /* PPC cache line boundary here - 100 */
thrmControl thrm; /* Thermal controls */
+ /* PPC cache line boundary here - 120 */
+ unsigned int napStamp[2]; /* Time base when we napped */
+ unsigned int napTotal[2]; /* Total nap time in ticks */
+ unsigned int numSIGPast; /* Number of SIGP asts recieved */
+ unsigned int numSIGPcpureq; /* Number of SIGP cpu requests recieved */
+ unsigned int numSIGPdebug; /* Number of SIGP debugs recieved */
+ unsigned int numSIGPwake; /* Number of SIGP wakes recieved */
+
/* PPC cache line boundary here - 140 */
- unsigned int ppRsvd140[8]; /* Reserved */
+ unsigned int numSIGPtimo; /* Number of SIGP send timeouts */
+ unsigned int numSIGPmast; /* Number of SIGPast messages merged */
+ unsigned int numSIGPmwake; /* Number of SIGPwake messages merged */
+ unsigned int spcTRc; /* Special trace count */
+ unsigned int spcTRp; /* Special trace buffer pointer */
+ unsigned int Uassist; /* User Assist Word */
+ vm_offset_t VMMareaPhys; /* vmm state page physical addr */
+ unsigned int FAMintercept; /* vmm FAM Exceptions to intercept */
/* PPC cache line boundary here - 160 */
- time_base_enable_t time_base_enable;
- unsigned int ppRsvd164[3]; /* Reserved */
cpu_data_t pp_cpu_data; /* cpu data info */
+ unsigned int rsrvd170[4]; /* Reserved slots */
/* PPC cache line boundary here - 180 */
- unsigned int ppRsvd180[2]; /* Reserved */
- uint64_t validSegs; /* Valid SR/STB slots */
- addr64_t ppUserPmap; /* Current user state pmap (physical address) */
- unsigned int ppUserPmapVirt; /* Current user state pmap (virtual address) */
- unsigned int ppMapFlags; /* Mapping flags */
+ unsigned int rsrvd180[8]; /* Reserved slots */
/* PPC cache line boundary here - 1A0 */
- unsigned short ppInvSeg; /* Forces complete invalidate of SRs/SLB (this must stay with ppInvSeg) */
- unsigned short ppCurSeg; /* Set to 1 if user segments, 0 if kernel (this must stay with ppInvSeg) */
- unsigned int ppSegSteal; /* Count of segment slot steals */
- ppnum_t VMMareaPhys; /* vmm state page physical addr */
- unsigned int VMMXAFlgs; /* vmm extended flags */
- unsigned int FAMintercept; /* vmm FAM Exceptions to intercept */
- unsigned int rsrvd1B4[3]; /* Reserved slots */
+ unsigned int rsrvd1A0[8]; /* Reserved slots */
/* PPC cache line boundary here - 1C0 */
- unsigned int ppCIOmp[16]; /* Linkage mapping for copyin/out - 64 bytes */
-
- /* PPC cache line boundary here - 200 */
- uint64_t tempr0; /* temporary savearea */
- 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;
+ unsigned int rsrvd1C0[8]; /* Reserved slots */
- 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;
-
-
- /* PPC cache line boundary here - 300 */
+ /* PPC cache line boundary here - 1E0 */
double emfp0; /* Copies of floating point registers */
double emfp1; /* Used for emulation purposes */
double emfp2;
double emfp30;
double emfp31;
-/* - 400 */
+/* - 2E0 */
unsigned int emfpscr_pad;
unsigned int emfpscr;
unsigned int empadfp[6];
-/* - 420 */
+/* - 300 */
unsigned int emvr0[4]; /* Copies of vector registers used both */
unsigned int emvr1[4]; /* for full vector emulation or */
unsigned int emvr2[4]; /* as saveareas while assisting denorms */
unsigned int emvr31[4];
unsigned int emvscr[4];
unsigned int empadvr[4];
-/* - 640 */
-/* note implicit dependence on kSkipListMaxLists, which must be <= 28 */
- addr64_t skipListPrev[28]; /* prev ptrs saved as side effect of calling mapSearchFull() */
-
-/* - 720 */
+/* - 520 */
unsigned int patcharea[56];
-/* - 800 */
-
- hwCtrs hwCtr; /* Hardware exception counters */
-/* - A00 */
-
- unsigned int pppadpage[384]; /* Pad to end of page */
-/* - 1000 */
-
+/* - 600 */
};
#define pp_simple_lock_count pp_cpu_data.simple_lock_count
#define pp_interrupt_level pp_cpu_data.interrupt_level
-#pragma pack()
-
extern struct per_proc_info per_proc_info[NCPUS];
-
extern char *trap_type[];
-#endif /* ndef ASSEMBLER */ /* with this savearea should be redriven */
+#endif /* ndef ASSEMBLER */
+/* with this savearea should be redriven */
/* cpu_flags defs */
#define SIGPactive 0x8000
#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_INVALID_EXCP13 (0x20 * T_VECTOR_SIZE)
#define T_RUNMODE_TRACE (0x21 * T_VECTOR_SIZE) /* 601 only */
#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_AST (0x100 * T_VECTOR_SIZE)
#define T_MAX T_CHOKE /* Maximum exception no */
#define T_FAM 0x00004000
-#define EXCEPTION_VECTOR(exception) (exception * 0x100 / T_VECTOR_SIZE )
+#define EXCEPTION_VECTOR(exception) (exception * 0x100 /T_VECTOR_SIZE )
/*
* System choke (failure) codes
#define failNoSavearea 4
#define failSaveareaCorr 5
#define failBadLiveContext 6
-#define failSkipLists 7
-#define failUnalignedStk 8
/* Always must be last - update failNames table in model_dep.c as well */
-#define failUnknown 9
+#define failUnknown 7
#ifndef ASSEMBLER
-#pragma pack(4) /* Make sure the structure stays as we defined it */
typedef struct resethandler {
unsigned int type;
vm_offset_t call_paddr;
vm_offset_t arg__paddr;
} resethandler_t;
-#pragma pack()
extern resethandler_t ResetHandler;
#define RESET_HANDLER_NULL 0x0
#define RESET_HANDLER_START 0x1
-#define RESET_HANDLER_BUPOR 0x2
-#define RESET_HANDLER_IGNORE 0x3
#endif /* _PPC_EXCEPTION_H_ */