diff options
Diffstat (limited to 'src/kernel/tasks.h')
-rw-r--r-- | src/kernel/tasks.h | 64 |
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 |