Skip to content
Snippets Groups Projects
Commit ffe9d99c authored by Gleb Natapov's avatar Gleb Natapov Committed by Avi Kivity
Browse files

mmu, x64: fix getting/setting address in a pte


Currently address we get from pte includes reserved bits and setting
zeroes available and reserved bits.

Signed-off-by: default avatarGleb Natapov <gleb@cloudius-systems.com>
Signed-off-by: default avatarAvi Kivity <avi@cloudius-systems.com>
parent 34fd7cdf
No related branches found
No related tags found
No related merge requests found
...@@ -19,6 +19,11 @@ extern uint8_t phys_bits, virt_bits; ...@@ -19,6 +19,11 @@ extern uint8_t phys_bits, virt_bits;
constexpr uint8_t rsvd_bits_used = 0; constexpr uint8_t rsvd_bits_used = 0;
constexpr uint8_t max_phys_bits = 52 - rsvd_bits_used; constexpr uint8_t max_phys_bits = 52 - rsvd_bits_used;
constexpr uint64_t pte_addr_mask(bool large)
{
return ((1ull << max_phys_bits) - 1) & ~(0xfffull) & ~(uint64_t(large) << page_size_shift);
}
class arch_pt_element { class arch_pt_element {
public: public:
arch_pt_element() = delete; arch_pt_element() = delete;
...@@ -43,10 +48,7 @@ inline bool pt_element::sw_bit(unsigned off) const { ...@@ -43,10 +48,7 @@ inline bool pt_element::sw_bit(unsigned off) const {
} }
inline phys pt_element::addr(bool large) const { inline phys pt_element::addr(bool large) const {
auto v = x & ((u64(1) << (64-page_size_shift)) - 1); return x & pte_addr_mask(large);
v &= ~u64(0xfff);
v &= ~(u64(large) << page_size_shift);
return v;
} }
inline u64 pt_element::pfn(bool large) const { inline u64 pt_element::pfn(bool large) const {
...@@ -68,8 +70,7 @@ inline void pt_element::set_sw_bit(unsigned off, bool v) { ...@@ -68,8 +70,7 @@ inline void pt_element::set_sw_bit(unsigned off, bool v) {
} }
inline void pt_element::set_addr(phys addr, bool large) { inline void pt_element::set_addr(phys addr, bool large) {
auto mask = 0x8000000000000fff | (u64(large) << page_size_shift); x = (x & ~pte_addr_mask(large)) | addr;
x = (x & mask) | addr;
} }
inline void pt_element::set_pfn(u64 pfn, bool large) { inline void pt_element::set_pfn(u64 pfn, bool large) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment