|
|
@ -22,7 +22,8 @@ enum { |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
nvhost_as_gpu::nvhost_as_gpu(std::shared_ptr<nvmap> nvmap_dev) : nvmap_dev(std::move(nvmap_dev)) {} |
|
|
|
|
|
|
|
|
nvhost_as_gpu::nvhost_as_gpu(Core::System& system, std::shared_ptr<nvmap> nvmap_dev) |
|
|
|
|
|
: nvdevice(system), nvmap_dev(std::move(nvmap_dev)) {} |
|
|
nvhost_as_gpu::~nvhost_as_gpu() = default; |
|
|
nvhost_as_gpu::~nvhost_as_gpu() = default; |
|
|
|
|
|
|
|
|
u32 nvhost_as_gpu::ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) { |
|
|
u32 nvhost_as_gpu::ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) { |
|
|
@ -65,7 +66,7 @@ u32 nvhost_as_gpu::AllocateSpace(const std::vector<u8>& input, std::vector<u8>& |
|
|
LOG_DEBUG(Service_NVDRV, "called, pages={:X}, page_size={:X}, flags={:X}", params.pages, |
|
|
LOG_DEBUG(Service_NVDRV, "called, pages={:X}, page_size={:X}, flags={:X}", params.pages, |
|
|
params.page_size, params.flags); |
|
|
params.page_size, params.flags); |
|
|
|
|
|
|
|
|
auto& gpu = Core::System::GetInstance().GPU(); |
|
|
|
|
|
|
|
|
auto& gpu = system.GPU(); |
|
|
const u64 size{static_cast<u64>(params.pages) * static_cast<u64>(params.page_size)}; |
|
|
const u64 size{static_cast<u64>(params.pages) * static_cast<u64>(params.page_size)}; |
|
|
if (params.flags & 1) { |
|
|
if (params.flags & 1) { |
|
|
params.offset = gpu.MemoryManager().AllocateSpace(params.offset, size, 1); |
|
|
params.offset = gpu.MemoryManager().AllocateSpace(params.offset, size, 1); |
|
|
@ -85,7 +86,7 @@ u32 nvhost_as_gpu::Remap(const std::vector<u8>& input, std::vector<u8>& output) |
|
|
std::vector<IoctlRemapEntry> entries(num_entries); |
|
|
std::vector<IoctlRemapEntry> entries(num_entries); |
|
|
std::memcpy(entries.data(), input.data(), input.size()); |
|
|
std::memcpy(entries.data(), input.data(), input.size()); |
|
|
|
|
|
|
|
|
auto& gpu = Core::System::GetInstance().GPU(); |
|
|
|
|
|
|
|
|
auto& gpu = system.GPU(); |
|
|
for (const auto& entry : entries) { |
|
|
for (const auto& entry : entries) { |
|
|
LOG_WARNING(Service_NVDRV, "remap entry, offset=0x{:X} handle=0x{:X} pages=0x{:X}", |
|
|
LOG_WARNING(Service_NVDRV, "remap entry, offset=0x{:X} handle=0x{:X} pages=0x{:X}", |
|
|
entry.offset, entry.nvmap_handle, entry.pages); |
|
|
entry.offset, entry.nvmap_handle, entry.pages); |
|
|
@ -136,7 +137,7 @@ u32 nvhost_as_gpu::MapBufferEx(const std::vector<u8>& input, std::vector<u8>& ou |
|
|
// case to prevent unexpected behavior.
|
|
|
// case to prevent unexpected behavior.
|
|
|
ASSERT(object->id == params.nvmap_handle); |
|
|
ASSERT(object->id == params.nvmap_handle); |
|
|
|
|
|
|
|
|
auto& gpu = Core::System::GetInstance().GPU(); |
|
|
|
|
|
|
|
|
auto& gpu = system.GPU(); |
|
|
|
|
|
|
|
|
if (params.flags & 1) { |
|
|
if (params.flags & 1) { |
|
|
params.offset = gpu.MemoryManager().MapBufferEx(object->addr, params.offset, object->size); |
|
|
params.offset = gpu.MemoryManager().MapBufferEx(object->addr, params.offset, object->size); |
|
|
@ -173,8 +174,7 @@ u32 nvhost_as_gpu::UnmapBuffer(const std::vector<u8>& input, std::vector<u8>& ou |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
params.offset = Core::System::GetInstance().GPU().MemoryManager().UnmapBuffer(params.offset, |
|
|
|
|
|
itr->second.size); |
|
|
|
|
|
|
|
|
params.offset = system.GPU().MemoryManager().UnmapBuffer(params.offset, itr->second.size); |
|
|
buffer_mappings.erase(itr->second.offset); |
|
|
buffer_mappings.erase(itr->second.offset); |
|
|
|
|
|
|
|
|
std::memcpy(output.data(), ¶ms, output.size()); |
|
|
std::memcpy(output.data(), ¶ms, output.size()); |
|
|
|