Enhance PageTable testing

- and mock PageTables with entries access
- new test checking correct entries filling

Change-Id: I4ad70aac2915f0ff2611c65a8480dadcf87c0b8d
This commit is contained in:
Hoppe, Mateusz
2018-09-11 11:35:04 +02:00
committed by sys_ocldev
parent be4c2cca60
commit 58c34fd72c
5 changed files with 169 additions and 77 deletions

View File

@@ -22,6 +22,7 @@
#include "runtime/helpers/selectors.h"
#include "runtime/memory_manager/page_table.h"
#include "runtime/memory_manager/page_table.inl"
#include "test.h"
#include "gtest/gtest.h"
#include "unit_tests/helpers/memory_management.h"
@@ -58,6 +59,40 @@ TEST_F(PTETest, physicalAddressesInAUBCantStartAt0) {
EXPECT_NE(0u, physAddress);
}
template <class T, uint32_t level, uint32_t bits = 9>
class MockPageTable : public PageTable<T, level, bits> {
public:
using PageTable<T, level, bits>::PageTable;
using PageTable<T, level, bits>::entries;
};
class MockPTE : public PTE {
public:
using PTE::entries;
uintptr_t map(uintptr_t vm, size_t size) override {
return PTE::map(vm, size);
}
void pageWalk(uintptr_t vm, size_t size, size_t offset, PageWalker &pageWalker) override {
return PTE::pageWalk(vm, size, offset, pageWalker);
}
};
class MockPDE : public MockPageTable<MockPTE, 1> {
public:
using MockPageTable<MockPTE, 1>::entries;
};
class MockPDP : public MockPageTable<MockPDE, 2> {
public:
using MockPageTable<MockPDE, 2>::entries;
};
class MockPML4 : public MockPageTable<MockPDP, 3> {
public:
using MockPageTable<MockPDP, 3>::entries;
};
class PPGTTPageTable : public TypeSelector<PML4, PDPE, sizeof(void *) == 8>::type {
public:
const size_t ppgttEntries = IntSelector<512u, 4u, sizeof(void *) == 8>::value;
@@ -128,6 +163,38 @@ TEST_F(PageTableTests48, DISABLED_mapSizeZero) {
std::cerr << phys1 << std::endl;
}
TEST_F(PageTableTests48, givenReservedPhysicalAddressWhenPageWalkIsCalledThenPageTablesAreFilledWithProperAddresses) {
if (is64Bit) {
std::unique_ptr<MockPML4> pageTable(std::make_unique<MockPML4>());
int shiftPML4 = is64Bit ? (9 + 9 + 9 + 12) : 0;
int shiftPDP = is64Bit ? (9 + 9 + 12) : 0;
uintptr_t gpuVa = (uintptr_t(0x1) << (shiftPML4)) | (uintptr_t(0x1) << (shiftPDP)) | (uintptr_t(0x1) << (9 + 12)) | 0x100;
size_t size = 10 * pageSize;
size_t walked = 0u;
auto address = this->getNextPage() * pageSize;
PageWalker walker = [&](uint64_t physAddress, size_t size, size_t offset) {
walked += size;
};
pageTable->pageWalk(gpuVa, size, 0, walker);
EXPECT_EQ(size, walked);
ASSERT_NE(nullptr, pageTable->entries[1]);
ASSERT_NE(nullptr, pageTable->entries[1]->entries[1]);
ASSERT_NE(nullptr, pageTable->entries[1]->entries[1]->entries[1]);
for (uint32_t i = 0; i < 10; i++) {
EXPECT_EQ(reinterpret_cast<void *>(address | 0x1), pageTable->entries[1]->entries[1]->entries[1]->entries[i]);
address += pageSize;
}
}
}
TEST_F(PageTableTests48, pageWalkSimple) {
std::unique_ptr<PPGTTPageTable> pageTable(new PPGTTPageTable);
uintptr_t addr1 = refAddr + (510 * pageSize) + 0x10;