FreeNOS
IntelPageTable.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Niek Linnenbank
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include "IntelConstant.h"
19 #include "IntelPageTable.h"
20 
21 #define PAGE_NONE 0
22 #define PAGE_PRESENT 1
23 #define PAGE_READ 0
24 #define PAGE_EXEC 0
25 #define PAGE_WRITE 2
26 #define PAGE_USER 4
27 
35 #define TABENTRY(vaddr) \
36  (((vaddr) >> PAGESHIFT) & 0x3ff)
37 
39  Address phys,
40  Memory::Access access)
41 {
42  // Check if the address is already mapped
43  if (m_pages[ TABENTRY(virt) ] & PAGE_PRESENT)
45 
46  // Insert mapping
47  m_pages[ TABENTRY(virt) ] = phys | PAGE_PRESENT | flags(access);
49 }
50 
52 {
53  m_pages[ TABENTRY(virt) ] = PAGE_NONE;
55 }
56 
58 {
59  if (!(m_pages[ TABENTRY(virt) ] & PAGE_PRESENT))
61 
62  *phys = (m_pages[ TABENTRY(virt) ] & PAGEMASK);
64 }
65 
67 {
68  u32 entry = m_pages[ TABENTRY(virt) ];
69 
70  if (!(entry & PAGE_PRESENT))
72 
74 
77 
79 }
80 
82 {
83  u32 f = 0;
84 
86  if (access & Memory::User) f |= PAGE_USER;
87 
88  return f;
89 }
IntelPageTable::m_pages
u32 m_pages[1024]
Array of page table entries.
Definition: IntelPageTable.h:99
IntelPageTable::flags
u32 flags(Memory::Access access) const
Convert MemoryAccess to page table flags.
Definition: IntelPageTable.cpp:81
Memory::Writable
@ Writable
Definition: Memory.h:42
PAGEMASK
#define PAGEMASK
Mask to find the page.
Definition: ARMConstant.h:121
Memory::User
@ User
Definition: Memory.h:44
MemoryContext::AlreadyExists
@ AlreadyExists
Definition: MemoryContext.h:54
IntelConstant.h
TABENTRY
#define TABENTRY(vaddr)
Entry inside the page table of a given virtual address.
Definition: IntelPageTable.cpp:35
PAGE_WRITE
#define PAGE_WRITE
Definition: IntelPageTable.cpp:25
Address
unsigned long Address
A memory address.
Definition: Types.h:131
IntelPageTable::translate
MemoryContext::Result translate(Address virt, Address *phys) const
Translate virtual address to physical address.
Definition: IntelPageTable.cpp:57
IntelPageTable.h
PAGE_NONE
#define PAGE_NONE
Definition: IntelPageTable.cpp:21
MemoryContext::InvalidAddress
@ InvalidAddress
Definition: MemoryContext.h:52
Memory::Readable
@ Readable
Definition: Memory.h:41
IntelPageTable::map
MemoryContext::Result map(Address virt, Address phys, Memory::Access access)
Map a virtual address to a physical address.
Definition: IntelPageTable.cpp:38
MemoryContext::Result
Result
Result codes.
Definition: MemoryContext.h:49
u32
unsigned int u32
Unsigned 32-bit number.
Definition: Types.h:53
MemoryContext::Success
@ Success
Definition: MemoryContext.h:51
Memory::Access
Access
Memory access flags.
Definition: Memory.h:38
PAGE_USER
#define PAGE_USER
Definition: IntelPageTable.cpp:26
entry
u32 entry[]
Definition: IntelACPI.h:64
IntelPageTable::unmap
MemoryContext::Result unmap(Address virt)
Remove virtual address mapping.
Definition: IntelPageTable.cpp:51
PAGE_PRESENT
#define PAGE_PRESENT
Definition: IntelPageTable.cpp:22
IntelPageTable::access
MemoryContext::Result access(Address virt, Memory::Access *access) const
Get Access flags for a virtual address.
Definition: IntelPageTable.cpp:66