aboutsummaryrefslogtreecommitdiff
path: root/kernel/include
diff options
context:
space:
mode:
authorAlex Auvolat <alex.auvolat@ens.fr>2014-12-07 19:59:34 +0100
committerAlex Auvolat <alex.auvolat@ens.fr>2014-12-07 19:59:34 +0100
commitf0475a3d517b4df8eb2b73f22eaec91a72bcc51f (patch)
tree084e6cd1db812cafdd67ba650796eda3091c2ea7 /kernel/include
parentd7aaba8c85cc71f3184cddcf20b740c5157c864d (diff)
downloadmacroscope-f0475a3d517b4df8eb2b73f22eaec91a72bcc51f.tar.gz
macroscope-f0475a3d517b4df8eb2b73f22eaec91a72bcc51f.zip
Implement multitasking.
Diffstat (limited to 'kernel/include')
-rw-r--r--kernel/include/idt.h5
-rw-r--r--kernel/include/region.h2
-rw-r--r--kernel/include/task.h42
3 files changed, 44 insertions, 5 deletions
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 <sys.h>
+#include <region.h>
+
+#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 :*/