Skip to content

Commit d0aa4fe

Browse files
committed
tasks now take data and a destructor fn
1 parent 78af708 commit d0aa4fe

File tree

6 files changed

+57
-24
lines changed

6 files changed

+57
-24
lines changed

TODO

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ TODO:
6767
[x] usan
6868
[ ] asan
6969
[x] watchdog for thread stack and kheap magic
70-
[ ] more comprehensive thread reg/unreg
70+
[x] more comprehensive thread reg/unreg
71+
[ ] kfree corruption
7172
[ ] thread the ehternet packets
72-
[ ] add some log groups for debugging
73+
[ ] add some log groups for debugging
74+
[ ] write a readme and collect main features and quirks

cpu/task.c

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,19 @@ void switch_stack_and_jump(uint32_t stack, uint32_t task);
2020
void switch_stack(uint32_t esp, uint32_t ebp);
2121
extern semaphore_t task_semaphore;
2222

23-
void task_wrapper(task_function_t f) {
23+
void task_wrapper(task_fn_t f) {
2424
(void)f;
2525
serial_debug("task %d fired!", current_task_idx);
26-
task_function_t fn = tasks[current_task_idx].task;
27-
fn();
26+
task_fn_t fn = tasks[current_task_idx].f;
27+
fn(tasks[current_task_idx].data);
2828

2929
asm volatile("cli");
3030

31+
task_destructor_fn_t df = tasks[current_task_idx].df;
32+
if (df) {
33+
df(tasks[current_task_idx].df_data);
34+
}
35+
3136
tasks[current_task_idx].status = TASK_DEAD;
3237
active_tasks--;
3338
serial_debug("task %d completed, now %d active tasks", current_task_idx,
@@ -36,7 +41,6 @@ void task_wrapper(task_function_t f) {
3641
asm volatile("sti");
3742
// asm volatile("int $0x20");
3843

39-
// should be never reached
4044
while (1) {
4145
asm volatile("hlt");
4246
}
@@ -84,10 +88,26 @@ bool check_stack_overflow(int task_id) {
8488
return (*(uint32_t *)stack_bottom != STACK_CANARY);
8589
}
8690

87-
void create_task(int task_id, char *name, task_function_t f, void *stack,
88-
uint32_t stack_size) {
91+
int find_next_task_slot() {
92+
for (int i = 1; i < MAX_TASK; i++) {
93+
if (tasks[i].status == TASK_INACTIVE || tasks[i].status == TASK_DEAD) {
94+
return i;
95+
}
96+
}
97+
return -1;
98+
}
99+
100+
void create_task(char *name, task_fn_t f, void *data, task_destructor_fn_t df,
101+
void *df_data, void *stack, uint32_t stack_size) {
102+
assert(f && stack);
89103
asm volatile("cli");
90104

105+
int task_id = find_next_task_slot();
106+
if (task_id == -1) {
107+
assert(0 && "no more slots for tasks");
108+
asm volatile("sti");
109+
return;
110+
}
91111
task_t task = {0};
92112
assert(strlen(name) <= 16);
93113
memcpy(task.name, name, strlen(name));
@@ -112,7 +132,10 @@ void create_task(int task_id, char *name, task_function_t f, void *stack,
112132
// push parameter for task_wrapper
113133
task.esp -= 4;
114134
*(uint32_t *)task.esp = (uint32_t)f;
115-
task.task = f;
135+
task.f = f;
136+
task.data = data;
137+
task.df = df;
138+
task.df_data = df_data;
116139
task.ebp = stack_top;
117140
task.stack_size = stack_size;
118141

@@ -150,14 +173,13 @@ void init_tasking() {
150173

151174
memcpy(tasks[0].name, "main", 5);
152175
tasks[0].status = TASK_RUNNING;
153-
tasks[0].task = NULL;
154176

155177
current_task_idx = 0;
156178
active_tasks = 1;
157179

158180
void *ss = kmalloc(1024);
159-
create_task(1, "task_stack_check", task_stack_check, ss, 1024);
181+
create_task("task_stack_check", task_stack_check, ss, 0, 0, 0, 1024);
160182

161183
void *s2 = kmalloc(5000);
162-
create_task(2, "kheap_watchdog", kheap_watchdog, s2, 5000);
184+
create_task("kheap_watchdog", kheap_watchdog, s2, 0, 0, 0, 5000);
163185
}

cpu/task.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,15 @@ typedef enum {
1111
TASK_RUNNING
1212
} task_status_t;
1313

14-
typedef void (*task_function_t)(void);
14+
typedef void (*task_fn_t)(void *);
15+
typedef void (*task_destructor_fn_t)(void *);
1516
typedef struct {
1617
char name[16];
1718
task_status_t status;
18-
task_function_t task; // i dont actually use this for anything
19+
task_fn_t f;
20+
void *data;
21+
task_destructor_fn_t df;
22+
void *df_data;
1923
uint32_t ebp, esp;
2024
registers_t ctx;
2125
uint32_t stack_size;
@@ -27,5 +31,5 @@ typedef struct {
2731
void schedule(registers_t *regs);
2832

2933
void init_tasking();
30-
void create_task(int task_id, char *name, task_function_t f, void *stack,
31-
uint32_t stack_size);
34+
void create_task(char *name, task_fn_t f, void *data, task_destructor_fn_t df,
35+
void *df_data, void *stack, uint32_t stack_size);

kernel/kernel.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,16 @@ semaphore_t task_semaphore = {0};
88

99
static volatile int sem = 0;
1010

11-
static void sched_test_fn() {
11+
static void sched_test_fn(void *data) {
12+
(void)data;
1213
// semaphore_signal(&selftest_sem);
13-
kernel_printf("sched_test_fn ");
1414
sem = 1;
15-
kernel_printf("this is now %d\n", sem);
15+
kernel_printf("- scheduler looks good\n");
16+
return;
17+
}
18+
19+
static void sched_test_dfn(void *df_data) {
20+
kfree(df_data);
1621
return;
1722
}
1823

@@ -31,17 +36,17 @@ void selftest() {
3136
assert(t1 != t2 && "ticks are the same");
3237
kernel_printf("- ticks are good...\n");
3338

34-
uint32_t ss = 1024;
39+
uint32_t ss = 1025;
3540
void *fnstack = kmalloc_a(ss);
36-
create_task(3, "sched_test", &sched_test_fn, fnstack, ss);
41+
create_task("sched_test", &sched_test_fn, fnstack, &sched_test_dfn, fnstack,
42+
0, ss);
3743
int i = 1000000;
3844
while (1 != sem) {
3945
i--;
4046
if (i < 0) {
4147
assert("scheduler timed out");
4248
}
4349
}
44-
kfree(fnstack);
4550
serial_debug("selftest finished!");
4651
}
4752

libc/heap.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,8 @@ void *kmalloc_ap(uint32_t size, uint32_t *phys) {
318318

319319
void *kmalloc(uint32_t size) { return kmalloc_int(size, 0, 0); }
320320

321-
void kheap_watchdog() {
321+
void kheap_watchdog(void *data) {
322+
(void)data;
322323
serial_debug("heap watchdog started");
323324

324325
while (1) {

net/rtl8139.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ void receive_packet() {
2121

2222
// skip, packet header and packet length, now t points to the packet data
2323
t = t + 2;
24-
// qemu_printf("Printing packet at addr 0x%x\n", (uint32_t)t);
2524

2625
// now, ethernet layer starts to handle the packet(be sure to make a copy of
2726
// the packet, insteading of using the buffer) and probabbly this should be

0 commit comments

Comments
 (0)