17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-29 20:57:32 +01:00

Look 4 GiB lower for the buffer of a fault address that holds nothing

This commit is contained in:
2026-10-29 19:15:44 +01:00
parent 9bc9168230
commit 975fc1b4ea

View File

@@ -206,6 +206,44 @@ std::string describe(VkDeviceAddress const Lower, VkDeviceAddress const Upper)
note(std::to_string(live) + " images in memory of their own aren't placed; let go of them in the last 5 s: " + (recent.empty() ? std::string("none") : recent));
}
}
// an index below zero of a buffer read through a descriptor wraps around the 32 bits of the offset, to almost 4 GiB past its
// start: what is there 4 GiB lower is the buffer read
auto constexpr wrap{VkDeviceAddress{1} << 32};
if ((holders == 0) && (Lower >= wrap))
{
auto const lower{Lower - wrap};
auto const upper{Upper - wrap};
entry const *holder{nullptr};
entry const *next{nullptr};
VkDeviceAddress holderstart{0}, nextstart{0};
for (auto const &[handle, item] : g_live)
{
auto const address{placed(item)};
if (address == 0)
{
continue;
}
if ((address <= upper) && (address + item.size > lower))
{
holder = &item;
holderstart = address;
break;
}
if ((address > upper) && ((next == nullptr) || (address < nextstart)))
{
next = &item;
nextstart = address;
}
}
if (holder != nullptr)
{
note("4 GiB lower (an offset wrapped around 32 bits) in the " + label(*holder, holderstart) + " at its byte " + std::to_string(lower > holderstart ? lower - holderstart : 0));
}
else if (next != nullptr)
{
note("4 GiB lower (an index below zero wrapped around 32 bits?) " + bytes(nextstart - upper) + " before the " + label(*next, nextstart));
}
}
return (result.empty() ? std::string("in nothing known") : result);
}