VMM - get_page ignores flags -- also restructuring - bad Thomas!
This commit is contained in:
parent
1b928b3c97
commit
1ad156902a
@ -1,26 +1,31 @@
|
|||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
|
||||||
#define FLAGS_MASK (PAGE_SIZE-1)
|
#define FLAGS_MASK (PAGE_SIZE-1)
|
||||||
|
#define MASK_FLAGS(addr) ((uintptr_t)addr & ~FLAGS_MASK)
|
||||||
|
|
||||||
struct PT {
|
union PTE {
|
||||||
struct PT *p[ENTRIES_PER_PT];
|
uint64_t value;
|
||||||
}__attribute__((packed));
|
struct {
|
||||||
|
uintptr_t flags:12;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
#define P(pt) ((struct PT *)((uintptr_t)pt & ~(FLAGS_MASK)))
|
typedef union PTE PT[512];
|
||||||
|
|
||||||
#define P3(pt, addr) (P(pt)->p[P4_OFFSET(addr)])
|
#define PT(ptr) ((PT *)MASK_FLAGS(ptr->value))
|
||||||
#define P2(pt, addr) (P(P3(pt, addr))->p[P3_OFFSET(addr)])
|
#define P4e(pt, addr) (((PT *)pt)[P4_OFFSET(addr)])
|
||||||
#define P1(pt, addr) (P(P2(pt, addr))->p[P2_OFFSET(addr)])
|
#define P3e(pt, addr) PT(P4e(pt, addr))[P3_OFFSET(addr)]
|
||||||
#define P0(pt, addr) (P(P1(pt, addr))->p[P1_OFFSET(addr)])
|
#define P2e(pt, addr) PT(P3e(pt, addr))[P2_OFFSET(addr)]
|
||||||
|
#define P1e(pt, addr) PT(P2e(pt, addr))[P1_OFFSET(addr)]
|
||||||
|
|
||||||
|
uintptr_t vmm_get_page(void *P4, uintptr_t addr)
|
||||||
uintptr_t vmm_get_page(uintptr_t *P4, uintptr_t addr)
|
|
||||||
{
|
{
|
||||||
if(P4
|
if(P4
|
||||||
&& P3(P4, addr)
|
&& P4e(P4, addr)
|
||||||
&& P2(P4, addr)
|
&& P3e(P4, addr)
|
||||||
&& P1(P4, addr)
|
&& P2e(P4, addr)
|
||||||
)
|
)
|
||||||
return (uintptr_t)P0(P4, addr);
|
return MASK_FLAGS(P1e(P4, addr)->value);
|
||||||
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -30,3 +30,17 @@ TEST(get_page_returns_correct_address)
|
|||||||
|
|
||||||
ASSERT_EQ_PTR(ret, 0x1234567890ABC000);
|
ASSERT_EQ_PTR(ret, 0x1234567890ABC000);
|
||||||
}
|
}
|
||||||
|
TEST(get_page_ignores_flags)
|
||||||
|
{
|
||||||
|
p4[0] = (uintptr_t)p3;
|
||||||
|
p4[0] |= 0x123;
|
||||||
|
p3[0] = (uintptr_t)p2;
|
||||||
|
p3[0] |= 0x456;
|
||||||
|
p2[0] = (uintptr_t)p1;
|
||||||
|
p2[0] |= 0x789;
|
||||||
|
p1[0] = 0x1234567890ABCDEF;
|
||||||
|
|
||||||
|
uintptr_t ret = vmm_get_page(p4, 0);
|
||||||
|
|
||||||
|
ASSERT_EQ_PTR(ret, 0x1234567890ABC000);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user