Compare commits

...
Sign in to create a new pull request.

2 commits

Author SHA1 Message Date
JPikachu
334149fb32 [nvdrv] Ignore but don't reject offset and size uses
All checks were successful
eden-license / license-header (pull_request) Successful in 30s
It seems after investigation and testing that these are in fact not errors and are expected behaviour.
So logging has been changed from error to debug and no longer returns a bad perameter.
2025-07-25 21:44:29 +02:00
JPikachu
fb4449428d [nvdrv] Implement SetErrorNotifier
Implements SetErrorNotifier() based on Switch kernel behavior.
Only mem is used; other fields are ignored. Guest misuse of offset or size is logged as an error and rejected.
Games like Super Mario Odyssey or Xenoblade may use this mechanism to detect timeouts.
2025-07-25 21:44:29 +02:00
2 changed files with 16 additions and 3 deletions

View file

@ -161,8 +161,20 @@ NvResult nvhost_gpu::ZCullBind(IoctlZCullBind& params) {
}
NvResult nvhost_gpu::SetErrorNotifier(IoctlSetErrorNotifier& params) {
LOG_WARNING(Service_NVDRV, "(STUBBED) called, offset={:X}, size={:X}, mem={:X}", params.offset,
params.size, params.mem);
if (params.mem == 0) {
LOG_DEBUG(Service_NVDRV, "called, SetErrorNotifier deinitialized");
error_notifier_mem = 0;
return NvResult::Success;
}
if (params.offset != 0 || params.size != 0) {
LOG_DEBUG(Service_NVDRV,
"called, SetErrorNotifier called with non-zero offset/size (ignored): offset=0x{:X}, size=0x{:X}",
params.offset, params.size);
}
LOG_DEBUG(Service_NVDRV, "called, SetErrorNotifier initialized, mem=0x{:X}", params.mem);
error_notifier_mem = params.mem;
return NvResult::Success;
}
@ -228,7 +240,7 @@ NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) {
return NvResult::NotInitialized;
}
switch (static_cast<CtxClasses>(params.class_num)) {
switch (static_cast<CtxClasses>(params.class_num)) {
case CtxClasses::Ctx2D:
case CtxClasses::Ctx3D:
case CtxClasses::CtxCompute:

View file

@ -172,6 +172,7 @@ private:
s32_le nvmap_fd{};
u64_le user_data{};
IoctlZCullBind zcull_params{};
u32_le error_notifier_mem{};
std::vector<IoctlAllocObjCtx> ctxObj_params{};
u32_le channel_priority{};
u32_le channel_timeslice{};