From f0475a3d517b4df8eb2b73f22eaec91a72bcc51f Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sun, 7 Dec 2014 19:59:34 +0100 Subject: Implement multitasking. --- kernel/include/idt.h | 5 ++--- kernel/include/region.h | 2 -- kernel/include/task.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 kernel/include/task.h (limited to 'kernel/include') diff --git a/kernel/include/idt.h b/kernel/include/idt.h index 9415c8e..8e84cea 100644 --- a/kernel/include/idt.h +++ b/kernel/include/idt.h @@ -60,13 +60,12 @@ #define EFLAGS_IF (0x1 << 9) -struct registers { +typedef struct registers { uint32_t ds; // Data segment selector uint32_t edi, esi, ebp, useless_esp, ebx, edx, ecx, eax; // Pushed by pusha. uint32_t int_no, err_code; // Interrupt number and error code (if applicable) uint32_t eip, cs, eflags, esp, ss; // Pushed by the processor automatically. -}; -typedef struct registers registers_t; +} registers_t; typedef void (*isr_handler_t)(registers_t*); diff --git a/kernel/include/region.h b/kernel/include/region.h index ac68047..b45a85d 100644 --- a/kernel/include/region.h +++ b/kernel/include/region.h @@ -34,8 +34,6 @@ region_info_t *find_region(void* addr); void region_free(void* addr); // some usefull PF handlers -// stack_pf_handler : allocates new frames and panics on access to first page of region (stack overflow) -void stack_pf_handler(pagedir_t *pd, struct region_info *r, void* addr); // default_allocator_pf_handler : just allocates new frames on page faults void default_allocator_pf_handler(pagedir_t *pd, struct region_info *r, void* addr); diff --git a/kernel/include/task.h b/kernel/include/task.h new file mode 100644 index 0000000..8ba50b0 --- /dev/null +++ b/kernel/include/task.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +#define T_STATE_RUNNING 1 +#define T_STATE_FINISHED 2 +#define T_STATE_WAITING 3 + +#define KPROC_STACK_SIZE 0x8000 // 8Kb + +typedef struct saved_context { + uint32_t *esp; + void (*eip)(); +} saved_context_t; + +typedef struct task { + saved_context_t ctx; + + uint32_t state; + void* result; + bool has_result; + + region_info_t *stack_region; + + void* more_data; + + struct task *next_in_queue; +} task_t; + +typedef void (*entry_t)(void*); + +void tasking_setup(entry_t cont, void* data); // never returns +task_t *new_task(entry_t entry); // task is PAUSED, and must be resume_with_result'ed +extern task_t *current_task; + + +void yield(); +void* wait_for_result(); +void resume_with_result(task_t *task, void* data, bool run_at_once); + +/* vim: set ts=4 sw=4 tw=0 noet :*/ -- cgit v1.2.3