mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
Enhance PageTable testing
- and mock PageTables with entries access - new test checking correct entries filling Change-Id: I4ad70aac2915f0ff2611c65a8480dadcf87c0b8d
This commit is contained in:
committed by
sys_ocldev
parent
be4c2cca60
commit
58c34fd72c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user