⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nkarm.h

📁 wince下的源代码集合打包
💻 H
字号:
/*++ BUILD Version: 0016    Increment this if a change has global effectsCopyright (c) 1990-2000 Microsoft Corporation.  All rights reserved.Module Name:    nkarm.hAbstract:    User-mode visible ARM specific structures and constants--*/#ifndef _NKARM_#define _NKARM_// begin_ntddk begin_nthal#if defined(ARM)#define _cdecl// begin_windbgkd//// Define ARM specific kernel debugger information.//// The following structure contains machine specific data passed to// the host system kernel debugger in a wait state change message.//#define DBGKD_MAXSTREAM 16typedef 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.//#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 breakpointtypedef struct _CPUCONTEXT {	ULONG Psr;	ULONG R0;	ULONG R1;	ULONG R2;	ULONG R3;	ULONG R4;	ULONG R5;	ULONG R6;	ULONG R7;	ULONG R8;	ULONG R9;	ULONG R10;	ULONG R11;	ULONG R12;	ULONG Sp;	ULONG Lr;	ULONG Pc;} CPUCONTEXT, *PCPUCONTEXT;#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Pc)#define CONTEXT_LENGTH (sizeof(CPUCONTEXT))#define CONTEXT_ALIGN (sizeof(ULONG))#define CONTEXT_ROUND (CONTEXT_ALIGN - 1)// ARM processor modes#define USER_MODE	0x10	// 0b10000#define FIQ_MODE	0x11	// 0b10001#define IRQ_MODE	0x12	// 0b10010#define SVC_MODE	0x13	// 0b10011#define ABORT_MODE	0x17	// 0b10111#define UNDEF_MODE	0x1b	// 0b11011#define SYSTEM_MODE 0x1f	// 0b11111// Other state bits in the processor status register#define THUMB_STATE 0x20#define FIQ_DISABLE 0x40#define IRQ_DISABLE 0x80/* Query & set thread's kernel vs. user mode state */#define KERNEL_MODE     SYSTEM_MODE#define SR_MODE_MASK	0x1f#define GetThreadMode(pth) ((pth)->ctx.Psr & SR_MODE_MASK)#define SetThreadMode(pth, mode) \        ((pth)->ctx.Psr = ((pth)->ctx.Psr&~SR_MODE_MASK) | (mode))/* Query & set kernel vs. user mode state via Context */#define GetContextMode(pctx) ((pctx)->Psr & SR_MODE_MASK)#define SetContextMode(pctx, mode)	\		((pctx)->Psr = ((pctx)->Psr&~SR_MODE_MASK) | (mode))#define SWITCHKEY(oldval, newval) ((oldval) = (pCurThread)->aky, (pCurThread)->aky = (newval))#define GETCURKEY() ((pCurThread)->aky)#define SETCURKEY(newval) ((pCurThread)->aky = (newval))// begin_nthal//// Define address space layout as defined by ARM memory management.//#define KUSEG_BASE 0x0                  // base of user segment#define KSEG0_BASE 0x80000000           // base of cached kernel physical#define KSEG1_BASE 0xa0000000           // base of uncached kernel physical#define KSEG2_BASE 0xc0000000           // base of cached kernel virtual// end_nthal//// Define ARM 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.//VOIDRtlCaptureContext (    OUT PCONTEXT ContextRecord    );ULONGRtlVirtualUnwind (    IN ULONG ControlPc,    IN PRUNTIME_FUNCTION FunctionEntry,    IN OUT PCONTEXT ContextRecord,    OUT PBOOLEAN InFunction,    OUT PULONG EstablisherFrame    );//// Define C structured exception handing function prototypes.//struct _EXCEPTION_POINTERS;typedefLONG(*EXCEPTION_FILTER) (    ULONG EstablisherFrame,    struct _EXCEPTION_POINTERS *ExceptionPointers    );typedefVOID(*TERMINATION_HANDLER) (    ULONG EstablisherFrame,    BOOLEAN is_abnormal    );// begin_ntddk begin_nthal#define retValue ctx.R0#define ARG0    ctx.R0#define SetThreadIP(pth, addr) ((pth)->ctx.Pc = (ULONG)(addr))#define GetThreadIP(pth) ((pth)->ctx.Pc)/* Macros for handling stack shrinkage. */#define MDTestStack(pth)    (((pth)->ctx.Sp < 0x80000000          \        && ((pth)->dwStackBound>>VA_PAGE) < (((pth)->ctx.Sp-32)>>VA_PAGE))  \        ? (pth)->dwStackBound : 0)#define MDShrinkStack(pth)  ((pth)->dwStackBound += PAGE_SIZE)// Trap id values shared between C & ASM code.#define ID_RESCHEDULE		0	// NOP used to force a reschedule#define ID_UNDEF_INSTR		1	// undefined instruction#define ID_SWI_INSTR		2	// SWI instruction#define ID_PREFETCH_ABORT	3	// code page fault#define ID_DATA_ABORT		4	// data page fault or bus error#define ID_IRQ				5	// external h/w interrupt// The following codes are used internally by the kernel.#define ID_STACK_FAULT	8#define ID_HW_BREAK		9#include "mem_arm.h"struct KDataStruct {	LPDWORD	lpvTls;			/* 0x000 Current thread local storage pointer */    HANDLE 	ahSys[NUM_SYS_HANDLES]; /* 0x004 If this moves, change kapi.h */    char    bResched;       /* 0x084 reschedule flag */    char    cNest;          /* 0x085 kernel exception nesting */    char    bPowerOff;      /* 0x086 TRUE during "power off" processing */    char    bProfileOn;     /* 0x087 TRUE if profiling enabled */    ulong   ptDesc;         /* 0x088 Page Table Descriptor */    ulong   rsvd2;          /* 0x08c was DiffMSec */	PPROCESS pCurPrc;		/* 0x090 ptr to current PROCESS struct */	PTHREAD	pCurThd;		/* 0x094 ptr to current THREAD struct */	DWORD	dwKCRes;	    /* 0x098  */	ulong	handleBase;		/* 0x09c handle table base address */	PSECTION aSections[64]; /* 0x0a0 section table for virutal memory */	LPEVENT alpeIntrEvents[SYSINTR_MAX_DEVICES];/* 0x1a0 */	LPVOID  alpvIntrData[SYSINTR_MAX_DEVICES];  /* 0x220 */	ulong	pAPIReturn;		/* 0x2a0 direct API return address for kernel mode */	uchar	*pMap;			/* 0x2a4 ptr to MemoryMap array */	DWORD	dwInDebugger;	/* 0x2a8 !0 when in debugger */	long    alPad[21];      /* 0x2ac - padding */	DWORD   aInfo[32];      /* 0x300 - misc. kernel info */	                        /* 0x380 - interlocked api code */	                        /* 0x400 - end */};  /* KDataStruct *//* High memory layout * * This structure is mapped in at the end of the 4GB virtual * address space. * *  0xFFFD0000 - first level page table (uncached) (2nd half is r/o) *  0xFFFD4000 - disabled for protection *  0xFFFE0000 - second level page tables (uncached) *  0xFFFE4000 - disabled for protection *  0xFFFF0000 - exception vectors *  0xFFFF0400 - not used (r/o) *  0xFFFF1000 - disabled for protection *  0xFFFF2000 - r/o (physical overlaps with vectors) *  0xFFFF2400 - Interrupt stack (1k) *  0xFFFF2800 - r/o (physical overlaps with Abort stack & FIQ stack) *  0xFFFF3000 - disabled for protection *  0xFFFF4000 - r/o (physical memory overlaps with vectors & intr. stack & FIQ stack) *  0xFFFF4900 - Abort stack (2k - 256 bytes) *  0xFFFF5000 - disabled for protection *  0xFFFF6000 - r/o (physical memory overlaps with vectors & intr. stack) *  0xFFFF6800 - FIQ stack (256 bytes) *  0xFFFF6900 - r/o (physical memory overlaps with Abort stack) *  0xFFFF7000 - disabled *  0xFFFFC000 - kernel stack *  0xFFFFC800 - KDataStruct *  0xFFFFCC00 - disabled for protection (2nd level page table for 0xFFF00000) */typedef struct _PAGETBL {	ulong	PTEs[256];} PAGETBL;typedef struct ARM_HIGH {	ulong	firstPT[4096];		// 0xFFFD0000: 1st level page table	PAGETBL	aPT[16];			// 0xFFFD4000: 2nd level page tables	char	reserved2[0x20000-0x4000-16*sizeof(PAGETBL)];	char	exVectors[0x400];	// 0xFFFF0000: exception vectors	char	reserved3[0x2400-0x400];	char	intrStack[0x400];	// 0xFFFF2400: interrupt stack	char	reserved4[0x4900-0x2800];	char	abortStack[0x700];	// 0xFFFF4900: abort stack	char	reserved5[0x6800-0x5000];	char	fiqStack[0x100];	// 0xFFFF6800: FIQ stack	char	reserved6[0xC000-0x6900];	char	kStack[0x800];		// 0xFFFFC000: kernel stack	struct KDataStruct kdata;	// 0xFFFFC800: kernel data page} ARM_HIGH;#define ArmHigh	((ARM_HIGH *)0xFFFD0000)#define FirstPT (ArmHigh->firstPT)#define PageTables (ArmHigh->aPT)#define KData	(ArmHigh->kdata)#define VKData	(*(volatile struct KDataStruct *)&KData)ERRFALSE((ulong)PUserKData==(ulong)&KData);#define hCurThread  (KData.ahSys[SH_CURTHREAD])#define hCurProc    (KData.ahSys[SH_CURPROC])#define pCurThread	(KData.pCurThd)#define pCurProc	(KData.pCurPrc)#define ReschedFlag (KData.bResched)#define PowerOffFlag (KData.bPowerOff)#define ProfileFlag (KData.bProfileOn)#define CurAKey     (pCurThread->aky)#define SectionTable (KData.aSections)#define MustReschedule()	(*(ushort*)&KData.bResched == 1)#define IntrEvents  (KData.alpeIntrEvents)#define IntrData    (KData.alpvIntrData)#define KPlpvTls	(KData.lpvTls)#define KInfoTable  (KData.aInfo)#define DIRECT_RETURN (KData.pAPIReturn)#define MemoryMap	(KData.pMap)#define	InDebugger	(KData.dwInDebugger)#define PageTableDescriptor	(KData.ptDesc)#define KCResched	(KData.dwKCRes)extern DWORD CurMSec;extern DWORD DiffMSec;extern int InSysCall(void);extern void INTERRUPTS_ON(void);extern void INTERRUPTS_OFF(void);#ifdef InterlockedCompareExchange#undef InterlockedCompareExchange#endif#define InterlockedExchange \        ((LONG (*)(LPLONG Target, LONG Value))(PUserKData+0x3D4))#define InterlockedExchangeAdd \		((long (*)(long *target, long increment))(PUserKData+0x3C0))#define InterlockedCompareExchange \		((void *(*)(void **target, void *newValue, void *comparand))\		(PUserKData+0x3AC))#define InterlockedPushList \		((void *(*)(void *pHead, void *pItem))(PUserKData+0x398))#define InterlockedPopList \		((void *(*)(void *pHead))(PUserKData+0x380))#define InterlockedDecrement(target) (InterlockedExchangeAdd(target, -1L)-1)#define InterlockedIncrement(target) (InterlockedExchangeAdd(target, 1L)+1)#define InterlockedTestExchange(Target, oldValue, newValue) \		((long)InterlockedCompareExchange((void**)(Target), \		(void*)(newValue), (void*)(oldValue)))#define FIRST_INTERLOCK 0x380// Defines for CPU specific IDs.#define THISCPUID IMAGE_FILE_MACHINE_ARM#define PROCESSOR_ARCHITECTURE PROCESSOR_ARCHITECTURE_ARMextern DWORD CEProcessorType;extern WORD ProcessorLevel;extern WORD ProcessorRevision;// Cache handling functionsvoid FlushDCache(void);      // purge dirty datavoid FlushICache(void);      // clear out instruction cache#endif // defined(ARM)// end_ntddk end_nthal#endif // _NKARM_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -