summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar David Marcec2018-10-11 23:06:34 +1100
committerGravatar David Marcec2018-10-11 23:06:34 +1100
commitc7763603ef8ac1001b2926bf91ecc42a45dd5fcb (patch)
tree59b3c585431b0d888866c6e8f1252d9cfca0a0f9 /src/core
parentMerge pull request #1458 from FernandoS27/fix-render-target-block-settings (diff)
downloadyuzu-c7763603ef8ac1001b2926bf91ecc42a45dd5fcb.tar.gz
yuzu-c7763603ef8ac1001b2926bf91ecc42a45dd5fcb.tar.xz
yuzu-c7763603ef8ac1001b2926bf91ecc42a45dd5fcb.zip
Added error codes for nvmap
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvmap.cpp71
1 files changed, 59 insertions, 12 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp
index a2287cc1b..c0b5ac47b 100644
--- a/src/core/hle/service/nvdrv/devices/nvmap.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp
@@ -11,6 +11,13 @@
11 11
12namespace Service::Nvidia::Devices { 12namespace Service::Nvidia::Devices {
13 13
14namespace NvErrCodes {
15enum {
16 OperationNotPermitted = -1,
17 InvalidValue = -22,
18};
19}
20
14nvmap::nvmap() = default; 21nvmap::nvmap() = default;
15nvmap::~nvmap() = default; 22nvmap::~nvmap() = default;
16 23
@@ -44,7 +51,11 @@ u32 nvmap::ioctl(Ioctl command, const std::vector<u8>& input, std::vector<u8>& o
44u32 nvmap::IocCreate(const std::vector<u8>& input, std::vector<u8>& output) { 51u32 nvmap::IocCreate(const std::vector<u8>& input, std::vector<u8>& output) {
45 IocCreateParams params; 52 IocCreateParams params;
46 std::memcpy(&params, input.data(), sizeof(params)); 53 std::memcpy(&params, input.data(), sizeof(params));
54 LOG_DEBUG(Service_NVDRV, "size=0x{:08X}", params.size);
47 55
56 if (!params.size) {
57 return static_cast<u32>(NvErrCodes::InvalidValue);
58 }
48 // Create a new nvmap object and obtain a handle to it. 59 // Create a new nvmap object and obtain a handle to it.
49 auto object = std::make_shared<Object>(); 60 auto object = std::make_shared<Object>();
50 object->id = next_id++; 61 object->id = next_id++;
@@ -55,8 +66,6 @@ u32 nvmap::IocCreate(const std::vector<u8>& input, std::vector<u8>& output) {
55 u32 handle = next_handle++; 66 u32 handle = next_handle++;
56 handles[handle] = std::move(object); 67 handles[handle] = std::move(object);
57 68
58 LOG_DEBUG(Service_NVDRV, "size=0x{:08X}", params.size);
59
60 params.handle = handle; 69 params.handle = handle;
61 70
62 std::memcpy(output.data(), &params, sizeof(params)); 71 std::memcpy(output.data(), &params, sizeof(params));
@@ -66,9 +75,28 @@ u32 nvmap::IocCreate(const std::vector<u8>& input, std::vector<u8>& output) {
66u32 nvmap::IocAlloc(const std::vector<u8>& input, std::vector<u8>& output) { 75u32 nvmap::IocAlloc(const std::vector<u8>& input, std::vector<u8>& output) {
67 IocAllocParams params; 76 IocAllocParams params;
68 std::memcpy(&params, input.data(), sizeof(params)); 77 std::memcpy(&params, input.data(), sizeof(params));
78 LOG_DEBUG(Service_NVDRV, "called, addr={:X}", params.addr);
79
80 if (!params.handle) {
81 return static_cast<u32>(NvErrCodes::InvalidValue);
82 }
83
84 if ((params.align - 1) & params.align) {
85 return static_cast<u32>(NvErrCodes::InvalidValue);
86 }
87
88 if (params.align < 0x1000) {
89 params.align = 0x1000;
90 }
69 91
70 auto object = GetObject(params.handle); 92 auto object = GetObject(params.handle);
71 ASSERT(object); 93 if (!object) {
94 return static_cast<u32>(NvErrCodes::InvalidValue);
95 }
96
97 if (object->status == Object::Status::Allocated) {
98 return static_cast<u32>(NvErrCodes::OperationNotPermitted);
99 }
72 100
73 object->flags = params.flags; 101 object->flags = params.flags;
74 object->align = params.align; 102 object->align = params.align;
@@ -76,8 +104,6 @@ u32 nvmap::IocAlloc(const std::vector<u8>& input, std::vector<u8>& output) {
76 object->addr = params.addr; 104 object->addr = params.addr;
77 object->status = Object::Status::Allocated; 105 object->status = Object::Status::Allocated;
78 106
79 LOG_DEBUG(Service_NVDRV, "called, addr={:X}", params.addr);
80
81 std::memcpy(output.data(), &params, sizeof(params)); 107 std::memcpy(output.data(), &params, sizeof(params));
82 return 0; 108 return 0;
83} 109}
@@ -88,8 +114,14 @@ u32 nvmap::IocGetId(const std::vector<u8>& input, std::vector<u8>& output) {
88 114
89 LOG_WARNING(Service_NVDRV, "called"); 115 LOG_WARNING(Service_NVDRV, "called");
90 116
117 if (!params.handle) {
118 return static_cast<u32>(NvErrCodes::InvalidValue);
119 }
120
91 auto object = GetObject(params.handle); 121 auto object = GetObject(params.handle);
92 ASSERT(object); 122 if (!object) {
123 return static_cast<u32>(NvErrCodes::OperationNotPermitted);
124 }
93 125
94 params.id = object->id; 126 params.id = object->id;
95 127
@@ -105,7 +137,14 @@ u32 nvmap::IocFromId(const std::vector<u8>& input, std::vector<u8>& output) {
105 137
106 auto itr = std::find_if(handles.begin(), handles.end(), 138 auto itr = std::find_if(handles.begin(), handles.end(),
107 [&](const auto& entry) { return entry.second->id == params.id; }); 139 [&](const auto& entry) { return entry.second->id == params.id; });
108 ASSERT(itr != handles.end()); 140 if (itr == handles.end()) {
141 return static_cast<u32>(NvErrCodes::InvalidValue);
142 }
143
144 auto& object = itr->second;
145 if (object->status != Object::Status::Allocated) {
146 return static_cast<u32>(NvErrCodes::InvalidValue);
147 }
109 148
110 itr->second->refcount++; 149 itr->second->refcount++;
111 150
@@ -125,8 +164,13 @@ u32 nvmap::IocParam(const std::vector<u8>& input, std::vector<u8>& output) {
125 LOG_WARNING(Service_NVDRV, "(STUBBED) called type={}", params.param); 164 LOG_WARNING(Service_NVDRV, "(STUBBED) called type={}", params.param);
126 165
127 auto object = GetObject(params.handle); 166 auto object = GetObject(params.handle);
128 ASSERT(object); 167 if (!object) {
129 ASSERT(object->status == Object::Status::Allocated); 168 return static_cast<u32>(NvErrCodes::InvalidValue);
169 }
170
171 if (object->status != Object::Status::Allocated) {
172 return static_cast<u32>(NvErrCodes::OperationNotPermitted);
173 }
130 174
131 switch (static_cast<ParamTypes>(params.param)) { 175 switch (static_cast<ParamTypes>(params.param)) {
132 case ParamTypes::Size: 176 case ParamTypes::Size:
@@ -163,9 +207,12 @@ u32 nvmap::IocFree(const std::vector<u8>& input, std::vector<u8>& output) {
163 LOG_WARNING(Service_NVDRV, "(STUBBED) called"); 207 LOG_WARNING(Service_NVDRV, "(STUBBED) called");
164 208
165 auto itr = handles.find(params.handle); 209 auto itr = handles.find(params.handle);
166 ASSERT(itr != handles.end()); 210 if (itr == handles.end()) {
167 211 return static_cast<u32>(NvErrCodes::InvalidValue);
168 ASSERT(itr->second->refcount > 0); 212 }
213 if (!itr->second->refcount) {
214 return static_cast<u32>(NvErrCodes::InvalidValue);
215 }
169 216
170 itr->second->refcount--; 217 itr->second->refcount--;
171 218