From 690e09339eb9c763924bc4438ffa3b9ef3bc3624 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Sat, 14 Feb 2026 20:48:38 +0100 Subject: [PATCH] procgroup capabilities --- kernel/device/device.h | 3 ++- kernel/device/terminal.c | 7 ++++++- kernel/device/terminal.h | 4 +++- kernel/libk/ringbuffer.c | 20 ++++++++++++++++++++ kernel/libk/ringbuffer.h | 36 ++++++++++++++++++++++++++++++++++++ kernel/libk/src.mk | 6 ++++-- kernel/proc/capability.h | 6 ++++++ kernel/proc/proc.c | 2 ++ kernel/proc/procgroup.h | 1 + kernel/syscall/syscall.c | 2 +- 10 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 kernel/libk/ringbuffer.c create mode 100644 kernel/libk/ringbuffer.h create mode 100644 kernel/proc/capability.h diff --git a/kernel/device/device.h b/kernel/device/device.h index e49c89b..6a3399e 100644 --- a/kernel/device/device.h +++ b/kernel/device/device.h @@ -2,9 +2,10 @@ #define _KERNEL_DEVICE_DEVICE_H #include +#include #include -typedef int (*device_op_func_t) (void* a1, void* a2, void* a3, void* a4); +typedef int (*device_op_func_t) (struct proc* proc, void* a1, void* a2, void* a3, void* a4); struct device { int id; diff --git a/kernel/device/terminal.c b/kernel/device/terminal.c index 8ee2f65..398ec16 100644 --- a/kernel/device/terminal.c +++ b/kernel/device/terminal.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include struct flanterm_context* ft_ctx; @@ -32,9 +34,12 @@ bool terminal_init (void* arg) { void terminal_fini (void) {} -int terminal_putstr (void* a1, void* a2, void* a3, void* a4) { +int terminal_putstr (struct proc* proc, void* a1, void* a2, void* a3, void* a4) { (void)a2, (void)a3, (void)a4; + if (!(proc->procgroup->capabilities & PROC_CAP_TERMINAL)) + return -ST_PERMISSION_ERROR; + char* string = (char*)a1; size_t* len = (size_t*)a2; diff --git a/kernel/device/terminal.h b/kernel/device/terminal.h index f2c1df2..f7678da 100644 --- a/kernel/device/terminal.h +++ b/kernel/device/terminal.h @@ -1,8 +1,10 @@ #ifndef _KERNEL_DEVICE_TERMINAL_H #define _KERNEL_DEVICE_TERMINAL_H +#include + bool terminal_init (void* arg); void terminal_fini (void); -int terminal_putstr (void* a1, void* a2, void* a3, void* a4); +int terminal_putstr (struct proc* proc, void* a1, void* a2, void* a3, void* a4); #endif // _KERNEL_DEVICE_TERMINAL_H diff --git a/kernel/libk/ringbuffer.c b/kernel/libk/ringbuffer.c new file mode 100644 index 0000000..578d7f1 --- /dev/null +++ b/kernel/libk/ringbuffer.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +bool ringbuffer_init (struct ringbuffer* rb, size_t capacity, size_t type_size) { + void* buf = malloc (capacity * type_size); + + if (buf == NULL) + return false; + + memset (rb, 0, sizeof (*rb)); + + rb->capacity = capacity; + rb->buffer = buf; + + return true; +} + +void ringbuffer_fini (struct ringbuffer* rb) { free (rb->buffer); } diff --git a/kernel/libk/ringbuffer.h b/kernel/libk/ringbuffer.h new file mode 100644 index 0000000..c12f25f --- /dev/null +++ b/kernel/libk/ringbuffer.h @@ -0,0 +1,36 @@ +#ifndef _KERNEL_LIBK_RINGBUFFER_H +#define _KERNEL_LIBK_RINGBUFFER_H + +#include + +struct ringbuffer { + void* buffer; + size_t tail; + size_t head; + size_t capacity; + size_t count; + bool full; +}; + +bool ringbuffer_init (struct ringbuffer* rb, size_t capacity, size_t type_size); +void ringbuffer_fini (struct ringbuffer* rb); + +#define ringbuffer_pop(type, rb, data) \ + do { \ + if ((rb)->count != 0) { \ + *(data) = ((type*)(rb)->buffer)[(rb)->tail]; \ + (rb)->tail = ((rb)->tail + 1) % (rb)->capacity; \ + (rb)->count--; \ + } \ + } while (0) + +#define ringbuffer_push(type, rb, data) \ + do { \ + if ((rb)->count != (rb)->capacity) { \ + ((type*)(rb)->buffer)[(rb)->head] = (data); \ + (rb)->head = ((rb)->head + 1) % (rb)->capacity; \ + (rb)->count++; \ + } \ + } while (0) + +#endif // _KERNEL_LIBK_RINGBUFFER_H diff --git a/kernel/libk/src.mk b/kernel/libk/src.mk index 1980e4b..04627ea 100644 --- a/kernel/libk/src.mk +++ b/kernel/libk/src.mk @@ -1,9 +1,11 @@ c += libk/string.c \ libk/printf.c \ libk/putchar_.c \ - libk/bm.c + libk/bm.c \ + libk/ringbuffer.c o += libk/string.o \ libk/printf.o \ libk/putchar_.o \ - libk/bm.o + libk/bm.o \ + libk/ringbuffer.o diff --git a/kernel/proc/capability.h b/kernel/proc/capability.h new file mode 100644 index 0000000..057a415 --- /dev/null +++ b/kernel/proc/capability.h @@ -0,0 +1,6 @@ +#ifndef _KERNEL_PROC_CAPABILITY_H +#define _KERNEL_PROC_CAPABILITY_H + +#define PROC_CAP_TERMINAL (1 << 0) + +#endif // _KERNEL_PROC_CAPABILITY_H diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 53bf2df..ed1c1ee 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -303,6 +304,7 @@ void proc_init (void) { proc_register (spin_proc, &spin_cpu); struct proc* init = proc_from_file ("ramdisk", "/init.exe"); + init->procgroup->capabilities |= PROC_CAP_TERMINAL; struct cpu* init_cpu = thiscpu; proc_register (init, &init_cpu); diff --git a/kernel/proc/procgroup.h b/kernel/proc/procgroup.h index 5cfbe64..4dcc889 100644 --- a/kernel/proc/procgroup.h +++ b/kernel/proc/procgroup.h @@ -31,6 +31,7 @@ struct procgroup { struct list_node_link* mappings; uintptr_t map_base; struct procgroup_tls tls; + uint64_t capabilities; }; struct procgroup* procgroup_create (void); diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 78ac462..4e47894 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -210,7 +210,7 @@ DEFINE_SYSCALL (sys_device_do) { spin_lock (&device->lock); - int ret = device->ops[cmd]((void*)ka1, (void*)ka2, (void*)ka3, (void*)ka4); + int ret = device->ops[cmd](proc, (void*)ka1, (void*)ka2, (void*)ka3, (void*)ka4); spin_unlock (&device->lock);