summaryrefslogtreecommitdiffstats
path: root/public/sdk/inc/ntppc.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--public/sdk/inc/ntppc.h688
1 files changed, 688 insertions, 0 deletions
diff --git a/public/sdk/inc/ntppc.h b/public/sdk/inc/ntppc.h
new file mode 100644
index 000000000..bfc5846a0
--- /dev/null
+++ b/public/sdk/inc/ntppc.h
@@ -0,0 +1,688 @@
+/*++
+
+Copyright (c) 1993 IBM Corporation
+
+Module Name:
+
+ ntppc.h
+
+Abstract:
+
+ User-mode visible PowerPC specific structures and constants
+
+Author:
+
+ Rick Simpson 9-July-1993
+
+ Based on ntmips.h, by David N. Cutler (davec) 31-Mar-1990
+
+Revision History:
+
+ Chuck Bauman 3-August-1993 (Integrate NT product source)
+ KPCR modifications need to be integrated
+ because it was removed from ntppc.h.
+ No changes required otherwise.
+
+--*/
+
+#ifndef _NTPPC_
+#define _NTPPC_
+#include "ppcinst.h"
+
+// begin_ntddk begin_nthal begin_windbgkd begin_winnt
+
+#if defined(_PPC_)
+
+// end_windbgkd end_winnt
+
+//
+// Define system time structure.
+//
+
+typedef struct _KSYSTEM_TIME {
+ ULONG LowPart;
+ LONG High1Time;
+ LONG High2Time;
+} KSYSTEM_TIME, *PKSYSTEM_TIME;
+
+//
+// Define unsupported "keywords".
+//
+
+#define _cdecl
+
+// end_ntddk end_nthal
+// begin_windbgkd
+
+//
+// Define PowerPC specific kernel debugger information.
+//
+// The following structure contains machine specific data passed to
+// the host system kernel debugger in a wait state change message.
+//
+// **FINISH** Copied without change from MIPS; may need modification
+
+#define DBGKD_MAXSTREAM 16
+
+typedef struct _DBGKD_CONTROL_REPORT {
+ ULONG InstructionCount;
+ UCHAR InstructionStream[DBGKD_MAXSTREAM];
+} DBGKD_CONTROL_REPORT, *PDBGKD_CONTROL_REPORT;
+
+//
+// The following structure contains information that the host system
+// kernel debugger wants to set on every continue operation and avoids
+// the need to send extra packets of information.
+//
+
+typedef ULONG DBGKD_CONTROL_SET, *PDBGKD_CONTROL_SET;
+
+// end_windbgkd
+
+
+//
+// Define breakpoint codes.
+//
+// **FINISH** Use MIPS codes unless there's a reason not to
+//
+
+#define USER_BREAKPOINT 0 // user breakpoint
+#define KERNEL_BREAKPOINT 1 // kernel breakpoint
+#define BREAKIN_BREAKPOINT 2 // break into kernel debugger
+#define BRANCH_TAKEN_BREAKPOINT 3 // branch taken breakpoint
+#define BRANCH_NOT_TAKEN_BREAKPOINT 4 // branch not taken breakpoint
+#define SINGLE_STEP_BREAKPOINT 5 // single step breakpoint
+#define DIVIDE_OVERFLOW_BREAKPOINT 6 // divide overflow breakpoint
+#define DIVIDE_BY_ZERO_BREAKPOINT 7 // divide by zero breakpoint
+#define RANGE_CHECK_BREAKPOINT 8 // range check breakpoint
+#define STACK_OVERFLOW_BREAKPOINT 9 // MIPS code
+#define MULTIPLY_OVERFLOW_BREAKPOINT 10 // multiply overflow breakpoint
+
+#define DEBUG_PRINT_BREAKPOINT 20 // debug print breakpoint
+#define DEBUG_PROMPT_BREAKPOINT 21 // debug prompt breakpoint
+#define DEBUG_STOP_BREAKPOINT 22 // debug stop breakpoint
+#define DEBUG_LOAD_SYMBOLS_BREAKPOINT 23 // load symbols breakpoint
+#define DEBUG_UNLOAD_SYMBOLS_BREAKPOINT 24 // unload symbols breakpoint
+
+//
+// Define PowerPC specific read control space commands for the
+// Kernel Debugger. These definitions are for values that must be
+// accessed via defined interfaces (Fast path System Call).
+//
+
+#define DEBUG_CONTROL_SPACE_PCR 1
+
+//
+// Define special fast path system service codes.
+//
+// N.B. These codes are VERY special. The high bit signifies a fast path
+// and the low bits signify what type.
+//
+
+#define RETRIEVE_TEB_PTR -3 // fetch address of TEB
+
+#define SET_LOW_WAIT_HIGH -2 // fast path event pair service
+#define SET_HIGH_WAIT_LOW -1 // fast path event pair service
+
+// begin_ntddk begin_nthal
+//
+
+//
+// Define size of kernel mode stack.
+//
+// **FINISH** This may not be the appropriate value for PowerPC
+
+#define KERNEL_STACK_SIZE 16384
+
+//
+// Define size of large kernel mode stack for callbacks.
+//
+
+#define KERNEL_LARGE_STACK_SIZE 61440
+
+//
+// Define number of pages to initialize in a large kernel stack.
+//
+
+#define KERNEL_LARGE_STACK_COMMIT 16384
+
+//
+// Define bus error routine type.
+//
+
+struct _EXCEPTION_RECORD;
+struct _KEXCEPTION_FRAME;
+struct _KTRAP_FRAME;
+
+typedef
+VOID
+(*PKBUS_ERROR_ROUTINE) (
+ IN struct _EXCEPTION_RECORD *ExceptionRecord,
+ IN struct _KEXCEPTION_FRAME *ExceptionFrame,
+ IN struct _KTRAP_FRAME *TrapFrame,
+ IN PVOID VirtualAddress,
+ IN PHYSICAL_ADDRESS PhysicalAddress
+ );
+
+//
+// Macros to emit eieio, sync, and isync instructions.
+//
+
+#if defined(_M_PPC) && defined(_MSC_VER) && (_MSC_VER>=1000)
+void __emit( unsigned const __int32 );
+#define __builtin_eieio() __emit( 0x7C0006AC )
+#define __builtin_sync() __emit( 0x7C0004AC )
+#define __builtin_isync() __emit( 0x4C00012C )
+#else
+void __builtin_eieio(void);
+void __builtin_sync(void);
+void __builtin_isync(void);
+#endif
+
+// end_ntddk end_nthal - Added to replace comment in the KPCR from ntmips.h
+
+//
+// Define address of data shared between user and kernel mode.
+//
+
+#define USER_SHARED_DATA ((KUSER_SHARED_DATA * const)0xFFFFE000)
+
+// begin_winnt
+
+//
+// The address of the TEB is placed into GPR 13 at context switch time
+// and should never be destroyed. To get the address of the TEB use
+// the compiler intrinsic to access it directly from GPR 13.
+//
+
+#if defined(_M_PPC) && defined(_MSC_VER) && (_MSC_VER>=1000)
+unsigned __gregister_get( unsigned const regnum );
+#define NtCurrentTeb() ((struct _TEB *)__gregister_get(13))
+#elif defined(_M_PPC)
+struct _TEB * __builtin_get_gpr13(VOID);
+#define NtCurrentTeb() ((struct _TEB *)__builtin_get_gpr13())
+#endif
+
+
+//
+// Define functions to get the address of the current fiber and the
+// current fiber data.
+//
+
+#define GetCurrentFiber() (((PNT_TIB)NtCurrentTeb())->FiberData)
+#define GetFiberData() (*(PVOID *)(GetCurrentFiber()))
+
+// begin_ntddk begin_nthal
+//
+// The following flags control the contents of the CONTEXT structure.
+//
+
+#if !defined(RC_INVOKED)
+
+#define CONTEXT_CONTROL 0x00000001L
+#define CONTEXT_FLOATING_POINT 0x00000002L
+#define CONTEXT_INTEGER 0x00000004L
+#define CONTEXT_DEBUG_REGISTERS 0x00000008L
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
+
+#endif
+
+//
+// Context Frame
+//
+// N.B. This frame must be exactly a multiple of 16 bytes in length.
+//
+// This frame has a several purposes: 1) it is used as an argument to
+// NtContinue, 2) it is used to constuct a call frame for APC delivery,
+// 3) it is used to construct a call frame for exception dispatching
+// in user mode, and 4) it is used in the user level thread creation
+// routines.
+//
+// Requires at least 8-byte alignment (double)
+//
+
+typedef struct _CONTEXT {
+
+ //
+ // This section is specified/returned if the ContextFlags word contains
+ // the flag CONTEXT_FLOATING_POINT.
+ //
+
+ double Fpr0; // Floating registers 0..31
+ double Fpr1;
+ double Fpr2;
+ double Fpr3;
+ double Fpr4;
+ double Fpr5;
+ double Fpr6;
+ double Fpr7;
+ double Fpr8;
+ double Fpr9;
+ double Fpr10;
+ double Fpr11;
+ double Fpr12;
+ double Fpr13;
+ double Fpr14;
+ double Fpr15;
+ double Fpr16;
+ double Fpr17;
+ double Fpr18;
+ double Fpr19;
+ double Fpr20;
+ double Fpr21;
+ double Fpr22;
+ double Fpr23;
+ double Fpr24;
+ double Fpr25;
+ double Fpr26;
+ double Fpr27;
+ double Fpr28;
+ double Fpr29;
+ double Fpr30;
+ double Fpr31;
+ double Fpscr; // Floating point status/control reg
+
+ //
+ // This section is specified/returned if the ContextFlags word contains
+ // the flag CONTEXT_INTEGER.
+ //
+
+ ULONG Gpr0; // General registers 0..31
+ ULONG Gpr1;
+ ULONG Gpr2;
+ ULONG Gpr3;
+ ULONG Gpr4;
+ ULONG Gpr5;
+ ULONG Gpr6;
+ ULONG Gpr7;
+ ULONG Gpr8;
+ ULONG Gpr9;
+ ULONG Gpr10;
+ ULONG Gpr11;
+ ULONG Gpr12;
+ ULONG Gpr13;
+ ULONG Gpr14;
+ ULONG Gpr15;
+ ULONG Gpr16;
+ ULONG Gpr17;
+ ULONG Gpr18;
+ ULONG Gpr19;
+ ULONG Gpr20;
+ ULONG Gpr21;
+ ULONG Gpr22;
+ ULONG Gpr23;
+ ULONG Gpr24;
+ ULONG Gpr25;
+ ULONG Gpr26;
+ ULONG Gpr27;
+ ULONG Gpr28;
+ ULONG Gpr29;
+ ULONG Gpr30;
+ ULONG Gpr31;
+
+ ULONG Cr; // Condition register
+ ULONG Xer; // Fixed point exception register
+
+ //
+ // This section is specified/returned if the ContextFlags word contains
+ // the flag CONTEXT_CONTROL.
+ //
+
+ ULONG Msr; // Machine status register
+ ULONG Iar; // Instruction address register
+ ULONG Lr; // Link register
+ ULONG Ctr; // Count register
+
+ //
+ // The flags values within this flag control the contents of
+ // a CONTEXT record.
+ //
+ // If the context record is used as an input parameter, then
+ // for each portion of the context record controlled by a flag
+ // whose value is set, it is assumed that that portion of the
+ // context record contains valid context. If the context record
+ // is being used to modify a thread's context, then only that
+ // portion of the threads context will be modified.
+ //
+ // If the context record is used as an IN OUT parameter to capture
+ // the context of a thread, then only those portions of the thread's
+ // context corresponding to set flags will be returned.
+ //
+ // The context record is never used as an OUT only parameter.
+ //
+
+ ULONG ContextFlags;
+
+ ULONG Fill[3]; // Pad out to multiple of 16 bytes
+
+ //
+ // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
+ // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
+ // included in CONTEXT_FULL.
+ //
+ ULONG Dr0; // Breakpoint Register 1
+ ULONG Dr1; // Breakpoint Register 2
+ ULONG Dr2; // Breakpoint Register 3
+ ULONG Dr3; // Breakpoint Register 4
+ ULONG Dr4; // Breakpoint Register 5
+ ULONG Dr5; // Breakpoint Register 6
+ ULONG Dr6; // Debug Status Register
+ ULONG Dr7; // Debug Control Register
+
+} CONTEXT, *PCONTEXT;
+
+// end_ntddk end_nthal
+
+
+//
+// Stack frame header
+//
+// Order of appearance in stack frame:
+// Header (six words)
+// Parameters (at least eight words)
+// Local variables
+// Saved GPRs
+// Saved FPRs
+//
+// Minimum alignment is 8 bytes
+
+typedef struct _STACK_FRAME_HEADER { // GPR 1 points here
+ ULONG BackChain; // Addr of previous frame
+ ULONG GlueSaved1; // Used by glue code
+ ULONG GlueSaved2;
+ ULONG Reserved1; // Reserved
+ ULONG Spare1; // Used by tracing, profiling, ...
+ ULONG Spare2;
+
+ ULONG Parameter0; // First 8 parameter words are
+ ULONG Parameter1; // always present
+ ULONG Parameter2;
+ ULONG Parameter3;
+ ULONG Parameter4;
+ ULONG Parameter5;
+ ULONG Parameter6;
+ ULONG Parameter7;
+
+} STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER;
+
+// end_winnt
+
+
+#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Iar)
+
+#define CONTEXT_LENGTH (sizeof(CONTEXT))
+#define CONTEXT_ALIGN (sizeof(double))
+#define CONTEXT_ROUND (CONTEXT_ALIGN - 1)
+
+//
+// Nonvolatile context pointer record.
+//
+
+typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
+ DOUBLE *FloatingContext[32];
+ PULONG FpscrContext;
+ PULONG IntegerContext[32];
+ PULONG CrContext;
+ PULONG XerContext;
+ PULONG MsrContext;
+ PULONG IarContext;
+ PULONG LrContext;
+ PULONG CtrContext;
+} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
+
+// begin_nthal
+//
+// PowerPC special-purpose registers
+//
+
+//
+// Define Machine Status Register (MSR) fields
+//
+
+typedef struct _MSR {
+ ULONG LE : 1; // 31 Little-Endian execution mode
+ ULONG RI : 1; // 30 Recoverable Interrupt
+ ULONG Rsv1 : 2; // 29..28 reserved
+ ULONG DR : 1; // 27 Data Relocate
+ ULONG IR : 1; // 26 Instruction Relocate
+ ULONG IP : 1; // 25 Interrupt Prefix
+ ULONG Rsv2 : 1; // 24 reserved
+ ULONG FE1 : 1; // 23 Floating point Exception mode 1
+ ULONG BE : 1; // 22 Branch trace Enable
+ ULONG SE : 1; // 21 Single-step trace Enable
+ ULONG FE0 : 1; // 20 Floating point Exception mode 0
+ ULONG ME : 1; // 19 Machine check Enable
+ ULONG FP : 1; // 18 Floating Point available
+ ULONG PR : 1; // 17 Problem state
+ ULONG EE : 1; // 16 External interrupt Enable
+ ULONG ILE : 1; // 15 Interrupt Little-Endian mode
+ ULONG IMPL : 1; // 14 Implementation dependent
+ ULONG POW : 1; // 13 Power management enable
+ ULONG Rsv3 : 13; // 12..0 reserved
+} MSR, *PMSR;
+
+//
+// Define Processor Version Register (PVR) fields
+//
+
+typedef struct _PVR {
+ ULONG Revision : 16;
+ ULONG Version : 16;
+} PVR, *PPVR;
+
+// end_nthal
+
+// begin_nthal
+
+//
+// Define Condition Register (CR) fields
+//
+// We name the structure CondR rather than CR, so that a pointer
+// to a condition register structure is PCondR rather than PCR.
+// (PCR is an NT data structure, the Processor Control Region.)
+
+typedef struct _CondR {
+ ULONG CR7 : 4; // Eight 4-bit fields; machine numbers
+ ULONG CR6 : 4; // them in Big-Endian order
+ ULONG CR5 : 4;
+ ULONG CR4 : 4;
+ ULONG CR3 : 4;
+ ULONG CR2 : 4;
+ ULONG CR1 : 4;
+ ULONG CR0 : 4;
+} CondR, *PCondR;
+
+//
+// Define Fixed Point Exception Register (XER) fields
+//
+
+typedef struct _XER {
+ ULONG Rsv : 29; // 31..3 Reserved
+ ULONG CA : 1; // 2 Carry
+ ULONG OV : 1; // 1 Overflow
+ ULONG SO : 1; // 0 Summary Overflow
+} XER, *PXER;
+
+//
+// Define Floating Point Status/Control Register (FPSCR) fields
+//
+
+typedef struct _FPSCR {
+ ULONG RN : 2; // 31..30 Rounding control
+ ULONG NI : 1; // 29 Non-IEEE mode
+ ULONG XE : 1; // 28 Inexact exception Enable
+ ULONG ZE : 1; // 27 Zero divide exception Enable
+ ULONG UE : 1; // 26 Underflow exception Enable
+ ULONG OE : 1; // 25 Overflow exception Enable
+ ULONG VE : 1; // 24 Invalid operation exception Enable
+ ULONG VXCVI : 1; // 23 Invalid op exception (integer convert)
+ ULONG VXSQRT : 1; // 22 Invalid op exception (square root)
+ ULONG VXSOFT : 1; // 21 Invalid op exception (software request)
+ ULONG Res1 : 1; // 20 reserved
+ ULONG FU : 1; // 19 Result Unordered or NaN
+ ULONG FE : 1; // 18 Result Equal or zero
+ ULONG FG : 1; // 17 Result Greater than or positive
+ ULONG FL : 1; // 16 Result Less than or negative
+ ULONG C : 1; // 15 Result Class descriptor
+ ULONG FI : 1; // 14 Fraction Inexact
+ ULONG FR : 1; // 13 Fraction Rounded
+ ULONG VXVC : 1; // 12 Invalid op exception (compare)
+ ULONG VXIMZ : 1; // 11 Invalid op exception (infinity * 0)
+ ULONG VXZDZ : 1; // 10 Invalid op exception (0 / 0)
+ ULONG VXIDI : 1; // 9 Invalid op exception (infinity / infinity)
+ ULONG VXISI : 1; // 8 Invalid op exception (infinity - infinity)
+ ULONG VXSNAN : 1; // 7 Invalid op exception (signalling NaN)
+ ULONG XX : 1; // 6 Inexact exception
+ ULONG ZX : 1; // 5 Zero divide exception
+ ULONG UX : 1; // 4 Underflow exception
+ ULONG OX : 1; // 3 Overflow exception
+ ULONG VX : 1; // 2 Invalid operation exception summary
+ ULONG FEX : 1; // 1 Enabled Exception summary
+ ULONG FX : 1; // 0 Exception summary
+} FPSCR, *PFPSCR;
+
+// end_nthal
+
+// begin_nthal
+//
+// Define address space layout as defined by PowerPC memory management.
+//
+// The names come from MIPS hardwired virtual to first 512MB real.
+// We use these values to define the size of the PowerPC kernel BAT.
+// Must coordinate with values in ../private/mm/ppc/mippc.h.
+// This is 8MB on the PowerPC 601; may be larger for other models.
+//
+//
+
+#define KUSEG_BASE 0x0 // base of user segment
+#define KSEG0_BASE 0x80000000 // base of kernel BAT
+#define KSEG1_BASE PCR->Kseg0Top // end of kernel BAT
+#define KSEG2_BASE KSEG1_BASE // end of kernel BAT
+
+//
+// A valid Page Table Entry has the following definition
+//
+
+typedef struct _HARDWARE_PTE {
+ ULONG Dirty : 2;
+ ULONG Valid : 1; // software
+ ULONG GuardedStorage : 1;
+ ULONG MemoryCoherence : 1;
+ ULONG CacheDisable : 1;
+ ULONG WriteThrough : 1;
+ ULONG Change : 1;
+ ULONG Reference : 1;
+ ULONG Write : 1; // software
+ ULONG CopyOnWrite : 1; // software
+ ULONG rsvd1 : 1;
+ ULONG PageFrameNumber : 20;
+} HARDWARE_PTE, *PHARDWARE_PTE;
+
+#define HARDWARE_PTE_DIRTY_MASK 0x3
+
+// end_nthal
+
+
+//
+// Define PowerPC exception handling structures and function prototypes.
+//
+// These are adopted without change from the MIPS implementation.
+//
+
+//
+// Function table entry structure definition.
+//
+
+typedef struct _RUNTIME_FUNCTION {
+ ULONG BeginAddress;
+ ULONG EndAddress;
+ PEXCEPTION_ROUTINE ExceptionHandler;
+ PVOID HandlerData;
+ ULONG PrologEndAddress;
+} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
+
+//
+// Scope table structure definition.
+//
+
+typedef struct _SCOPE_TABLE {
+ ULONG Count;
+ struct
+ {
+ ULONG BeginAddress;
+ ULONG EndAddress;
+ ULONG HandlerAddress;
+ ULONG JumpTarget;
+ } ScopeRecord[1];
+} SCOPE_TABLE, *PSCOPE_TABLE;
+
+//
+// Runtime Library function prototypes.
+//
+
+VOID
+RtlCaptureContext (
+ OUT PCONTEXT ContextRecord
+ );
+
+PRUNTIME_FUNCTION
+RtlLookupFunctionEntry (
+ IN ULONG ControlPc
+ );
+
+ULONG
+RtlVirtualUnwind (
+ IN ULONG ControlPc,
+ IN PRUNTIME_FUNCTION FunctionEntry,
+ IN OUT PCONTEXT ContextRecord,
+ OUT PBOOLEAN InFunction,
+ OUT PULONG EstablisherFrame,
+ IN OUT PKNONVOLATILE_CONTEXT_POINTERS ContextPointers OPTIONAL,
+ IN ULONG LowStackLimit,
+ IN ULONG HighStackLimit
+ );
+
+//
+// Define C structured exception handing function prototypes.
+//
+
+typedef struct _DISPATCHER_CONTEXT {
+ ULONG ControlPc;
+ PRUNTIME_FUNCTION FunctionEntry;
+ ULONG EstablisherFrame;
+ PCONTEXT ContextRecord;
+} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+
+
+struct _EXCEPTION_POINTERS;
+
+typedef
+LONG
+(*EXCEPTION_FILTER) (
+ struct _EXCEPTION_POINTERS *ExceptionPointers
+ );
+
+typedef
+VOID
+(*TERMINATION_HANDLER) (
+ BOOLEAN is_abnormal
+ );
+
+// **FINISH** This may need alteration for PowerPC
+// begin_winnt
+
+VOID
+__jump_unwind (
+ PVOID Fp,
+ PVOID TargetPc
+ );
+
+// end_winnt
+
+// begin_ntddk begin_nthal begin_windbgkd begin_winnt
+#endif // defined(_PPC_)
+// end_ntddk end_nthal end_windbgkd end_winnt
+
+#endif // _NTPPC_
+