From 2c058a56e6f00ec11c8328e1c55ecee8aad443ee Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 11 Jul 2023 23:01:52 -0300 Subject: [PATCH] kernel: random fixes on syscalls and pmm --- kernel-src/mm/pmm.c | 10 ++++++++++ kernel-src/sys/syscalls/read.c | 3 +-- kernel-src/sys/syscalls/write.c | 3 +-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/kernel-src/mm/pmm.c b/kernel-src/mm/pmm.c index af241b3b..7f377542 100644 --- a/kernel-src/mm/pmm.c +++ b/kernel-src/mm/pmm.c @@ -8,6 +8,7 @@ uintptr_t hhdmbase; static size_t memorysize; static size_t physicalpagecount; +static size_t used; typedef struct { spinlock_t lock; @@ -93,6 +94,7 @@ void *pmm_alloc(size_t size, int section) { bmset((void *)((page + j) * PAGE_SIZE), 0); spinlock_release(&bmsections[i].lock); + __atomic_add_fetch(&used, 1, __ATOMIC_SEQ_CST); return (void *)(page * PAGE_SIZE); } spinlock_release(&bmsections[i].lock); @@ -114,11 +116,19 @@ void pmm_free(void *addr, size_t size) { bmset((void *)((page + j) * PAGE_SIZE), 1); spinlock_release(&bmsections[i].lock); + __atomic_sub_fetch(&used, 1, __ATOMIC_SEQ_CST); return; } } } +void pmm_getinfo(size_t *pages, size_t *usedpages) { + if (pages) + *pages = physicalpagecount; + if (usedpages) + *usedpages = used; +} + #define TOP_1MB (0x100000 / PAGE_SIZE) #define TOP_4GB ((uint64_t)0x100000000 / PAGE_SIZE) diff --git a/kernel-src/sys/syscalls/read.c b/kernel-src/sys/syscalls/read.c index 8ad881a1..f63d3faa 100644 --- a/kernel-src/sys/syscalls/read.c +++ b/kernel-src/sys/syscalls/read.c @@ -23,10 +23,9 @@ syscallret_t syscall_read(context_t *context, int fd, void *buffer, size_t size) goto cleanup; } - // TODO pass flags size_t bytesread; uintmax_t offset = file->offset; - ret.errno = vfs_read(file->vnode, kernelbuff, size, file->offset, &bytesread, 0); + ret.errno = vfs_read(file->vnode, kernelbuff, size, file->offset, &bytesread, fileflagstovnodeflags(file->flags)); if (ret.errno) goto cleanup; diff --git a/kernel-src/sys/syscalls/write.c b/kernel-src/sys/syscalls/write.c index 9802e242..de43c7a0 100644 --- a/kernel-src/sys/syscalls/write.c +++ b/kernel-src/sys/syscalls/write.c @@ -24,10 +24,9 @@ syscallret_t syscall_write(context_t *context, int fd, void *buffer, size_t size // TODO safe memcpy memcpy(kernelbuff, buffer, size); - // TODO pass flags size_t byteswritten; uintmax_t offset = file->offset; - ret.errno = vfs_write(file->vnode, kernelbuff, size, offset, &byteswritten, 0); + ret.errno = vfs_write(file->vnode, kernelbuff, size, offset, &byteswritten, fileflagstovnodeflags(file->flags)); if (ret.errno) goto cleanup;