From a79d109fcc5ae7d19755faf6ece411af60d56614 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sat, 6 May 2023 22:22:05 +0100 Subject: [PATCH] obj: add header-offset field to object_type this allows the object header to be placed anywhere within the larger object structure. the object system now also ensures that the object is zero-initialised during allocation. --- include/socks/object.h | 1 + kxld/kext.c | 1 + obj/namespace.c | 1 + obj/object.c | 8 ++++++-- obj/set.c | 1 + sched/task.c | 1 + sched/thread.c | 1 + 7 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/socks/object.h b/include/socks/object.h index 3fe59af..1f0bfdc 100644 --- a/include/socks/object.h +++ b/include/socks/object.h @@ -48,6 +48,7 @@ struct object_type { enum object_type_flags ob_flags; char ob_name[32]; unsigned int ob_size; + unsigned int ob_header_offset; struct vm_cache ob_cache; struct queue_entry ob_list; struct queue ob_attrib; diff --git a/kxld/kext.c b/kxld/kext.c index f921ac2..844edc8 100644 --- a/kxld/kext.c +++ b/kxld/kext.c @@ -34,6 +34,7 @@ static kern_status_t kext_destroy(struct object *obj) static struct object_type kext_type = { .ob_name = "kext", .ob_size = sizeof(struct kext), + .ob_header_offset = offsetof(struct kext, k_base), .ob_ops = { .query_name = kext_query_name, }, diff --git a/obj/namespace.c b/obj/namespace.c index f21b5a8..f89dce8 100644 --- a/obj/namespace.c +++ b/obj/namespace.c @@ -33,6 +33,7 @@ static kern_status_t ns_get_child_named(struct object *obj, const char *name, st static struct object_type ns_type = { .ob_name = "namespace", .ob_size = sizeof(struct object_namespace), + .ob_header_offset = offsetof(struct object_namespace, ns_base), .ob_ops = { .query_name = ns_query_name, .get_named = ns_get_child_named, diff --git a/obj/object.c b/obj/object.c index 36e2916..b450a88 100644 --- a/obj/object.c +++ b/obj/object.c @@ -48,11 +48,15 @@ struct object *object_create(struct object_type *type) } struct vm_cache *cache = &type->ob_cache; - struct object *obj = vm_cache_alloc(cache, 0); - if (!obj) { + void *obj_buf = vm_cache_alloc(cache, 0); + if (!obj_buf) { return NULL; } + memset(obj_buf, 0x00, type->ob_size); + + struct object *obj = (struct object *)((unsigned char *)obj_buf + type->ob_header_offset); + obj->ob_type = type; obj->ob_lock = SPIN_LOCK_INIT; obj->ob_magic = OBJECT_MAGIC; diff --git a/obj/set.c b/obj/set.c index b5f33d7..fc2836e 100644 --- a/obj/set.c +++ b/obj/set.c @@ -58,6 +58,7 @@ static kern_status_t set_get_child_named(struct object *obj, const char *name, s static struct object_type set_type = { .ob_name = "set", .ob_size = sizeof(struct set), + .ob_header_offset = offsetof(struct set, s_base), .ob_ops = { .query_name = set_query_name, .get_named = set_get_child_named, diff --git a/sched/task.c b/sched/task.c index a3acbad..135734f 100644 --- a/sched/task.c +++ b/sched/task.c @@ -11,6 +11,7 @@ static struct object_type task_type = { .ob_name = "task", .ob_size = sizeof(struct task), + .ob_header_offset = offsetof(struct task, t_base), }; static struct task *__kernel_task; diff --git a/sched/thread.c b/sched/thread.c index afe3e4a..fa0b195 100644 --- a/sched/thread.c +++ b/sched/thread.c @@ -8,6 +8,7 @@ static struct object_type thread_type = { .ob_name = "thread", .ob_size = sizeof(struct thread), + .ob_header_offset = offsetof(struct thread, thr_base), }; kern_status_t thread_object_type_init(void)