|
|
/*++
Copyright (c) 1993 IBM Corporation
Module Name:
ntmppc.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:
Susia 01-12-97 Modified from NTPPC.H to support Macintosh PPC builds. --*/
#ifndef _NTMPPC_ #define _NTMPPC_ #if _MSC_VER > 1000 #pragma once #endif
#include "ppcinst.h"
#ifdef __cplusplus extern "C" { #endif
// begin_ntddk begin_nthal begin_winnt
#if defined(_MPPC_)
// 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
// // 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 DEBUG_COMMAND_STRING_BREAKPOINT 25 // command string 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_MPPC) && 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_winnt #endif // defined(_MPPC_) // end_ntddk end_nthal end_winnt
#ifdef __cplusplus } #endif
#endif // _NTMPPC_
|