From 710aae754ede8221e405b1383142cf7f57c5c803 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 21 Sep 2024 17:48:02 -0300 Subject: [PATCH] pread/pwrite: pass buffer directly --- kernel-src/sys/syscalls/pread.c | 13 +++---------- kernel-src/sys/syscalls/pwrite.c | 13 +------------ 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/kernel-src/sys/syscalls/pread.c b/kernel-src/sys/syscalls/pread.c index 68693ec7..09964e8c 100644 --- a/kernel-src/sys/syscalls/pread.c +++ b/kernel-src/sys/syscalls/pread.c @@ -10,12 +10,6 @@ syscallret_t syscall_pread(context_t *context, int fd, void *buffer, size_t size .ret = -1 }; - void *kernelbuff = vmm_map(NULL, size, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL); - if (kernelbuff == NULL) { - ret.errno = ENOMEM; - return ret; - } - file_t *file = fd_get(fd); if (file == NULL || (file->flags & FILE_READ) == 0) { @@ -36,17 +30,16 @@ syscallret_t syscall_pread(context_t *context, int fd, void *buffer, size_t size } size_t bytesread; - ret.errno = vfs_read(file->vnode, kernelbuff, size, offset, &bytesread, fileflagstovnodeflags(file->flags)); + ret.errno = vfs_read(file->vnode, buffer, size, offset, &bytesread, fileflagstovnodeflags(file->flags)); if (ret.errno) goto cleanup; - ret.errno = usercopy_touser(buffer, kernelbuff, bytesread); - ret.ret = ret.errno ? -1 : bytesread; + ret.errno = 0; + ret.ret = bytesread; cleanup: if (file) fd_release(file); - vmm_unmap(kernelbuff, size, 0); return ret; } diff --git a/kernel-src/sys/syscalls/pwrite.c b/kernel-src/sys/syscalls/pwrite.c index ea108fd8..6604ef3a 100644 --- a/kernel-src/sys/syscalls/pwrite.c +++ b/kernel-src/sys/syscalls/pwrite.c @@ -8,12 +8,6 @@ syscallret_t syscall_pwrite(context_t *context, int fd, void *buffer, size_t siz .ret = -1 }; - void *kernelbuff = vmm_map(NULL, size, VMM_FLAGS_ALLOCATE, ARCH_MMU_FLAGS_READ | ARCH_MMU_FLAGS_WRITE | ARCH_MMU_FLAGS_NOEXEC, NULL); - if (kernelbuff == NULL) { - ret.errno = ENOMEM; - return ret; - } - file_t *file = fd_get(fd); if (file == NULL || (file->flags & FILE_WRITE) == 0) { @@ -27,10 +21,6 @@ syscallret_t syscall_pwrite(context_t *context, int fd, void *buffer, size_t siz goto cleanup; } - ret.errno = usercopy_fromuser(kernelbuff, buffer, size); - if (ret.errno) - goto cleanup; - size_t tmp; if (file->vnode->type == V_TYPE_SOCKET || file->vnode->type == V_TYPE_FIFO || (file->vnode->type == V_TYPE_CHDEV && VOP_MAXSEEK(file->vnode, &tmp))) { ret.errno = ESPIPE; @@ -38,7 +28,7 @@ syscallret_t syscall_pwrite(context_t *context, int fd, void *buffer, size_t siz } size_t byteswritten; - ret.errno = vfs_write(file->vnode, kernelbuff, size, offset, &byteswritten, fileflagstovnodeflags(file->flags)); + ret.errno = vfs_write(file->vnode, buffer, size, offset, &byteswritten, fileflagstovnodeflags(file->flags)); if (ret.errno) goto cleanup; @@ -49,6 +39,5 @@ cleanup: if (file) fd_release(file); - vmm_unmap(kernelbuff, size, 0); return ret; }