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.

This commit is contained in:
yellows8 2017-11-14 12:15:23 -05:00
parent e6fee70ee4
commit 567e8ed6e1
2 changed files with 33 additions and 11 deletions

View File

@ -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)

View File

@ -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;