From d87f9541d10b3fe0b9d494054b5c6ed478bb88b6 Mon Sep 17 00:00:00 2001 From: fincs Date: Sun, 9 Dec 2018 16:21:12 +0100 Subject: [PATCH] NvMap: added support for loading remote NvMap objects (from id) --- nx/include/switch/nvidia/map.h | 16 ++++++++++++++++ nx/source/nvidia/map.c | 24 +++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/nx/include/switch/nvidia/map.h b/nx/include/switch/nvidia/map.h index 52823b40..7ace5893 100644 --- a/nx/include/switch/nvidia/map.h +++ b/nx/include/switch/nvidia/map.h @@ -16,6 +16,7 @@ u32 nvMapGetFd(void); void nvMapExit(void); Result nvMapCreate(NvMap* m, void* cpu_addr, u32 size, u32 align, NvKind kind, bool is_cpu_cacheable); +Result nvMapLoadRemote(NvMap* m, u32 id); void nvMapClose(NvMap* m); static inline u32 nvMapGetHandle(NvMap* m) @@ -28,7 +29,22 @@ static inline u32 nvMapGetId(NvMap* m) return m->id; } +static inline u32 nvMapGetSize(NvMap* m) +{ + return m->size; +} + static inline void* nvMapGetCpuAddr(NvMap* m) { return m->cpu_addr; } + +static inline bool nvMapIsRemote(NvMap* m) +{ + return !m->cpu_addr; +} + +static inline NvKind nvMapGetKind(NvMap* m) +{ + return m->kind; +} diff --git a/nx/source/nvidia/map.c b/nx/source/nvidia/map.c index 60877594..a64e7735 100644 --- a/nx/source/nvidia/map.c +++ b/nx/source/nvidia/map.c @@ -1,4 +1,4 @@ -#include +#include #include "types.h" #include "result.h" #include "arm/atomics.h" @@ -82,6 +82,28 @@ Result nvMapCreate(NvMap* m, void* cpu_addr, u32 size, u32 align, NvKind kind, b return rc; } +Result nvMapLoadRemote(NvMap* m, u32 id) +{ + Result rc; + + memset(m, 0, sizeof(*m)); + rc = nvioctlNvmap_FromId(g_nvmap_fd, id, &m->handle); + + if (R_SUCCEEDED(rc)) { + m->has_init = true; + m->id = id; + rc = nvioctlMap_Param(g_nvmap_fd, m->handle, NvMapParam_Size, &m->size); + } + + if (R_SUCCEEDED(rc)) + rc = nvioctlMap_Param(g_nvmap_fd, m->handle, NvMapParam_Kind, (u32*)&m->kind); + + if (R_FAILED(rc)) + nvMapClose(m); + + return rc; +} + void nvMapClose(NvMap* m) { if (!m->has_init)