📄 mem_ppc.h
字号:
/* Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved. *//* mdmem.h - machine dependant memory management structures*/#ifndef MEM_PPC_H#define MEM_PPC_H// The user mode virtual address space is 2GB split into 64 sections// of 512 blocks of 16 4K pages. For some platforms, the # of blocks in// a section may be limited to fewer than 512 blocks to reduce the size// of the intermeditate tables. E.G.: Since the PeRP only has 5MB of total// RAM, the sections are limited to 4MB. This results in 64 block sections.//// Virtual address format:// 3322222 222221111 1111 110000000000// 1098765 432109876 5432 109876543210// zSSSSSS BBBBBBBBB PPPP oooooooooooo#define BLOCK_MASK 0x1FF#define SECTION_MASK 0x03F#define RESERVED_SECTIONS 1 // reserve section 0 for current process// Bit offsets of page, block & section in a virtual address:#define VA_BLOCK 16#define VA_SECTION 25#if PPC403#define DCB_SIZE 16 // IBM PPC403: 16 byte D-cache block size#define PAGE_SIZE 1024 // IBM PPC403GC: 1K Pages#define VA_PAGE 10#define PAGE_MASK 0x03F#elif PPC821#define DCB_SIZE 16 // Motorola MPC821: 16 byte D-cache block size#define PAGE_SIZE 4096 // Motorola MPC821: 4K#define VA_PAGE 12#define PAGE_MASK 0x00F#endif#define PAGES_PER_BLOCK (0x10000 / PAGE_SIZE)//// TLB Page permission bits://#define PG_PERMISSION_MASK (PAGE_SIZE-1)#define PG_PHYS_ADDR_MASK (~PG_PERMISSION_MASK)#if PPC403 // IBM PPC403//// The low 10 bits of the PPC403 PTE are:// ---------------------// |X|W|R|-|-|-|-|I|M|V| where: X = Execute// --------------------- W = Write// R = Read (S/W bit)// I = (Cache) Inhibit// M = Execute Mask bit (S/W bit)// V = Valid//#define PG_VALID_MASK 0x00000001#define PG_CACHE_MASK 0x00000004#define PG_CACHE 0#define PG_NOCACHE 0x00000004#define PG_PROT_READ 0x00000080 // Implied bit on PPC403#define PG_PROT_WRITE 0x00000380#define PG_PROT_EXECUTE 0x00000200#define PG_EXECUTE_MASK 0x00000202 // 0x00000002 Unused by PPC403 hardware#define PG_DIRTY_MASK (PG_PROT_WRITE | PG_PROT_EXECUTE) // writable pages must be executable#define PG_PROTECTION (PG_PROT_READ | PG_PROT_WRITE | PG_EXECUTE_MASK)#define PG_READ_WRITE (PG_VALID_MASK | PG_PROT_WRITE)#define PG_WRITABLE_MASK 0x00000100#elif PPC821 // Motorola MPC821/* Page permission bits */#define PG_VALID_MASK 0x000000F1#define PG_CACHE_MASK 0x00000002#define PG_CACHE 0#define PG_NOCACHE 0x00000002#define PG_DIRTY_MASK 0x00000100#define PG_GLOBAL_MASK 0x00000004#define PG_EXECUTE_MASK 0x00000000 // undefined on MPC821#define PG_PROTECTION 0x00000E00#define PG_PROT_READ 0x00000C00#define PG_PROT_WRITE 0x00000800#define PG_PROT_EXECUTE 0x00000000 // undefined on MPC821#define PG_PROT_URO_KRW 0x00000400#define PG_READ_WRITE (PG_VALID_MASK | PG_DIRTY_MASK | PG_CACHE | PG_PROT_WRITE)#endif // Page Perms#define PG_SIZE_MASK 0x00000000#define PG_GUARD PG_CACHE_MASK// 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 0xE0000000#define UNKNOWN_BASE (~0)#define BAD_PAGE (~0xffful)#define API_MAX 0xFFFF0000#ifndef VERIFY_READ_FLAG#define VERIFY_READ_FLAG 0#define VERIFY_EXECUTE_FLAG 0#define VERIFY_WRITE_FLAG 1#define VERIFY_KERNEL_OK 2#endif// Trap id values shared between C & ASM code. The codes are// generated by the h/w vector address divided by 256.#define ID_RESCHEDULE 0x00 // NOP used to force a reschedule#define ID_HW_INTERRUPT 0x05 // external h/w interrupt#define ID_ALIGNMENT 0x06 // data alignment error#define ID_PROGRAM 0x07 // program error#define ID_DECREMENTER 0x09 // decrementer counter underflow#if defined(PPC403)#define ID_DPAGE_FAULT 0x03 // data page fault#define ID_CPAGE_FAULT 0x04 // code page fault#elif defined(PPC821)#define ID_CPAGE_FAULT 0x13 // code page fault#define ID_DPAGE_FAULT 0x14 // data page fault#endif// The following codes are used internally by the kernel and are// not releated to h/w interrupt addresses.#define ID_STACK_FAULT 0x30#define ID_HW_BREAK 0x31//// Kernel Virtual Address translation values. Some systems will use an// OEMMemoryMap to translation the KVA space (0x8000.0000-0xbfff.ffff).// These constants define the granularity of translation of this space://#if defined(PPC403) || defined(PPC821)#define KVA_MAP // Use OEMMemoryMap for translation#endif#define KVA_SIZE (512*1024*1024) // 512MB KVA Space#define KPFN_SIZE (16*1024*1024) // 16MB KVA Page Frame Size#define KPFN_CNT (KVA_SIZE / KPFN_SIZE) // Number of PFNS in KVA space#define KPFN_SHIFT 24 // PFN shift for 16MB PFNs#define KPFN_MASK ((KVA_SIZE-1) ^ (KPFN_SIZE-1))#define KPFN(kva) KPfnMap[((ulong)(kva) & KPFN_MASK) >> KPFN_SHIFT]#ifndef ASM_ONLY/* Test the read/write access on a page table entry */#define IsPageReadable(entry) (((entry)&PG_VALID_MASK) == PG_VALID_MASK)#if PPC821#define IsPageWritable(entry) (((entry)&(PG_PROTECTION|PG_DIRTY_MASK)) \ == (PG_PROT_WRITE|PG_DIRTY_MASK))#else#define IsPageWritable(entry) (((entry)&(PG_WRITABLE_MASK)) != 0)#endif#define SWITCHKEY(oldval, newval) ((oldval) = (pCurThread)->aky, CurAKey = (pCurThread)->aky = (newval))#define GETCURKEY() ((pCurThread)->aky)#define SETCURKEY(newval) (CurAKey = (pCurThread)->aky = (newval))#define PFN_INCR PAGE_SIZE//// Macros for KVA and PFN manipulation://#ifdef KVA_MAP#define GetPFN(pgpi)\ ((KPFN(pgpi) << KPFN_SHIFT) | ((ulong)(pgpi) & 0x00FFFC00))extern struct{ DWORD KernelVirtualAddress; DWORD PhysicalAddress; DWORD Size;} OEMMemoryMap[KPFN_CNT]; // KVA Memory map defined in HALPVOID Phys2Virt(DWORD pfn);#else#define GetPFN(pgpi) ((ulong)(pgpi) & 0x1FFFF000)#define Phys2Virt(pfn) ((PVOID)((pfn) | 0x80000000)) // one-to-one KVA#endif#define NextPFN(pfn) ((pfn) + PFN_INCR)#define PFNfromEntry(entry) ((entry) & ~(PAGE_SIZE-1))#define PFNfrom256(pg256) ((ulong)(pg256)<<8 & ~(PAGE_SIZE-1))/* Page Table Entry for the kernel data page. On the PowerPC, this * page is located at physical 0x5000 and virtual 0x5000. The virtual * address is setup to be read-only for user mode and read-write for * kernel mode */#if defined(PPC821)#define KPAGE_PTE ((KPAGE_BASE+0x800) & 0x1FFFF000)\ | PG_VALID_MASK | PG_GLOBAL_MASK | PG_CACHE | PG_PROT_URO_KRW#endif // PPC821#if defined(PPC403)#define KPAGE_PTE 0 // Locked KPage entry on the PPC403#endif#endif // not ASM_ONLY#endif // MEM_PPC_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -