|
|
/*++ BUILD Version: 0015 // Increment this if a change has global effects
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
ntmips.h
Abstract:
User-mode visible Mips specific structures and constants
Author:
David N. Cutler (davec) 31-Mar-1990
Revision History:
--*/
#ifndef _NTMIPS_
#define _NTMIPS_
#if _MSC_VER > 1000
#pragma once
#endif
#include "mipsinst.h"
#ifdef __cplusplus
extern "C" { #endif
// begin_ntddk begin_wdm begin_nthal
#if defined(_MIPS_)
//
// Define system time structure.
//
typedef union _KSYSTEM_TIME { struct { ULONG LowPart; LONG High1Time; LONG High2Time; };
ULONGLONG Alignment; } KSYSTEM_TIME, *PKSYSTEM_TIME;
//
// Define unsupported "keywords".
//
#define _cdecl
#if defined(_MIPS_)
// end_ntddk end_wdm end_nthal
//
// Define breakpoint codes.
//
#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
// begin_ntddk begin_nthal
//
// Define size of kernel mode stack.
//
#define KERNEL_STACK_SIZE 12288
//
// 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 12288
// begin_wdm
//
// Define length of exception code dispatch vector.
//
#define XCODE_VECTOR_LENGTH 32
//
// Define length of interrupt vector table.
//
#define MAXIMUM_VECTOR 256
//
// Define bus error routine type.
//
struct _EXCEPTION_RECORD; struct _KEXCEPTION_FRAME; struct _KTRAP_FRAME;
typedef BOOLEAN (*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 );
//
// Define Processor Control Region Structure.
//
#define PCR_MINOR_VERSION 1
#define PCR_MAJOR_VERSION 1
typedef struct _KPCR {
//
// Major and minor version numbers of the PCR.
//
USHORT MinorVersion; USHORT MajorVersion;
//
// Start of the architecturally defined section of the PCR. This section
// may be directly addressed by vendor/platform specific HAL code and will
// not change from version to version of NT.
//
// Interrupt and error exception vectors.
//
PKINTERRUPT_ROUTINE InterruptRoutine[MAXIMUM_VECTOR]; PVOID XcodeDispatch[XCODE_VECTOR_LENGTH];
//
// First and second level cache parameters.
//
ULONG FirstLevelDcacheSize; ULONG FirstLevelDcacheFillSize; ULONG FirstLevelIcacheSize; ULONG FirstLevelIcacheFillSize; ULONG SecondLevelDcacheSize; ULONG SecondLevelDcacheFillSize; ULONG SecondLevelIcacheSize; ULONG SecondLevelIcacheFillSize;
//
// Pointer to processor control block.
//
struct _KPRCB *Prcb;
//
// Pointer to the thread environment block and the address of the TLS array.
//
PVOID Teb; PVOID TlsArray;
//
// Data fill size used for cache flushing and alignment. This field is set
// to the larger of the first and second level data cache fill sizes.
//
ULONG DcacheFillSize;
//
// Instruction cache alignment and fill size used for cache flushing and
// alignment. These fields are set to the larger of the first and second
// level data cache fill sizes.
//
ULONG IcacheAlignment; ULONG IcacheFillSize;
//
// Processor identification from PrId register.
//
ULONG ProcessorId;
//
// Profiling data.
//
ULONG ProfileInterval; ULONG ProfileCount;
//
// Stall execution count and scale factor.
//
ULONG StallExecutionCount; ULONG StallScaleFactor;
//
// Processor number.
//
CCHAR Number;
//
// Spare cells.
//
CCHAR Spareb1; CCHAR Spareb2; CCHAR Spareb3;
//
// Pointers to bus error and parity error routines.
//
PKBUS_ERROR_ROUTINE DataBusError; PKBUS_ERROR_ROUTINE InstructionBusError;
//
// Cache policy, right justified, as read from the processor configuration
// register at startup.
//
ULONG CachePolicy;
//
// IRQL mapping tables.
//
UCHAR IrqlMask[32]; UCHAR IrqlTable[9];
//
// Current IRQL.
//
UCHAR CurrentIrql;
//
// Processor affinity mask.
//
KAFFINITY SetMember;
//
// Reserved interrupt vector mask.
//
ULONG ReservedVectors;
//
// Current state parameters.
//
struct _KTHREAD *CurrentThread;
//
// Cache policy, PTE field aligned, as read from the processor configuration
// register at startup.
//
ULONG AlignedCachePolicy;
//
// Complement of processor affinity mask.
//
KAFFINITY NotMember;
//
// Space reserved for the system.
//
ULONG SystemReserved[15];
//
// Data cache alignment used for cache flushing and alignment. This field is
// set to the larger of the first and second level data cache fill sizes.
//
ULONG DcacheAlignment;
//
// Space reserved for the HAL
//
ULONG HalReserved[16];
//
// End of the architecturally defined section of the PCR. This section
// may be directly addressed by vendor/platform specific HAL code and will
// not change from version to version of NT.
//
// end_ntddk end_wdm end_nthal
//
// Start of the operating system release dependent section of the PCR.
// This section may change from release to release and should not be
// addressed by vendor/platform specific HAL code.
//
// Function active flags.
//
ULONG FirstLevelActive; ULONG DpcRoutineActive;
//
// Current process id.
//
ULONG CurrentPid;
//
// On interrupt stack indicator, saved initial stack, and saved stack limit.
//
ULONG OnInterruptStack; PVOID SavedInitialStack; PVOID SavedStackLimit;
//
// System service dispatch start and end address used by get/set context.
//
ULONG SystemServiceDispatchStart; ULONG SystemServiceDispatchEnd;
//
// Interrupt stack.
//
PVOID InterruptStack;
//
// Panic stack.
//
PVOID PanicStack;
//
// Exception handler values.
//
ULONG Sparel1; PVOID InitialStack; PVOID StackLimit; ULONG SavedEpc; ULONGLONG SavedT7; ULONGLONG SavedT8; ULONGLONG SavedT9; PVOID SystemGp;
//
// Quantum end flag.
//
ULONG QuantumEnd;
//
// Bad virtual address and fault bad virtual address.
//
ULONGLONG BadVaddr; ULONGLONG TmpVaddr; } KPCR, *PKPCR; // ntddk wdm nthal
//
// Define Address of Processor Control Registers.
//
#define USPCR 0x7ffff000 // user address of first PCR
#define USPCR2 0x7fffe000 // user address of second PCR
//
// Define Pointer to Processor Control Registers.
//
#define USER_PCR ((KPCR * const)USPCR)
#if defined(NTOS_KERNEL_RUNTIME)
#define NtCurrentTeb() ((PTEB)(PCR->Teb))
#define USER_SHARED_DATA ((KUSER_SHARED_DATA * const)0xffffe000)
#else
#define NtCurrentTeb() ((PTEB)(USER_PCR->Teb))
#define USER_SHARED_DATA ((KUSER_SHARED_DATA * const)0x7fffe000)
#endif
//
// Define get system time macro.
//
// N.B. This macro can be changed when the compiler generates real double
// integer instructions.
//
#define QUERY_SYSTEM_TIME(CurrentTime) \
*((DOUBLE *)(CurrentTime)) = *((DOUBLE *)(&USER_SHARED_DATA->SystemTime))
// begin_winnt
#if defined(_MIPS_)
//
// Define functions to get the address of the current fiber and the
// current fiber data.
//
#define GetCurrentFiber() ((*(PNT_TIB *)0x7ffff4a8)->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_R4000 0x00010000 // r4000 context
#define CONTEXT_CONTROL (CONTEXT_R4000 | 0x00000001)
#define CONTEXT_FLOATING_POINT (CONTEXT_R4000 | 0x00000002)
#define CONTEXT_INTEGER (CONTEXT_R4000 | 0x00000004)
#define CONTEXT_EXTENDED_FLOAT (CONTEXT_FLOATING_POINT | 0x00000008)
#define CONTEXT_EXTENDED_INTEGER (CONTEXT_INTEGER | 0x00000010)
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | \
CONTEXT_INTEGER | CONTEXT_EXTENDED_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.
//
// The layout of the record conforms to a standard call frame.
//
typedef struct _CONTEXT {
//
// This section is always present and is used as an argument build
// area.
//
// N.B. Context records are 0 mod 8 aligned starting with NT 4.0.
//
union { ULONG Argument[4]; ULONGLONG Alignment; };
//
// The following union defines the 32-bit and 64-bit register context.
//
union {
//
// 32-bit context.
//
struct {
//
// This section is specified/returned if the ContextFlags contains
// the flag CONTEXT_FLOATING_POINT.
//
// N.B. This section contains the 16 double floating registers f0,
// f2, ..., f30.
//
ULONG FltF0; ULONG FltF1; ULONG FltF2; ULONG FltF3; ULONG FltF4; ULONG FltF5; ULONG FltF6; ULONG FltF7; ULONG FltF8; ULONG FltF9; ULONG FltF10; ULONG FltF11; ULONG FltF12; ULONG FltF13; ULONG FltF14; ULONG FltF15; ULONG FltF16; ULONG FltF17; ULONG FltF18; ULONG FltF19; ULONG FltF20; ULONG FltF21; ULONG FltF22; ULONG FltF23; ULONG FltF24; ULONG FltF25; ULONG FltF26; ULONG FltF27; ULONG FltF28; ULONG FltF29; ULONG FltF30; ULONG FltF31;
//
// This section is specified/returned if the ContextFlags contains
// the flag CONTEXT_INTEGER.
//
// N.B. The registers gp, sp, and ra are defined in this section,
// but are considered part of the control context rather than
// part of the integer context.
//
// N.B. Register zero is not stored in the frame.
//
ULONG IntZero; ULONG IntAt; ULONG IntV0; ULONG IntV1; ULONG IntA0; ULONG IntA1; ULONG IntA2; ULONG IntA3; ULONG IntT0; ULONG IntT1; ULONG IntT2; ULONG IntT3; ULONG IntT4; ULONG IntT5; ULONG IntT6; ULONG IntT7; ULONG IntS0; ULONG IntS1; ULONG IntS2; ULONG IntS3; ULONG IntS4; ULONG IntS5; ULONG IntS6; ULONG IntS7; ULONG IntT8; ULONG IntT9; ULONG IntK0; ULONG IntK1; ULONG IntGp; ULONG IntSp; ULONG IntS8; ULONG IntRa; ULONG IntLo; ULONG IntHi;
//
// This section is specified/returned if the ContextFlags word contains
// the flag CONTEXT_FLOATING_POINT.
//
ULONG Fsr;
//
// This section is specified/returned if the ContextFlags word contains
// the flag CONTEXT_CONTROL.
//
// N.B. The registers gp, sp, and ra are defined in the integer section,
// but are considered part of the control context rather than part of
// the integer context.
//
ULONG Fir; ULONG Psr;
//
// 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; };
//
// 64-bit context.
//
struct {
//
// This section is specified/returned if the ContextFlags contains
// the flag CONTEXT_EXTENDED_FLOAT.
//
// N.B. This section contains the 32 double floating registers f0,
// f1, ..., f31.
//
ULONGLONG XFltF0; ULONGLONG XFltF1; ULONGLONG XFltF2; ULONGLONG XFltF3; ULONGLONG XFltF4; ULONGLONG XFltF5; ULONGLONG XFltF6; ULONGLONG XFltF7; ULONGLONG XFltF8; ULONGLONG XFltF9; ULONGLONG XFltF10; ULONGLONG XFltF11; ULONGLONG XFltF12; ULONGLONG XFltF13; ULONGLONG XFltF14; ULONGLONG XFltF15; ULONGLONG XFltF16; ULONGLONG XFltF17; ULONGLONG XFltF18; ULONGLONG XFltF19; ULONGLONG XFltF20; ULONGLONG XFltF21; ULONGLONG XFltF22; ULONGLONG XFltF23; ULONGLONG XFltF24; ULONGLONG XFltF25; ULONGLONG XFltF26; ULONGLONG XFltF27; ULONGLONG XFltF28; ULONGLONG XFltF29; ULONGLONG XFltF30; ULONGLONG XFltF31;
//
// The following sections must exactly overlay the 32-bit context.
//
ULONG Fill1; ULONG Fill2;
//
// This section is specified/returned if the ContextFlags contains
// the flag CONTEXT_FLOATING_POINT.
//
ULONG XFsr;
//
// This section is specified/returned if the ContextFlags contains
// the flag CONTEXT_CONTROL.
//
// N.B. The registers gp, sp, and ra are defined in the integer
// section, but are considered part of the control context
// rather than part of the integer context.
//
ULONG XFir; ULONG XPsr;
//
// 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 XContextFlags;
//
// This section is specified/returned if the ContextFlags contains
// the flag CONTEXT_EXTENDED_INTEGER.
//
// N.B. The registers gp, sp, and ra are defined in this section,
// but are considered part of the control context rather than
// part of the integer context.
//
// N.B. Register zero is not stored in the frame.
//
ULONGLONG XIntZero; ULONGLONG XIntAt; ULONGLONG XIntV0; ULONGLONG XIntV1; ULONGLONG XIntA0; ULONGLONG XIntA1; ULONGLONG XIntA2; ULONGLONG XIntA3; ULONGLONG XIntT0; ULONGLONG XIntT1; ULONGLONG XIntT2; ULONGLONG XIntT3; ULONGLONG XIntT4; ULONGLONG XIntT5; ULONGLONG XIntT6; ULONGLONG XIntT7; ULONGLONG XIntS0; ULONGLONG XIntS1; ULONGLONG XIntS2; ULONGLONG XIntS3; ULONGLONG XIntS4; ULONGLONG XIntS5; ULONGLONG XIntS6; ULONGLONG XIntS7; ULONGLONG XIntT8; ULONGLONG XIntT9; ULONGLONG XIntK0; ULONGLONG XIntK1; ULONGLONG XIntGp; ULONGLONG XIntSp; ULONGLONG XIntS8; ULONGLONG XIntRa; ULONGLONG XIntLo; ULONGLONG XIntHi; }; }; } CONTEXT, *PCONTEXT;
// end_ntddk end_nthal
#define CONTEXT32_LENGTH 0x130 // The original 32-bit Context length (pre NT 4.0)
#endif // MIPS
// end_winnt
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Fir)
#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 { PULONG FloatingContext[20]; PULONG FltF20; PULONG FltF21; PULONG FltF22; PULONG FltF23; PULONG FltF24; PULONG FltF25; PULONG FltF26; PULONG FltF27; PULONG FltF28; PULONG FltF29; PULONG FltF30; PULONG FltF31; PULONGLONG XIntegerContext[16]; PULONGLONG XIntS0; PULONGLONG XIntS1; PULONGLONG XIntS2; PULONGLONG XIntS3; PULONGLONG XIntS4; PULONGLONG XIntS5; PULONGLONG XIntS6; PULONGLONG XIntS7; PULONGLONG XIntT8; PULONGLONG XIntT9; PULONGLONG XIntK0; PULONGLONG XIntK1; PULONGLONG XIntGp; PULONGLONG XIntSp; PULONGLONG XIntS8; PULONGLONG XIntRa; } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
// begin_nthal
//
// Define R4000 system coprocessor registers.
//
// Define index register fields.
//
typedef struct _INDEX { ULONG INDEX : 6; ULONG X1 : 25; ULONG P : 1; } INDEX;
//
// Define random register fields.
//
typedef struct _RANDOM { ULONG INDEX : 6; ULONG X1 : 26; } RANDOM;
//
// Define TB entry low register fields.
//
typedef struct _ENTRYLO { ULONG G : 1; ULONG V : 1; ULONG D : 1; ULONG C : 3; ULONG PFN : 24; ULONG X1 : 2; } ENTRYLO, *PENTRYLO;
//
// Define R4000 PTE format for memory management.
//
// N.B. This must map exactly over the entrylo register.
//
typedef struct _HARDWARE_PTE { ULONG Global : 1; ULONG Valid : 1; ULONG Dirty : 1; ULONG CachePolicy : 3; ULONG PageFrameNumber : 24; ULONG Write : 1; ULONG CopyOnWrite : 1; } HARDWARE_PTE, *PHARDWARE_PTE;
#define HARDWARE_PTE_DIRTY_MASK 0x4
//
// Define R4000 macro to initialize page directory table base.
//
#define INITIALIZE_DIRECTORY_TABLE_BASE(dirbase, pfn) \
((HARDWARE_PTE *)(dirbase))->PageFrameNumber = pfn; \ ((HARDWARE_PTE *)(dirbase))->Global = 0; \ ((HARDWARE_PTE *)(dirbase))->Valid = 1; \ ((HARDWARE_PTE *)(dirbase))->Dirty = 1; \ ((HARDWARE_PTE *)(dirbase))->CachePolicy = PCR->CachePolicy
//
// Define page mask register fields.
//
typedef struct _PAGEMASK { ULONG X1 : 13; ULONG PAGEMASK : 12; ULONG X2 : 7; } PAGEMASK, *PPAGEMASK;
//
// Define wired register fields.
//
typedef struct _WIRED { ULONG NUMBER : 6; ULONG X1 : 26; } WIRED;
//
// Define TB entry high register fields.
//
typedef struct _ENTRYHI { ULONG PID : 8; ULONG X1 : 5; ULONG VPN2 : 19; } ENTRYHI, *PENTRYHI;
//
// Define processor status register fields.
//
typedef struct _PSR { ULONG IE : 1; ULONG EXL : 1; ULONG ERL : 1; ULONG KSU : 2; ULONG UX : 1; ULONG SX : 1; ULONG KX : 1; ULONG INTMASK : 8; ULONG DE : 1; ULONG CE : 1; ULONG CH : 1; ULONG X1 : 1; ULONG SR : 1; ULONG TS : 1; ULONG BEV : 1; ULONG X2 : 2; ULONG RE : 1; ULONG FR : 1; ULONG RP : 1; ULONG CU0 : 1; ULONG CU1 : 1; ULONG CU2 : 1; ULONG CU3 : 1; } PSR, *PPSR;
//
// Define configuration register fields.
//
typedef struct _CONFIGR { ULONG K0 : 3; ULONG CU : 1; ULONG DB : 1; ULONG IB : 1; ULONG DC : 3; ULONG IC : 3; ULONG X1 : 1; ULONG EB : 1; ULONG EM : 1; ULONG BE : 1; ULONG SM : 1; ULONG SC : 1; ULONG EW : 2; ULONG SW : 1; ULONG SS : 1; ULONG SB : 2; ULONG EP : 4; ULONG EC : 3; ULONG CM : 1; } CONFIGR;
//
// Define ECC register fields.
//
typedef struct _ECC { ULONG ECC : 8; ULONG X1 : 24; } ECC;
//
// Define cache error register fields.
//
typedef struct _CACHEERR { ULONG PIDX : 3; ULONG SIDX : 19; ULONG X1 : 2; ULONG EI : 1; ULONG EB : 1; ULONG EE : 1; ULONG ES : 1; ULONG ET : 1; ULONG ED : 1; ULONG EC : 1; ULONG ER : 1; } CACHEERR;
//
// Define R4000 cause register fields.
//
typedef struct _CAUSE { ULONG X1 : 2; ULONG XCODE : 5; ULONG X2 : 1; ULONG INTPEND : 8; ULONG X3 : 12; ULONG CE : 2; ULONG X4 : 1; ULONG BD : 1; } CAUSE;
//
// Define R4000 processor id register fields.
//
typedef struct _PRID { ULONG REV : 8; ULONG IMP : 8; ULONG X1 : 16; } PRID;
// end_nthal
// begin_nthal
//
// Define R4000 floating status register field definitions.
//
typedef struct _FSR { ULONG RM : 2; ULONG SI : 1; ULONG SU : 1; ULONG SO : 1; ULONG SZ : 1; ULONG SV : 1; ULONG EI : 1; ULONG EU : 1; ULONG EO : 1; ULONG EZ : 1; ULONG EV : 1; ULONG XI : 1; ULONG XU : 1; ULONG XO : 1; ULONG XZ : 1; ULONG XV : 1; ULONG XE : 1; ULONG X1 : 5; ULONG CC : 1; ULONG FS : 1; ULONG X2 : 7; } FSR, *PFSR;
// end_nthal
// begin_nthal
//
// Define address space layout as defined by MIPS memory management.
//
#define KUSEG_BASE 0x0 // base of user segment
#define KSEG0_BASE 0x80000000 // 32-bit base of cached kernel physical
#define KSEG0_BASE64 0xffffffff80000000 // 64-bit base of cached kernel physical
#define KSEG1_BASE 0xa0000000 // 32-bit base of uncached kernel physical
#define KSEG1_BASE64 0xffffffffa0000000 // 64-bit base of uncached kernel physical
#define KSEG2_BASE 0xc0000000 // 32-bit base of cached kernel virtual
#define KSEG2_BASE64 0xffffffffc0000000 // 64-bit base of cached kernel virtual
// end_nthal
//
// Define MIPS exception handling structures and function prototypes.
//
// 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 );
//
// 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 );
// begin_winnt
#if defined(_MIPS_)
VOID __jump_unwind ( PVOID Fp, PVOID TargetPc );
#endif // MIPS
// end_winnt
// begin_ntddk begin_wdm begin_nthal
#endif // defined(_MIPS_)
// end_ntddk end_wdm end_nthal
#ifdef __cplusplus
} #endif
#endif // _NTMIPS_
|