675 lines
18 KiB
C
675 lines
18 KiB
C
/*++
|
||
|
||
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_
|