From 567e8ed6e1174a0e7fe6a0ade0ddb209e1da48ab Mon Sep 17 00:00:00 2001 From: yellows8 Date: Tue, 14 Nov 2017 12:15:23 -0500 Subject: [PATCH] Imported more defines from linux ioctl.h. In nvIoctl(), only set the addr/size for send/recv buffers when the associated direction bit is set. --- nx/include/switch/gfx/ioctl.h | 4 +++- nx/source/services/nv.c | 40 ++++++++++++++++++++++++++--------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/nx/include/switch/gfx/ioctl.h b/nx/include/switch/gfx/ioctl.h index 44d5db27..01b31776 100644 --- a/nx/include/switch/gfx/ioctl.h +++ b/nx/include/switch/gfx/ioctl.h @@ -35,6 +35,8 @@ #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) /* used to decode ioctl numbers.. */ - +#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) +#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) +#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) diff --git a/nx/source/services/nv.c b/nx/source/services/nv.c index 26272b3d..84c43c35 100644 --- a/nx/source/services/nv.c +++ b/nx/source/services/nv.c @@ -199,24 +199,44 @@ Result nvIoctl(u32 fd, u32 request, void* argp) { } *raw; size_t bufsize = _IOC_SIZE(request); + u32 dir = _IOC_DIR(request); - void* buf_static = argp, *buf_transfer = argp; - size_t buf_static_size = bufsize, buf_transfer_size = bufsize; + void* buf_send = NULL, *buf_recv = NULL; + size_t buf_send_size = 0, buf_recv_size = 0; + + if(dir & _IOC_WRITE) { + buf_send = argp; + buf_send_size = bufsize; + } + + if(dir & _IOC_READ) { + buf_recv = argp; + buf_recv_size = bufsize; + } + + void* bufs_send[2] = {buf_send, buf_send}; + void* bufs_recv[2] = {buf_recv, buf_recv}; + size_t bufs_send_size[2] = {buf_send_size, buf_send_size}; + size_t bufs_recv_size[2] = {buf_recv_size, buf_recv_size}; if(g_nvIpcBufferSize!=0 && bufsize <= g_nvIpcBufferSize) { - buf_transfer = NULL; - buf_transfer_size = 0; + bufs_send[0] = NULL; + bufs_send_size[0] = 0; + bufs_recv[0] = NULL; + bufs_recv_size[0] = 0; } else { - buf_static = NULL; - buf_static_size = 0; + bufs_send[1] = NULL; + bufs_send_size[1] = 0; + bufs_recv[1] = NULL; + bufs_recv_size[1] = 0; } - ipcAddSendBuffer(&c, buf_transfer, buf_transfer_size, 0); - ipcAddRecvBuffer(&c, buf_transfer, buf_transfer_size, 0); + ipcAddSendBuffer(&c, bufs_send[0], bufs_send_size[0], 0); + ipcAddRecvBuffer(&c, bufs_recv[0], bufs_recv_size[0], 0); - ipcAddSendStatic(&c, buf_static, buf_static_size, 0); - ipcAddRecvStatic(&c, buf_static, buf_static_size, 0); + ipcAddSendStatic(&c, bufs_send[1], bufs_send_size[1], 0); + ipcAddRecvStatic(&c, bufs_recv[1], bufs_recv_size[1], 0); raw = ipcPrepareHeader(&c, sizeof(*raw)); raw->magic = SFCI_MAGIC;