|
|
/*++
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_
#if _MSC_VER > 1000
#pragma once
#endif
#include "ppcinst.h"
#ifdef __cplusplus
extern "C" { #endif
// begin_ntddk begin_wdm begin_nthal begin_winnt
#if defined(_PPC_)
// 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_wdm 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
// begin_wdm
//
// 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_wdm 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_wdm begin_nthal begin_winnt
#endif // defined(_PPC_)
// end_ntddk end_wdm end_nthal end_winnt
#ifdef __cplusplus
} #endif
#endif // _NTPPC_
|