📄 mem_mips.h
字号:
/* Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved. *//* mdmem.h - machine dependant memory management structures*/#ifndef MEM_MIPS_H#define MEM_MIPS_H#if R4100#define PAGE_SIZE 4096 /* R4100 page size can be 1024 or 4096 */#else#define PAGE_SIZE 4096 /* R3000 & R4000 page size */#endif//++// These symbols are duplicated from kernel.h so they can// be used by the MIPS assembler code without including kernel.h// Bit offsets of block & section in a virtual address:#define VA_BLOCK 16#define VA_SECTION 25#if PAGE_SIZE==4096#define VA_PAGE 12#define PAGE_MASK 0x00F#else#define VA_PAGE 10#define PAGE_MASK 0x03F#endif#define BLOCK_MASK 0x1FF#define SECTION_MASK 0x03F#define VERIFY_READ_FLAG 0#define VERIFY_EXECUTE_FLAG 0#define VERIFY_WRITE_FLAG 1#define VERIFY_KERNEL_OK 2//-- End of duplicated symbols// Bit offsets of page, block & section in the context register:#if R3000 #define CTX_PAGE 2 #define CTX_BLOCK 6 #define CTX_SECTION 15#endif#if R4000 #if R4100 #define CTX_PAGE (VA_PAGE-7) #define CTX_BLOCK 9 #define CTX_SECTION 18 #else #define CTX_PAGE 3 #define CTX_BLOCK 7 #define CTX_SECTION 16 #endif#endif#if R3000 #define ASID_MASK 0x3f#endif#if R4000 #define ASID_MASK 0xFF#endif#if R3000/* Page permission bits */#define PG_PERMISSION_MASK 0x80000F80#define PG_GUARD 0x80000000 /* unused by HW */#define PG_EXECUTE_MASK 0x00000080 /* unsued by HW */#define PG_GLOBAL_MASK 0x00000100#define PG_VALID_MASK 0x00000200#define PG_DIRTY_MASK 0x00000400#define PG_CACHE_MASK 0x00000800#define PG_NOCACHE 0x00000800#define PG_CACHE 0x00000000#define MUST_CLEAR_GUARD_BIT 1#endif#if R4000/* Page permission bits */#define PG_PERMISSION_MASK 0xC000003F#define PG_GUARD 0x80000000 /* unused by HW */#define PG_EXECUTE_MASK 0x40000000 /* unused by HW */#define PG_GLOBAL_MASK 0x00000001#define PG_VALID_MASK 0x00000002#define PG_DIRTY_MASK 0x00000004#define PG_CACHE_MASK 0x00000038 /* should be ANDed to find out cache state */#define PG_NOCACHE 0x00000010#define PG_CACHE 0x00000018#endif#define PG_PROT_READ 0x00000000#define PG_PROT_WRITE PG_DIRTY_MASK#define PG_SIZE_MASK 0x00000000#define PG_PROTECTION (PG_PROT_READ | PG_PROT_WRITE) #define PG_READ_WRITE (PG_DIRTY_MASK | PG_VALID_MASK | PG_CACHE)// MemBlock structure layout#define mb_lock 0#define mb_uses 4#define mb_flags 5#define mb_ixBase 6#define mb_hPf 8#define mb_pages 12#define INVALID_POINTER_VALUE 0xC0000000#if R3000 #define BAD_PAGE (~0ul) #define PFN_INCR 0x1000#endif#if R4000 #define BAD_PAGE (~0x3Ful) #if R4100 #define PFN_SHIFT 4 #else #define PFN_SHIFT 6 #endif #define PFN_INCR (PAGE_SIZE >> PFN_SHIFT)#endif#define SWITCHKEY(oldval, newval) ((oldval) = (pCurThread)->aky, CurAKey = (pCurThread)->aky = (newval))#define GETCURKEY() ((pCurThread)->aky)#define SETCURKEY(newval) (CurAKey = (pCurThread)->aky = (newval))/* Query & set thread's kernel vs. user mode state */#define GetThreadMode(pth) ((pth)->ctx.Psr & MODE_MASK)#define SetThreadMode(pth, mode) ((pth)->ctx.Psr = (mode))/* Query & set kernel vs. user mode state via Context */#define GetContextMode(pctx) ((pctx)->Psr & MODE_MASK)#define SetContextMode(pctx, mode) ((pctx)->Psr = (mode))#if R3000 /* Find the page frame # from a GPINFO pointer */ #define GetPFN(pgpi) ((ulong)(pgpi) & 0x1FFFF000) #define NextPFN(pfn) ((pfn) + PFN_INCR) #define PFNfromEntry(entry) ((entry) & 0x7FFFF000) #define PFNfrom256(x) ((ulong)(x)<<8 & 0x7FFFF000) #define KERNEL_MODE 0x04 #define USER_MODE 0x0c #define MODE_MASK 0x0c /* Return virtual address from page frame number */ #define Phys2Virt(pfn) ((PVOID)((pfn) | 0x80000000)) #define Phys2VirtUC(pfn) ((PVOID)((pfn) | 0xA0000000))#endif#if R4000 #define PFN_MASK (~(PAGE_SIZE-1) & 0x1FFFFFFF) /* Find the page frame # from a GPINFO pointer */ #define GetPFN(pgpi) (((ulong)(pgpi) & PFN_MASK) >> PFN_SHIFT) #define NextPFN(pfn) ((pfn) + PFN_INCR) #define PFNfromEntry(entry) ((entry) & 0x3FFFFFC0) #define PFNfrom256(x) ((ulong)(x)<<(8-PFN_SHIFT) & 0x3FFFFFC0) #define KERNEL_MODE 0x03 #define USER_MODE 0x13 #define MODE_MASK 0x3F /* Return virtual address from page frame number */ #define Phys2Virt(pfn) ((PVOID)(((pfn)<< PFN_SHIFT) | 0x80000000)) #define Phys2VirtUC(pfn) ((PVOID)(((pfn)<< PFN_SHIFT) | 0xA0000000))#endif/* Test the write access on a page table entry */#define IsPageWritable(entry) (((entry)&PG_DIRTY_MASK) != 0)#define IsPageReadable(entry) (((entry)&PG_VALID_MASK) == PG_VALID_MASK)#define KPAGE_PHYS 0x00001000#if R4000#define KPAGE_PHYS_LO (KPAGE_PHYS>>PFN_SHIFT)#endif#define KPAGE_PTE (GetPFN(KPAGE_PHYS+0x800) + PG_VALID_MASK \ + PG_GLOBAL_MASK + PG_CACHE)#endif // MEM_MIPS_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -