blob: ec5c9f20cedd96d31e5ac1c6e1feacf31c0d4297 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
/** @file spte.H
* @brief Defines the structure of the Shadow Page Table Entry.
*/
#ifndef __KERNEL_SPTE_H
#define __KERNEL_SPTE_H
#include <stdint.h>
#include <builtins.h>
/** @class ShadowPTE
* @brief Stores information needed in a shadow page table for virtual to
* physical address mapping, such as physical page number and
* security permissions.
*
* @note This structure only allows addressing of 4GB of physical memory due
* to the page number being stored in a 20 bit field.
*
* The data within is stored in a way so that the union value is an address
* within the physical page who's number is stored and the low-order bits
* are used for storing misc information about the page, such as permissions.
*/
class ShadowPTE
{
protected:
union
{
uint32_t word;
struct
{
/** Physical page number. */
uint32_t page:20;
/** Page is present (is PN valid?). */
uint32_t present:1;
/** May the page be written to. */
uint32_t writable:1;
/** May code be executed off page. */
uint32_t executable:1;
/** Should the dirty bit be maintained. */
uint32_t track_write:1;
/** Has page been written to. */
uint32_t dirty:1;
/** Reserved for future use. */
uint32_t reserved:7;
} PACKED;
};
public:
/** Initialize PTE */
ShadowPTE() : word(0) {};
/** Cast-construct from integer directly to the data union. */
explicit ShadowPTE(uint32_t i_data) : word(i_data) {};
/** Get physical page (as address). */
uint32_t getPageAddr() const { return (page << 12); };
/** Set physical page (as address). */
void setPageAddr(uint32_t i_page) { page = (i_page >> 12); };
/** Get physical page (as page number). */
uint32_t getPage() const { return page; }
/** Get present bit. */
bool isPresent() const { return present; };
/** Set present bit. */
void setPresent(bool i_present) { present = i_present; };
/** Get writable bit. */
bool isWritable() const { return writable; };
/** Set writable bit. */
void setWritable(bool i_write) { writable = i_write; };
/** Get executable bit. */
bool isExecutable() const { return executable; };
/** Set executable bit. */
void setExecutable(bool i_exec) { executable = i_exec; };
/** Get write-tracked bit. */
bool isWriteTracked() const { return track_write; };
/** Set write-tracked bit. */
void setWriteTracked(bool i_track) { track_write = i_track; };
/** Get dirty bit. */
bool isDirty() const { return dirty; };
/** Set dirty bit. */
void setDirty(bool i_dirty) { dirty = i_dirty; };
};
#endif
|