mirror of
https://github.com/switchbrew/libnx.git
synced 2025-08-05 16:09:24 +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))
|
||||
|
||||
/* 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)
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user