mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-02-08 10:39:43 +00:00
36 lines
1,004 B
Text
36 lines
1,004 B
Text
|
uvec2 Helper_TranslateAddress(uvec2 address)
|
||
|
{
|
||
|
uvec4* buffer_regions = (uvec4*)packPtr(s_page_table.xy);
|
||
|
|
||
|
uint64_t address64 = packUint2x32(address);
|
||
|
uint count = buffer_regions[0].x;
|
||
|
uint left = 0;
|
||
|
uint right = count;
|
||
|
|
||
|
while (left != right)
|
||
|
{
|
||
|
uint middle = left + ((right - left) >> 1);
|
||
|
uint offset = middle * 2;
|
||
|
uvec4 guest_info = buffer_regions[1 + offset];
|
||
|
uvec4 host_info = buffer_regions[2 + offset];
|
||
|
|
||
|
uint64_t start_address = packUint2x32(guest_info.xy);
|
||
|
uint64_t end_address = packUint2x32(guest_info.zw);
|
||
|
if (address64 >= start_address && address64 < end_address)
|
||
|
{
|
||
|
uint64_t host_address = packUint2x32(host_info.xy);
|
||
|
return unpackUint2x32((address64 - start_address) + host_address);
|
||
|
}
|
||
|
|
||
|
if (address64 < start_address)
|
||
|
{
|
||
|
right = middle;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
left = middle + 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return uvec2(0, 0);
|
||
|
}
|