Skip to content

Commit 465e1a3

Browse files
Fixes for AUBs
Change-Id: Iac55927eb96db8dd68b86d21e66392039ba1f058
1 parent 64c891f commit 465e1a3

File tree

5 files changed

+45
-8
lines changed

5 files changed

+45
-8
lines changed

runtime/command_stream/aub_command_stream_receiver_hw.inl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ FlushStamp AUBCommandStreamReceiverHw<GfxFamily>::flush(BatchBuffer &batchBuffer
450450
physLRCA + 0x101c,
451451
&engineInfo.tailRingBuffer,
452452
sizeof(engineInfo.tailRingBuffer),
453-
getAddressSpace(AubMemDump::DataTypeHintValues::TraceNotype));
453+
getAddressSpace(getCsTraits(engineType).aubHintLRCA));
454454

455455
DEBUG_BREAK_IF(engineInfo.tailRingBuffer >= engineInfo.sizeRingBuffer);
456456
}

runtime/memory_manager/page_table.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,17 @@ uintptr_t PTE::map(uintptr_t vm, size_t size, uint64_t entryBits, uint32_t memor
1919
uintptr_t res = -1;
2020
bool updateEntryBits = entryBits != PageTableEntry::nonValidBits;
2121
uint64_t newEntryBits = entryBits & 0xfff;
22+
auto entriesMask = std::numeric_limits<uintptr_t>::max() & ~MemoryConstants::pageMask;
2223
newEntryBits |= 0x1;
2324

2425
for (size_t index = indexStart; index <= indexEnd; index++) {
2526
if (entries[index] == 0x0) {
2627
uint64_t tmp = allocator->reservePage(memoryBank);
2728
entries[index] = reinterpret_cast<void *>(tmp | newEntryBits);
2829
} else if (updateEntryBits) {
29-
entries[index] = reinterpret_cast<void *>((reinterpret_cast<uintptr_t>(entries[index]) & 0xfffff000u) | newEntryBits);
30+
entries[index] = reinterpret_cast<void *>((reinterpret_cast<uintptr_t>(entries[index]) & entriesMask) | newEntryBits);
3031
}
31-
res = std::min(reinterpret_cast<uintptr_t>(entries[index]) & 0xfffff000u, res);
32+
res = std::min(reinterpret_cast<uintptr_t>(entries[index]) & entriesMask, res);
3233
}
3334
return (res & ~newEntryBits) + (vm & (pageSize - 1));
3435
}
@@ -43,16 +44,17 @@ void PTE::pageWalk(uintptr_t vm, size_t size, size_t offset, uint64_t entryBits,
4344
uintptr_t rem = vm & (pageSize - 1);
4445
bool updateEntryBits = entryBits != PageTableEntry::nonValidBits;
4546
uint64_t newEntryBits = entryBits & 0xfff;
47+
auto entriesMask = std::numeric_limits<uintptr_t>::max() & ~MemoryConstants::pageMask;
4648
newEntryBits |= 0x1;
4749

4850
for (size_t index = indexStart; index <= indexEnd; index++) {
4951
if (entries[index] == 0x0) {
5052
uint64_t tmp = allocator->reservePage(memoryBank);
5153
entries[index] = reinterpret_cast<void *>(tmp | newEntryBits);
5254
} else if (updateEntryBits) {
53-
entries[index] = reinterpret_cast<void *>((reinterpret_cast<uintptr_t>(entries[index]) & 0xfffff000u) | newEntryBits);
55+
entries[index] = reinterpret_cast<void *>((reinterpret_cast<uintptr_t>(entries[index]) & entriesMask) | newEntryBits);
5456
}
55-
res = reinterpret_cast<uintptr_t>(entries[index]) & 0xfffff000u;
57+
res = reinterpret_cast<uintptr_t>(entries[index]) & entriesMask;
5658

5759
size_t lSize = std::min(pageSize - rem, size);
5860
pageWalker((res & ~0x1) + rem, lSize, offset, reinterpret_cast<uintptr_t>(entries[index]) & 0xfffu);

unit_tests/aub_tests/command_queue/enqueue_write_copy_read_buffer_aub_tests.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct AubWriteCopyReadBuffer : public AUBFixture,
1818
public ::testing::Test {
1919

2020
void SetUp() override {
21-
AUBFixture::SetUp();
21+
AUBFixture::SetUp(nullptr);
2222
}
2323

2424
void TearDown() override {

unit_tests/aub_tests/fixtures/aub_fixture.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ namespace OCLRT {
2424

2525
class AUBFixture : public CommandQueueHwFixture {
2626
public:
27-
void SetUp() {
28-
const HardwareInfo &hwInfo = *platformDevices[0];
27+
void SetUp(const HardwareInfo *hardwareInfo) {
28+
const HardwareInfo &hwInfo = hardwareInfo ? *hardwareInfo : *platformDevices[0];
2929
uint32_t deviceIndex = 0;
3030

3131
const ::testing::TestInfo *const testInfo = ::testing::UnitTest::GetInstance()->current_test_info();
@@ -71,5 +71,8 @@ class AUBFixture : public CommandQueueHwFixture {
7171
std::unique_ptr<MockDevice> device;
7272

7373
ExecutionEnvironment *executionEnvironment;
74+
75+
private:
76+
using CommandQueueHwFixture::SetUp;
7477
};
7578
} // namespace OCLRT

unit_tests/memory_manager/page_table_tests.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,38 @@ TEST_F(PageTableTests48, givenReservedPhysicalAddressWhenPageWalkIsCalledThenPag
215215
}
216216
}
217217

218+
TEST_F(PageTableTests48, givenBigGpuAddressWhenPageWalkIsCalledThenPageTablesAreFilledWithProperAddresses) {
219+
if (is64Bit) {
220+
std::unique_ptr<MockPML4> pageTable(std::make_unique<MockPML4>(&allocator));
221+
222+
int shiftPML4 = is64Bit ? (47) : 0;
223+
int shiftPDP = is64Bit ? (9 + 9 + 12) : 0;
224+
225+
uintptr_t gpuVa = (uintptr_t(0x1) << (shiftPML4)) | (uintptr_t(0x1) << (shiftPDP)) | (uintptr_t(0x1) << (9 + 12)) | 0x100;
226+
227+
size_t size = 10 * pageSize;
228+
229+
size_t walked = 0u;
230+
auto address = allocator.mainAllocator.load();
231+
232+
PageWalker walker = [&](uint64_t physAddress, size_t size, size_t offset, uint64_t entryBits) {
233+
walked += size;
234+
};
235+
pageTable->pageWalk(gpuVa, size, 0, 0, walker, MemoryBanks::MainBank);
236+
237+
EXPECT_EQ(size, walked);
238+
239+
ASSERT_NE(nullptr, pageTable->entries[0x100]);
240+
ASSERT_NE(nullptr, pageTable->entries[0x100]->entries[1]);
241+
ASSERT_NE(nullptr, pageTable->entries[0x100]->entries[1]->entries[1]);
242+
243+
for (uint32_t i = 0; i < 10; i++) {
244+
EXPECT_EQ(reinterpret_cast<void *>(address | 0x1), pageTable->entries[0x100]->entries[1]->entries[1]->entries[i]);
245+
address += pageSize;
246+
}
247+
}
248+
}
249+
218250
TEST_F(PageTableTests48, givenZeroEntryBitsWhenPageWalkIsCalledThenPageTableEntryHasPresentBitSet) {
219251
std::unique_ptr<TypeSelector<MockPML4, MockPDPE, sizeof(void *) == 8>::type>
220252
pageTable(std::make_unique<TypeSelector<MockPML4, MockPDPE, sizeof(void *) == 8>::type>(&allocator));

0 commit comments

Comments
 (0)