summaryrefslogtreecommitdiffstats
path: root/src/include/kernel/vmmmgr.H
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/kernel/vmmmgr.H')
-rw-r--r--src/include/kernel/vmmmgr.H96
1 files changed, 3 insertions, 93 deletions
diff --git a/src/include/kernel/vmmmgr.H b/src/include/kernel/vmmmgr.H
index 4fc378578..c194b0456 100644
--- a/src/include/kernel/vmmmgr.H
+++ b/src/include/kernel/vmmmgr.H
@@ -7,11 +7,6 @@
class VmmManager
{
public:
- struct pte_t
- {
- uint64_t a,b;
- };
-
enum VMM_CONSTS
{
EIGHT_MEG = 8 * 1024 * 1024,
@@ -19,10 +14,8 @@ class VmmManager
FULL_MEM_SIZE = 1 * EIGHT_MEG,
PAGESIZE = 4096,
- PTSIZE = (1 << 18),
- PTEG_SIZE = 8,
- PTEG_COUNT = (PTSIZE / sizeof(pte_t)) / PTEG_SIZE,
-
+ // put the Page Table at the end of our memory space
+ PTSIZE = (1 << 18),
HTABORG = (FULL_MEM_SIZE - PTSIZE),
};
@@ -32,6 +25,7 @@ class VmmManager
READ_O_ACCESS,
NORMAL_ACCESS,
CI_ACCESS,
+ RO_EXE_ACCESS,
};
enum PID_ALLOCATIONS
@@ -70,90 +64,6 @@ class VmmManager
void* _mmioMap(void*, size_t);
int _mmioUnmap(void*, size_t);
- static pte_t* page_table;
-
- inline volatile pte_t& getPte(uint64_t pteg, uint64_t idx)
- {
- return page_table[pteg * PTEG_SIZE + idx];
- }
-
- inline void defaultPte(volatile pte_t& pte)
- {
- pte.a = 0x4000000000000000; // B = 01 (1TB).
- pte.b = 0x0;
- }
-
- inline void setValid(bool valid, volatile pte_t& pte)
- {
- // Adding a page requires EIEIO to ensure update of PTE prior
- // to making valid and PTESYNC afterwards.
- // Removing a page just requires PTESYNC afterwards.
- if (valid)
- {
- asm volatile("eieio" ::: "memory");
- }
-
- pte.a &= ~0x01;
- pte.a |= (valid ? 0x1 : 0x0);
-
- if (!valid)
- {
- asm volatile("ptesync" ::: "memory");
-
- register uint64_t rS = 0, rB = 0;
- rB = (getTid(pte) << 11) // VA[0:54).
- | (((uint64_t)&pte) & 0x3FF8) >> 7; // VA[55:65].
- rB <<= 12; // Put in rB[0:51].
- rB |= 0x0100; // B = 01 (1TB).
-
- // TLBIE isn't correct in gcc, hand code asm.
- asm volatile(".long 0x7c000264 | (%0 << 11) | (%1 << 21)" ::
- "r"(rB), "r"(rS) : "memory");
-
- asm volatile("eieio" ::: "memory");
- asm volatile("tlbsync" ::: "memory");
- }
-
- asm volatile("ptesync" ::: "memory");
- }
-
- inline bool isValid(volatile pte_t& pte)
- {
- return ((pte.a & 0x01) == 0x01);
- }
-
- inline void setTid(tid_t tid, volatile pte_t& pte)
- {
- pte.a &= 0xC00000000000007F;
- pte.a |= ((uint64_t) tid) << 7;
- }
-
- inline tid_t getTid(volatile pte_t& pte)
- {
- return (tid_t) ((pte.a & 0xC00000000000007F) >> 7);
- }
-
- inline void setAccess(ACCESS_TYPES t, volatile pte_t& pte)
- {
- uint64_t pteMask = ~0x800000000000007B;
- pte.b &= pteMask;
- pte.b |= (NO_USER_ACCESS == t ? 0x0000000000000010 :
- (READ_O_ACCESS == t ? 0x0000000000000011 :
- (NORMAL_ACCESS == t ? 0x0000000000000012 :
- (CI_ACCESS == t ? 0x000000000000002A :
- 0x0))));
- }
-
- inline void setPage(uint64_t page, volatile pte_t& pte)
- {
- pte.b &= ~0x0FFFFFFFFFFFF000;
- pte.b |= page << 12;
- }
-
- inline uint64_t getPage(volatile pte_t& pte)
- {
- return (pte.b & 0x0FFFFFFFFFFFF000) >> 12;
- }
};
#endif
OpenPOWER on IntegriCloud