mirror of
https://github.com/switchbrew/libnx.git
synced 2025-08-07 00:29:23 +02:00
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:
parent
e6fee70ee4
commit
567e8ed6e1
@ -35,6 +35,8 @@
|
|||||||
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
|
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
|
||||||
|
|
||||||
/* used to decode ioctl numbers.. */
|
/* 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)
|
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
|
||||||
|
|
||||||
|
@ -199,24 +199,44 @@ Result nvIoctl(u32 fd, u32 request, void* argp) {
|
|||||||
} *raw;
|
} *raw;
|
||||||
|
|
||||||
size_t bufsize = _IOC_SIZE(request);
|
size_t bufsize = _IOC_SIZE(request);
|
||||||
|
u32 dir = _IOC_DIR(request);
|
||||||
|
|
||||||
void* buf_static = argp, *buf_transfer = argp;
|
void* buf_send = NULL, *buf_recv = NULL;
|
||||||
size_t buf_static_size = bufsize, buf_transfer_size = bufsize;
|
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) {
|
if(g_nvIpcBufferSize!=0 && bufsize <= g_nvIpcBufferSize) {
|
||||||
buf_transfer = NULL;
|
bufs_send[0] = NULL;
|
||||||
buf_transfer_size = 0;
|
bufs_send_size[0] = 0;
|
||||||
|
bufs_recv[0] = NULL;
|
||||||
|
bufs_recv_size[0] = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
buf_static = NULL;
|
bufs_send[1] = NULL;
|
||||||
buf_static_size = 0;
|
bufs_send_size[1] = 0;
|
||||||
|
bufs_recv[1] = NULL;
|
||||||
|
bufs_recv_size[1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ipcAddSendBuffer(&c, buf_transfer, buf_transfer_size, 0);
|
ipcAddSendBuffer(&c, bufs_send[0], bufs_send_size[0], 0);
|
||||||
ipcAddRecvBuffer(&c, buf_transfer, buf_transfer_size, 0);
|
ipcAddRecvBuffer(&c, bufs_recv[0], bufs_recv_size[0], 0);
|
||||||
|
|
||||||
ipcAddSendStatic(&c, buf_static, buf_static_size, 0);
|
ipcAddSendStatic(&c, bufs_send[1], bufs_send_size[1], 0);
|
||||||
ipcAddRecvStatic(&c, buf_static, buf_static_size, 0);
|
ipcAddRecvStatic(&c, bufs_recv[1], bufs_recv_size[1], 0);
|
||||||
|
|
||||||
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
raw = ipcPrepareHeader(&c, sizeof(*raw));
|
||||||
raw->magic = SFCI_MAGIC;
|
raw->magic = SFCI_MAGIC;
|
||||||
|
Loading…
Reference in New Issue
Block a user