From 7e3826d9e2baf0dbb07a924b5e30821ee79b8f0d Mon Sep 17 00:00:00 2001 From: Jakub Jermar Date: Wed, 16 Aug 2017 23:52:46 +0200 Subject: [PATCH] Provide basic interfaces to work with kobjects --- kernel/Makefile | 1 + kernel/generic/include/kobject/kobject.h | 10 ++++- kernel/generic/include/proc/task.h | 2 +- .../kobject/kobject.h => src/kobject/kobject.c} | 47 ++++++++++++++++------ 4 files changed, 45 insertions(+), 15 deletions(-) copy kernel/generic/{include/kobject/kobject.h => src/kobject/kobject.c} (61%) diff --git a/kernel/Makefile b/kernel/Makefile index 714b65a20..565193cb9 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -285,6 +285,7 @@ GENERIC_SOURCES = \ generic/src/ipc/ipcrsc.c \ generic/src/ipc/irq.c \ generic/src/ipc/event.c \ + generic/src/kobject/kobject.c \ generic/src/security/perm.c \ generic/src/sysinfo/sysinfo.c \ generic/src/sysinfo/stats.c diff --git a/kernel/generic/include/kobject/kobject.h b/kernel/generic/include/kobject/kobject.h index 99a7c85b0..df3938e99 100644 --- a/kernel/generic/include/kobject/kobject.h +++ b/kernel/generic/include/kobject/kobject.h @@ -39,8 +39,11 @@ #define MAX_KERNEL_OBJECTS 64 +#define KOBJECT_INVALID_CAP -1 + typedef enum { - KOBJECT_TYPE_INVALID + KOBJECT_TYPE_INVALID, + KOBJECT_TYPE_ALLOCATED } kobject_type_t; typedef struct { @@ -49,6 +52,11 @@ typedef struct { }; } kobject_t; +extern kobject_t *kobject_get_local(int, kobject_type_t); + +struct task; +extern int kobject_alloc(struct task *); +extern void kobject_free(struct task *, int); #endif diff --git a/kernel/generic/include/proc/task.h b/kernel/generic/include/proc/task.h index 9507f0154..dd1e55882 100644 --- a/kernel/generic/include/proc/task.h +++ b/kernel/generic/include/proc/task.h @@ -96,7 +96,7 @@ typedef struct task { /** Task permissions. */ perm_t perms; - /** Sending communication endpoints */ + /** Kernel objects */ kobject_t kobject[MAX_KERNEL_OBJECTS]; /* IPC stuff */ diff --git a/kernel/generic/include/kobject/kobject.h b/kernel/generic/src/kobject/kobject.c similarity index 61% copy from kernel/generic/include/kobject/kobject.h copy to kernel/generic/src/kobject/kobject.c index 99a7c85b0..c315346d2 100644 --- a/kernel/generic/include/kobject/kobject.h +++ b/kernel/generic/src/kobject/kobject.c @@ -32,25 +32,46 @@ /** @file */ -#ifndef KERN_KOBJECT_H_ -#define KERN_KOBJECT_H_ +#include +#include +#include -#include +kobject_t *kobject_get_local(int cap, kobject_type_t type) +{ + if ((cap < 0) || (cap >= MAX_KERNEL_OBJECTS)) + return NULL; + if (TASK->kobject[cap].type != type) + return NULL; + return &TASK->kobject[cap]; +} -#define MAX_KERNEL_OBJECTS 64 +int kobject_alloc(task_t *task) +{ + int cap; -typedef enum { - KOBJECT_TYPE_INVALID -} kobject_type_t; + irq_spinlock_lock(&task->lock, true); + for (cap = 0; cap < MAX_KERNEL_OBJECTS; cap++) { + if (task->kobject[cap].type == KOBJECT_TYPE_INVALID) { + task->kobject[cap].type = KOBJECT_TYPE_ALLOCATED; + irq_spinlock_unlock(&task->lock, true); + return cap; + } + } + irq_spinlock_unlock(&task->lock, true); -typedef struct { - kobject_type_t type; - union { - }; -} kobject_t; + return KOBJECT_INVALID_CAP; +} +void kobject_free(task_t *task, int cap) +{ + assert(cap >= 0); + assert(cap < MAX_KERNEL_OBJECTS); + assert(task->kobject[cap].type != KOBJECT_TYPE_INVALID); -#endif + irq_spinlock_lock(&task->lock, true); + task->kobject[cap].type = KOBJECT_TYPE_INVALID; + irq_spinlock_unlock(&task->lock, true); +} /** @} */ -- 2.11.4.GIT