summaryrefslogtreecommitdiff
path: root/src/kernel/tasks.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/tasks.h')
-rw-r--r--src/kernel/tasks.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/kernel/tasks.h b/src/kernel/tasks.h
new file mode 100644
index 0000000..604c463
--- /dev/null
+++ b/src/kernel/tasks.h
@@ -0,0 +1,64 @@
+#ifndef TASKS_H
+#define TASKS_H
+
+#include <stdint.h>
+
+#define TASK_STACK_SIZE 4096
+
+#if defined( __TINYC__ )
+#pragma pack(1)
+#endif
+
+typedef struct {
+ // pushed by us
+ uint32_t eax;
+ uint32_t ebx;
+ uint32_t ecx;
+ uint32_t edx;
+ uint32_t esi;
+ uint32_t edi;
+ uint32_t ebp;
+
+ // really needed?
+ //~ uint32_t gs;
+ //~ uint32_t fs;
+ //~ uint32_t es;
+ //~ uint32_t ds;
+
+ // ?
+ uint32_t error;
+
+ // pushed by the CPU
+ uint32_t eip;
+ uint32_t cs;
+ uint32_t eflags;
+ uint32_t esp;
+ uint32_t ss;
+} __attribute__( ( packed ) ) cpu_state_t;
+
+#if defined( __TINYC__ )
+#pragma pack()
+#endif
+
+typedef struct {
+ uint8_t stack[TASK_STACK_SIZE];
+ cpu_state_t *cpu_state;
+} task_t;
+
+typedef void (*task_func_t)( void );
+
+void task_init( task_t *task, uint16_t gdt_code_segment_selector, task_func_t *entrypoint );
+
+#define MAX_NOF_TASKS 256
+
+typedef struct {
+ int nof_tasks;
+ int current_task;
+ task_t *task[MAX_NOF_TASKS];
+} task_manager_t;
+
+void task_manager_init( task_manager_t *manager );
+void task_manager_add_task( task_manager_t *manager, task_t *task );
+cpu_state_t *task_manager_schedule_task( task_manager_t *manager, cpu_state_t *cpu_state );
+
+#endif // TASKS_H