Feat: kernel thread done

This commit is contained in:
2025-04-27 11:04:28 +08:00
parent 02b2a87fed
commit 981cae803b
14 changed files with 303 additions and 122 deletions

View File

@@ -15,6 +15,9 @@ typedef struct interrupt {
int is_start;
} interrupt_t;
void enable_interrupt(void);
void disable_interrupt(void);
void add_interrupt_task(uint64_t priority,
interrupt_callback_func_t func,
uint64_t param);

View File

@@ -21,9 +21,14 @@ uint64_t queue_front(const queue_t *queue);
void queue_push_back(queue_t *queue, uint64_t val);
void queue_push_front(queue_t *queue, uint64_t val);
uint64_t queue_pop_back(queue_t *queue);
uint64_t queue_pop_front(queue_t *queue);
#define QUEUE_BACK(type, queue) ((type *)queue_back(queue))
#define QUEUE_FRONT(type, queue) ((type *)queue_front(queue))
#define QUEUE_PUSH_BACK(queue, val) \
queue_push_back(queue, (uint64_t)val)
#define QUEUE_PUSH_FRONT(queue, val) \
queue_push_front(queue, (uint64_t)val)
#define QUEUE_PUSH_BACK(queue, val) queue_push_back(queue, (uint64_t)val)
#define QUEUE_PUSH_FRONT(queue, val) queue_push_front(queue, (uint64_t)val)
#define QUEUE_POP_BACK(type, queue) ((type *)queue_pop_back(queue))
#define QUEUE_POP_FRONT(type, queue) ((type *)queue_pop_front(queue))

53
kernel/include/thread.h Normal file
View File

@@ -0,0 +1,53 @@
#pragma once
#include <stddef.h>
#include <queue.h>
typedef int32_t (*thread_func_t)(uint64_t);
typedef enum: uint32_t {
THREAD_STATUS_RUNABLE = 0,
THREAD_STATUS_WAIT = 1,
THREAD_STATUS_EXIT = 2,
THREAD_STATUS_ZOMBIE = 3,
} thread_status_t;
typedef struct {
uint64_t x19, x20;
uint64_t x21, x22;
uint64_t x23, x24;
uint64_t x25, x26;
uint64_t x27, x28;
uint64_t fp, lr;
uint64_t sp;
uint64_t sp_el0;
uint64_t elr_el1;
} cpu_state_t;
typedef struct {
thread_func_t func;
uint64_t param;
thread_status_t status;
int32_t retcode;
void *stack_pointer;
size_t stack_size;
cpu_state_t regs;
} thread_t;
// thread.S
void context_switch(void *from, void *to, thread_t *th);
// thread.c
void thread_init(void);
void run_thread(thread_func_t func, uint64_t param);
void schedule(void);
#define yield schedule
thread_t *get_current(void);
extern queue_t *global_run_queue;
extern queue_t *global_wait_queue;
extern queue_t *global_gc_queue;

View File

@@ -21,6 +21,7 @@ typedef struct timer {
} timer_t;
void add_timer_task(task_t task);
void sleep(uint64_t ms);
void timer_irq_handler(void);