Skip to content

Commit 4affe99

Browse files
Update SLM access offset behavior
Related-To: NEO-5998 Signed-off-by: Matias Cabral <[email protected]>
1 parent 3d1dba3 commit 4affe99

File tree

2 files changed

+56
-32
lines changed

2 files changed

+56
-32
lines changed

level_zero/tools/source/debug/debug_session_imp.cpp

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,16 +1282,13 @@ ze_result_t DebugSessionImp::readSLMMemory(EuThread::ThreadId threadId, const ze
12821282

12831283
uint64_t offset = desc->address & maxNBitValue(slmAddressSpaceTag);
12841284

1285-
// SIP accesses SLM in units of slmSendBytesSize at offset units of the same size
1286-
uint32_t offsetUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(offset) / slmSendBytesSize));
1285+
// SIP accesses SLM in units of slmSendBytesSize at offset allignment of slmSendBytesSize
12871286
uint32_t frontPadding = offset % slmSendBytesSize;
1287+
uint64_t alignedOffset = offset - frontPadding;
12881288
uint32_t remainingSlmSendUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(size) / slmSendBytesSize));
12891289

1290-
if (frontPadding) {
1291-
offsetUnits--;
1292-
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
1293-
remainingSlmSendUnits++;
1294-
}
1290+
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
1291+
remainingSlmSendUnits++;
12951292
}
12961293

12971294
uint32_t loops = static_cast<uint32_t>(std::ceil(static_cast<float>(remainingSlmSendUnits) / maxUnitsPerLoop));
@@ -1300,7 +1297,7 @@ ze_result_t DebugSessionImp::readSLMMemory(EuThread::ThreadId threadId, const ze
13001297
uint32_t readUnits = 0;
13011298
uint32_t bytesAlreadyRead = 0;
13021299

1303-
sipCommand.offset = offsetUnits;
1300+
sipCommand.offset = alignedOffset;
13041301

13051302
for (uint32_t loop = 0; loop < loops; loop++) {
13061303

@@ -1336,8 +1333,8 @@ ze_result_t DebugSessionImp::readSLMMemory(EuThread::ThreadId threadId, const ze
13361333
memcpy_s(tmpBuffer.get() + bytesAlreadyRead, readUnits * slmSendBytesSize, sipCommand.buffer, readUnits * slmSendBytesSize);
13371334

13381335
remainingSlmSendUnits -= readUnits;
1339-
sipCommand.offset += readUnits;
13401336
bytesAlreadyRead += readUnits * slmSendBytesSize;
1337+
sipCommand.offset += readUnits * slmSendBytesSize;
13411338
}
13421339

13431340
memcpy_s(buffer, size, tmpBuffer.get() + frontPadding, size);
@@ -1350,29 +1347,25 @@ ze_result_t DebugSessionImp::writeSLMMemory(EuThread::ThreadId threadId, const z
13501347
SIP::sip_command sipCommand = {0};
13511348

13521349
uint64_t offset = desc->address & maxNBitValue(slmAddressSpaceTag);
1353-
// SIP accesses SLM in units of slmSendBytesSize at offset units of the same size
1354-
uint32_t offsetUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(offset) / slmSendBytesSize));
1350+
// SIP accesses SLM in units of slmSendBytesSize at offset allignment of slmSendBytesSize
13551351
uint32_t frontPadding = offset % slmSendBytesSize;
1352+
uint64_t alignedOffset = offset - frontPadding;
13561353
uint32_t remainingSlmSendUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(size) / slmSendBytesSize));
13571354
size_t tailPadding = (size % slmSendBytesSize) ? slmSendBytesSize - (size % slmSendBytesSize) : 0;
13581355

1359-
if (frontPadding) {
1360-
offsetUnits--;
1361-
1362-
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
1363-
remainingSlmSendUnits++;
1364-
}
1356+
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
1357+
remainingSlmSendUnits++;
13651358
}
13661359

13671360
std::unique_ptr<char[]> tmpBuffer(new char[remainingSlmSendUnits * slmSendBytesSize]);
13681361

13691362
if ((frontPadding || tailPadding)) {
13701363

1371-
zet_debug_memory_space_desc_t allignedDesc = *desc;
1372-
allignedDesc.address = desc->address - frontPadding;
1373-
size_t allignedSize = remainingSlmSendUnits * slmSendBytesSize;
1364+
zet_debug_memory_space_desc_t alignedDesc = *desc;
1365+
alignedDesc.address = desc->address - frontPadding;
1366+
size_t alignedSize = remainingSlmSendUnits * slmSendBytesSize;
13741367

1375-
status = readSLMMemory(threadId, &allignedDesc, allignedSize, tmpBuffer.get());
1368+
status = readSLMMemory(threadId, &alignedDesc, alignedSize, tmpBuffer.get());
13761369
if (status != ZE_RESULT_SUCCESS) {
13771370
return status;
13781371
}
@@ -1390,7 +1383,7 @@ ze_result_t DebugSessionImp::writeSLMMemory(EuThread::ThreadId threadId, const z
13901383
uint32_t writeUnits = 0;
13911384
uint32_t bytesAlreadyWritten = 0;
13921385

1393-
sipCommand.offset = offsetUnits;
1386+
sipCommand.offset = alignedOffset;
13941387

13951388
for (uint32_t loop = 0; loop < loops; loop++) {
13961389

@@ -1420,8 +1413,8 @@ ze_result_t DebugSessionImp::writeSLMMemory(EuThread::ThreadId threadId, const z
14201413
}
14211414

14221415
remainingSlmSendUnits -= writeUnits;
1423-
sipCommand.offset += writeUnits;
14241416
bytesAlreadyWritten += writeUnits * slmSendBytesSize;
1417+
sipCommand.offset += writeUnits * slmSendBytesSize;
14251418
}
14261419

14271420
return ZE_RESULT_SUCCESS;

level_zero/tools/test/unit_tests/sources/debug/debug_session_tests.cpp

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,12 @@ struct MockDebugSession : public L0::DebugSessionImp {
251251
if (!forceSlmCmdNotReady) {
252252
if (cmdRegisterAccessCount == 3) { // SIP restores cmd to READY
253253

254-
uint64_t offset = command.offset * slmSendBytesSize;
255254
uint32_t size = command.size * slmSendBytesSize;
256255

257256
if (cmdResgisterWrittenForSLM == static_cast<uint32_t>(NEO::SipKernel::COMMAND::SLM_READ)) {
258-
memcpy_s(command.buffer, size, slMemory + offset, size);
257+
memcpy_s(command.buffer, size, slMemory + command.offset, size);
259258
} else if (cmdResgisterWrittenForSLM == static_cast<uint32_t>(NEO::SipKernel::COMMAND::SLM_WRITE)) {
260-
memcpy_s(slMemory + offset, size, command.buffer, size);
259+
memcpy_s(slMemory + command.offset, size, command.buffer, size);
261260
cmdRegisterAccessCount = 0;
262261
cmdResgisterWrittenForSLM = static_cast<uint32_t>(NEO::SipKernel::COMMAND::RESUME);
263262
}
@@ -2185,15 +2184,17 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenReadingSLMThenReadis
21852184
}
21862185
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
21872186

2188-
desc.address = 0x10000005;
2187+
int offset = 0x05;
2188+
desc.address = 0x10000000 + offset;
21892189
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
21902190
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
21912191
for (i = 0; i < readSize; i++) {
2192-
EXPECT_EQ(output[i], session->slMemory[i + 0x5]);
2192+
EXPECT_EQ(output[i], session->slMemory[i + offset]);
21932193
}
21942194
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
21952195

2196-
desc.address = 0x1000000f;
2196+
offset = 0x0f;
2197+
desc.address = 0x10000000 + offset;
21972198
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
21982199
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
21992200
for (i = 0; i < readSize; i++) {
@@ -2205,7 +2206,17 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenReadingSLMThenReadis
22052206
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
22062207
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
22072208
for (i = 0; i < readSize; i++) {
2208-
EXPECT_EQ(output[i], session->slMemory[i + 0xf]);
2209+
EXPECT_EQ(output[i], session->slMemory[i + offset]);
2210+
}
2211+
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
2212+
2213+
readSize = 230;
2214+
offset = 0x0a;
2215+
desc.address = 0x10000000 + offset;
2216+
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
2217+
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
2218+
for (i = 0; i < readSize; i++) {
2219+
EXPECT_EQ(output[i], session->slMemory[i + offset]);
22092220
}
22102221
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
22112222

@@ -2305,8 +2316,8 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenWritingSLMThenWrites
23052316

23062317
session->skipWriteResumeCommand = false;
23072318

2308-
char input1[EXCHANGE_BUFFER_SIZE * 2];
2309-
memset(input1, 0xff, EXCHANGE_BUFFER_SIZE * 2);
2319+
char input1[EXCHANGE_BUFFER_SIZE * 3];
2320+
memset(input1, 0xff, EXCHANGE_BUFFER_SIZE * 3);
23102321

23112322
int inputSize = 7;
23122323

@@ -2424,6 +2435,26 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenWritingSLMThenWrites
24242435
session->slMemory[i] = i & 127;
24252436
}
24262437

2438+
inputSize = 230;
2439+
offset = 0x0a;
2440+
desc.address = 0x10000000 + offset;
2441+
retVal = session->writeSLMMemory(thread0, &desc, inputSize, input1);
2442+
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
2443+
2444+
for (i = 0; i < offset; i++) {
2445+
EXPECT_EQ(session->slMemory[i], i & 127);
2446+
}
2447+
for (i = 0; i < inputSize; i++) {
2448+
EXPECT_EQ(session->slMemory[i + offset], input1[i]);
2449+
}
2450+
for (i = offset + inputSize + 1; i < session->slmSize; i++) {
2451+
EXPECT_EQ(session->slMemory[i], i & 127);
2452+
}
2453+
// Restore SLM content
2454+
for (i = 0; i < session->slmSize; i++) {
2455+
session->slMemory[i] = i & 127;
2456+
}
2457+
24272458
session->slmTesting = false;
24282459
}
24292460

0 commit comments

Comments
 (0)