Nucleus
Barry Kernel threads + threads share address space 6217f0d (3 years, 1 month ago)
diff --git a/include/nucleus/cpu.h b/include/nucleus/cpu.h
index cb41a28..60753ef 100644
--- a/include/nucleus/cpu.h
+++ b/include/nucleus/cpu.h
@@ -14,6 +14,7 @@ struct Processor {
cpu_t id;
uint32_t inCriticalSection;
uint32_t critFlags;
+ struct InterruptFrame *frame;
Scheduler *scheduler;
struct IPIQueue *ipiq;
};
@@ -86,5 +87,6 @@ void send_ipiq(cpu_t targid, ipiq_func_t func, void *arg, enum IPIQFlag flags);
void set_fs_base(uintptr_t base);
void set_gs_base(uintptr_t base);
+void set_kernel_stack(uintptr_t top);
#endif
diff --git a/include/nucleus/memory.h b/include/nucleus/memory.h
index 057ff0b..481070c 100644
--- a/include/nucleus/memory.h
+++ b/include/nucleus/memory.h
@@ -66,6 +66,6 @@ void *map_page(Page *page);
int verify_access(const void *addr, size_t len, int prot);
-VMRegion *vm_create_stack(void);
+void switch_to_mm(VirtualMemory *vm);
#endif
diff --git a/include/nucleus/task.h b/include/nucleus/task.h
index f7825a8..8c33f55 100644
--- a/include/nucleus/task.h
+++ b/include/nucleus/task.h
@@ -31,21 +31,19 @@ enum State {
/* Structure for a Task */
struct Task {
Object obj;
- pid_t tid, tgid;
- uid_t uid, euid, suid;
- gid_t gid, egid, sgid;
- int status;
- uint32_t inSyscall;
-
Scheduler *scheduler;
enum Priority priority;
enum State state;
uintptr_t esi, edi, ebx;
uintptr_t esp, ebp, eip;
- page_dir_t pageDir;
+
+ pid_t tid, tgid;
+ uid_t uid, euid, suid;
+ gid_t gid, egid, sgid;
+ int status;
+ uint32_t inSyscall;
File *executable;
- VMRegion *stack;
Task *target;
ObjectList *wait;
@@ -68,6 +66,8 @@ struct Scheduler {
#define current cpu->scheduler->task
+#define KERNEL_STACK_SIZE (2 * PAGE_SIZE)
+
extern ObjectType taskType;
extern ObjectType schedulerType;
extern ObjectType signalsType;
@@ -95,10 +95,12 @@ exit_syscall_context(void)
}
void init_tasking(void);
-void enqueue_task(Task *task);
void block_task(enum State reason, ObjectList *list);
void unblock_task(Task *task);
Task *find_task(pid_t tid);
+void enqueue_task(Task *task);
void schedule(void);
+Task *create_kthread(void (*func)(void), enum Priority p);
+_Noreturn void terminate(void);
#endif