Various accuracy improvements in services

* 'Fix' memory accounting to not measure reserved regions
* Fix some copy bugs introduced by switch to span
* Correct remap the behaviour of Modify so it actually works
This commit is contained in:
Billy Laws 2020-11-10 21:28:26 +00:00 committed by ◱ PixelyIon
parent c7e5202042
commit c161ef0cac
4 changed files with 10 additions and 12 deletions

View File

@ -199,7 +199,7 @@ namespace skyline::kernel {
std::shared_lock lock(mutex); std::shared_lock lock(mutex);
size_t size{}; size_t size{};
for (const auto &chunk : chunks) for (const auto &chunk : chunks)
if (chunk.state != memory::states::Unmapped) if (chunk.state != memory::states::Unmapped && chunk.state != memory::states::Reserved)
size += chunk.size; size += chunk.size;
return size; return size;
} }

View File

@ -20,7 +20,7 @@ namespace skyline::service::am {
return result::OutOfBounds; return result::OutOfBounds;
if (size) if (size)
span(parent->content).copy_from(request.outputBuf.at(0), size); span(parent->content).copy_from(request.inputBuf.at(0), size);
return {}; return {};
} }

View File

@ -61,7 +61,7 @@ namespace skyline::service::hid {
Result IHidServer::AcquireNpadStyleSetUpdateEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { Result IHidServer::AcquireNpadStyleSetUpdateEventHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {
auto id{request.Pop<NpadId>()}; auto id{request.Pop<NpadId>()};
request.copyHandles.push_back(state.process->InsertItem(state.input->npad.at(id).updateEvent)); response.copyHandles.push_back(state.process->InsertItem(state.input->npad.at(id).updateEvent));
return {}; return {};
} }

View File

@ -79,19 +79,13 @@ namespace skyline::service::nvdrv::device {
} &data = buffer.as<Data>(); } &data = buffer.as<Data>();
try { try {
auto driver{nvdrv::driver.lock()};
auto nvmap{driver->nvMap.lock()};
auto mapping{nvmap->GetObject(data.nvmapHandle)};
if (data.flags.remap) { if (data.flags.remap) {
auto region{regionMap.upper_bound(data.offset)}; auto region{regionMap.lower_bound(data.offset)};
if ((region == regionMap.begin()) || (region == regionMap.end())) { if (region == regionMap.end()) {
state.logger->Warn("Cannot remap an unmapped GPU address space region: 0x{:X}", data.offset); state.logger->Warn("Cannot remap an unmapped GPU address space region: 0x{:X}", data.offset);
return NvStatus::BadParameter; return NvStatus::BadParameter;
} }
region--; // Upper bound gives us the region after the one we want
if (region->second.size < data.mappingSize) { if (region->second.size < data.mappingSize) {
state.logger->Warn("Cannot remap an partially mapped GPU address space region: 0x{:X}", data.offset); state.logger->Warn("Cannot remap an partially mapped GPU address space region: 0x{:X}", data.offset);
return NvStatus::BadParameter; return NvStatus::BadParameter;
@ -100,7 +94,7 @@ namespace skyline::service::nvdrv::device {
u64 gpuAddress{data.offset + data.bufferOffset}; u64 gpuAddress{data.offset + data.bufferOffset};
u8 *cpuPtr{region->second.ptr + data.bufferOffset}; u8 *cpuPtr{region->second.ptr + data.bufferOffset};
if (state.gpu->memoryManager.MapFixed(gpuAddress, cpuPtr, data.mappingSize)) { if (!state.gpu->memoryManager.MapFixed(gpuAddress, cpuPtr, data.mappingSize)) {
state.logger->Warn("Failed to remap GPU address space region: 0x{:X}", gpuAddress); state.logger->Warn("Failed to remap GPU address space region: 0x{:X}", gpuAddress);
return NvStatus::BadParameter; return NvStatus::BadParameter;
} }
@ -108,6 +102,10 @@ namespace skyline::service::nvdrv::device {
return NvStatus::Success; return NvStatus::Success;
} }
auto driver{nvdrv::driver.lock()};
auto nvmap{driver->nvMap.lock()};
auto mapping{nvmap->GetObject(data.nvmapHandle)};
u8 *cpuPtr{data.bufferOffset + mapping->ptr}; u8 *cpuPtr{data.bufferOffset + mapping->ptr};
u64 size{data.mappingSize ? data.mappingSize : mapping->size}; u64 size{data.mappingSize ? data.mappingSize : mapping->size};