MOS Source Code
Loading...
Searching...
No Matches
kthread.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
4
10#include <mos/tasks/thread.hpp>
11#include <mos/type_utils.hpp>
12#include <mos_stdlib.hpp>
13
15
16struct kthread_arg_t : mos::NamedType<"KThread.Arg">
17{
19 void *arg;
20};
21
22static void kthread_entry(void *arg)
23{
24 kthread_arg_t *kthread_arg = static_cast<kthread_arg_t *>(arg);
25 kthread_arg->entry(kthread_arg->arg);
26 delete kthread_arg;
27 thread_exit(std::move(current_thread));
28}
29
30void kthread_init(void)
31{
32 kthreadd = Process::New(NULL, "kthreadd");
33 MOS_ASSERT_X(kthreadd->pid == 2, "kthreadd should have pid 2");
34 ProcessTable.insert(kthreadd->pid, kthreadd);
35}
36
37Thread *kthread_create(thread_entry_t entry, void *arg, const char *name)
38{
39 Thread *thread = kthread_create_no_sched(entry, arg, name);
41 return thread;
42}
43
44Thread *kthread_create_no_sched(thread_entry_t entry, void *arg, const char *name)
45{
46 MOS_ASSERT_X(kthreadd, "kthreadd not initialized");
47 pr_dinfo2(thread, "creating kernel thread '%s'", name);
49 kthread_arg->entry = entry;
50 kthread_arg->arg = arg;
51 auto thread = thread_new(kthreadd, THREAD_MODE_KERNEL, name, 0, NULL);
52 if (thread.isErr())
53 {
54 delete kthread_arg;
55 pr_fatal("failed to create kernel thread");
56 return nullptr;
57 }
58
59 platform_context_setup_child_thread(thread.get(), kthread_entry, kthread_arg);
60 thread_complete_init(thread.get());
61 return thread.get();
62}
#define MOS_ASSERT_X(cond, msg,...)
Definition assert.hpp:15
@ THREAD_MODE_KERNEL
void define_syscall thread_exit(void)
Definition ksyscall.cpp:175
static Process * kthreadd
Definition kthread.cpp:14
Thread * kthread_create_no_sched(thread_entry_t entry, void *arg, const char *name)
Create a kernel thread, but do not add it to the scheduler.
Definition kthread.cpp:44
Thread * kthread_create(thread_entry_t entry, void *arg, const char *name)
Create a kernel-mode thread.
Definition kthread.cpp:37
static void kthread_entry(void *arg)
Definition kthread.cpp:22
void kthread_init(void)
Definition kthread.cpp:30
T * create(Args &&...args)
Definition allocator.hpp:10
#define NULL
Definition pb_syshdr.h:46
#define current_thread
Definition platform.hpp:32
#define pr_fatal(fmt,...)
Definition printk.hpp:40
#define pr_dinfo2(feat, fmt,...)
Definition printk.hpp:27
mos::HashMap< pid_t, Process * > ProcessTable
Definition process.cpp:36
void platform_context_setup_child_thread(Thread *thread, thread_entry_t entry, void *arg)
void scheduler_add_thread(Thread *thread)
Add a thread to the scheduler, so that it can be scheduled.
Definition schedule.cpp:78
void(* thread_entry_t)(void *arg)
Definition signal_types.h:8
const char * name
Definition slab.cpp:35
static Process * New(Process *parent, mos::string_view name)
thread_entry_t entry
Definition kthread.cpp:18
PtrResult< Thread > thread_new(Process *owner, thread_mode mode, mos::string_view name, size_t stack_size, void *stack)
Definition thread.cpp:77
Thread * thread_complete_init(Thread *thread)
Definition thread.cpp:165