diff options
| author | Subv <subv2112@gmail.com> | 2018-07-01 10:48:50 -0500 | 
|---|---|---|
| committer | Subv <subv2112@gmail.com> | 2018-07-01 10:48:50 -0500 | 
| commit | a093feca62982f33be89811b89b6f3f412ef4815 (patch) | |
| tree | 71f22b73a25042a692fe5a56b34bab0ce4170747 | |
| parent | 50ef2beb5850362dda9c1d50531475f0c5b6e8df (diff) | |
nvmap: Return the address of the nvmap object when Freeing it for the last time.
This behavior is confirmed by reverse engineering.
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvmap.cpp | 13 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvmap.h | 2 | 
2 files changed, 11 insertions, 4 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp index 23fe98190..2fc7c87e0 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.cpp +++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp @@ -148,6 +148,7 @@ u32 nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) {  }  u32 nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) { +    // TODO(Subv): These flags are unconfirmed.      enum FreeFlags {          Freed = 0,          NotFreedYet = 1, @@ -161,15 +162,21 @@ u32 nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) {      auto itr = handles.find(params.handle);      ASSERT(itr != handles.end()); +    ASSERT(itr->second->refcount > 0); +      itr->second->refcount--; -    params.refcount = itr->second->refcount;      params.size = itr->second->size; -    if (itr->second->refcount == 0) +    if (itr->second->refcount == 0) {          params.flags = Freed; -    else +        // The address of the nvmap is written to the output if we're finally freeing it, otherwise +        // 0 is written. +        params.address = itr->second->addr; +    } else {          params.flags = NotFreedYet; +        params.address = 0; +    }      handles.erase(params.handle); diff --git a/src/core/hle/service/nvdrv/devices/nvmap.h b/src/core/hle/service/nvdrv/devices/nvmap.h index 39fafaa7c..f2eec6409 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.h +++ b/src/core/hle/service/nvdrv/devices/nvmap.h @@ -94,7 +94,7 @@ private:      struct IocFreeParams {          u32_le handle;          INSERT_PADDING_BYTES(4); -        u64_le refcount; +        u64_le address;          u32_le size;          u32_le flags;      };  | 
