1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
/*
* Copyright (C) 2020 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "level_zero/core/source/debugger/debugger_l0.h"
#include "shared/source/command_container/cmdcontainer.h"
#include "shared/source/debug_settings/debug_settings_manager.h"
#include "shared/source/device/device.h"
#include "shared/source/helpers/constants.h"
#include "shared/source/memory_manager/allocation_properties.h"
#include "shared/source/memory_manager/memory_manager.h"
#include "shared/source/os_interface/os_context.h"
#include <cstring>
namespace L0 {
DebugerL0CreateFn debuggerL0Factory[IGFX_MAX_CORE] = {};
DebuggerL0::DebuggerL0(NEO::Device *device) : device(device) {
isLegacyMode = false;
auto &engines = device->getEngines();
sbaTrackingGpuVa = device->getMemoryManager()->reserveGpuAddress(MemoryConstants::pageSize, device->getRootDeviceIndex());
NEO::AllocationProperties properties{device->getRootDeviceIndex(), true, MemoryConstants::pageSize,
NEO::GraphicsAllocation::AllocationType::DEBUG_SBA_TRACKING_BUFFER,
false,
CommonConstants::allDevicesBitfield};
properties.gpuAddress = sbaTrackingGpuVa.address;
SbaTrackedAddresses sbaHeader;
for (auto &engine : engines) {
properties.osContext = engine.osContext;
auto sbaAllocation = device->getMemoryManager()->allocateGraphicsMemoryWithProperties(properties);
memset(sbaAllocation->getUnderlyingBuffer(), 0, sbaAllocation->getUnderlyingBufferSize());
auto sbaHeaderPtr = reinterpret_cast<SbaTrackedAddresses *>(sbaAllocation->getUnderlyingBuffer());
*sbaHeaderPtr = sbaHeader;
perContextSbaAllocations[engine.osContext->getContextId()] = sbaAllocation;
}
{
auto &hwInfo = device->getHardwareInfo();
auto &hwHelper = NEO::HwHelper::get(hwInfo.platform.eRenderCoreFamily);
NEO::AllocationProperties properties{device->getRootDeviceIndex(), true, MemoryConstants::pageSize64k,
NEO::GraphicsAllocation::AllocationType::DEBUG_MODULE_AREA,
false,
device->getDeviceBitfield()};
moduleDebugArea = device->getMemoryManager()->allocateGraphicsMemoryWithProperties(properties);
DebugAreaHeader debugArea = {};
debugArea.size = sizeof(DebugAreaHeader);
debugArea.pgsize = 1;
debugArea.isShared = 0;
debugArea.scratchBegin = sizeof(DebugAreaHeader);
debugArea.scratchEnd = MemoryConstants::pageSize64k - sizeof(DebugAreaHeader);
NEO::MemoryTransferHelper::transferMemoryToAllocation(hwHelper.isBlitCopyRequiredForLocalMemory(hwInfo, *moduleDebugArea),
*device, moduleDebugArea, 0, &debugArea,
sizeof(DebugAreaHeader));
}
}
void DebuggerL0::printTrackedAddresses(uint32_t contextId) {
auto memory = perContextSbaAllocations[contextId]->getUnderlyingBuffer();
auto sba = reinterpret_cast<SbaTrackedAddresses *>(memory);
PRINT_DEBUG_STRING(NEO::DebugManager.flags.PrintDebugMessages.get(), stdout,
"Debugger: SBA ssh = %" SCNx64
" gsba = %" SCNx64
" bsurfsba = %" SCNx64 "\n",
sba->SurfaceStateBaseAddress, sba->GeneralStateBaseAddress,
sba->BindlessSurfaceStateBaseAddress);
}
DebuggerL0 ::~DebuggerL0() {
for (auto &alloc : perContextSbaAllocations) {
device->getMemoryManager()->freeGraphicsMemory(alloc.second);
}
device->getMemoryManager()->freeGpuAddress(sbaTrackingGpuVa, device->getRootDeviceIndex());
device->getMemoryManager()->freeGraphicsMemory(moduleDebugArea);
}
bool DebuggerL0::isDebuggerActive() {
return true;
}
void DebuggerL0::captureStateBaseAddress(NEO::CommandContainer &container, SbaAddresses sba) {
if (DebuggerL0::isAnyTrackedAddressChanged(sba)) {
programSbaTrackingCommands(*container.getCommandStream(), sba);
}
}
} // namespace L0
|