Compare commits
No commits in common. "70739744ac016c4b5b28ca3440fc113362ab72c0" and "a9ed5947a81d2e1396d3e7210e2b77bea66706b6" have entirely different histories.
70739744ac
...
a9ed5947a8
@ -36,7 +36,6 @@ i8 create_kernel_task(void);
|
|||||||
void remove_task(struct task *task);
|
void remove_task(struct task *task);
|
||||||
struct task *copy_task(const struct task *task);
|
struct task *copy_task(const struct task *task);
|
||||||
void kfork(struct task *daddy);
|
void kfork(struct task *daddy);
|
||||||
void zombify_task(struct task *task);
|
|
||||||
|
|
||||||
// utils
|
// utils
|
||||||
void exec_fn(void (*fn)(void));
|
void exec_fn(void (*fn)(void));
|
||||||
|
@ -20,9 +20,11 @@ __attribute__((noreturn)) void kpanic(const char *format, ...)
|
|||||||
kvprintf(format, &va);
|
kvprintf(format, &va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
u32 faulting_address;
|
if (strcmp(format, faults[14]) == 0) {
|
||||||
__asm__ __volatile__("mov %%cr2, %0" : "=r"(faulting_address));
|
u32 faulting_address;
|
||||||
kprintf("fault at address: %p\n", faulting_address);
|
__asm__ __volatile__("mov %%cr2, %0" : "=r"(faulting_address));
|
||||||
|
kprintf("fault at address: %p\n", faulting_address);
|
||||||
|
}
|
||||||
/* for (int i = 16; i < 32; i++) */
|
/* for (int i = 16; i < 32; i++) */
|
||||||
/* kprintf("%p\n", page_table1[i]); */
|
/* kprintf("%p\n", page_table1[i]); */
|
||||||
/* show_valloc_mem(); */
|
/* show_valloc_mem(); */
|
||||||
|
@ -12,8 +12,8 @@ struct task *current_task;
|
|||||||
void scheduler(void)
|
void scheduler(void)
|
||||||
{
|
{
|
||||||
// ZOMBIE, THREAD, RUN, WAIT, SLEEP, STOPPED, FORKED
|
// ZOMBIE, THREAD, RUN, WAIT, SLEEP, STOPPED, FORKED
|
||||||
void (*func[])(struct task *) = {zombify_task, NULL, NULL, NULL,
|
void (*func[])(struct task *) = {remove_task, NULL, NULL, NULL,
|
||||||
NULL, remove_task, kfork};
|
NULL, remove_task, kfork};
|
||||||
|
|
||||||
if (!current_task) // || current_task->next == current_task)
|
if (!current_task) // || current_task->next == current_task)
|
||||||
return;
|
return;
|
||||||
|
@ -63,34 +63,23 @@ void exec_fn(void (*fn)(void))
|
|||||||
new_task->eip = (u32 *)fn;
|
new_task->eip = (u32 *)fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
void zombify_task(struct task *task)
|
|
||||||
{
|
|
||||||
cli(); // Technically useless
|
|
||||||
free_pages(task->heap, 4096);
|
|
||||||
free_pages(task->esp0, STACK_SIZE);
|
|
||||||
task->esp0 = NULL;
|
|
||||||
task->heap = NULL;
|
|
||||||
toris();
|
|
||||||
}
|
|
||||||
|
|
||||||
void remove_task(struct task *task)
|
void remove_task(struct task *task)
|
||||||
{
|
{
|
||||||
cli();
|
|
||||||
struct task *left = task->prev;
|
struct task *left = task->prev;
|
||||||
struct task *right = task->next;
|
struct task *right = task->next;
|
||||||
|
if (task->child)
|
||||||
if (task->child) {
|
|
||||||
remove_task(task->child);
|
remove_task(task->child);
|
||||||
task->child = NULL;
|
|
||||||
}
|
|
||||||
if (task->heap)
|
if (task->heap)
|
||||||
free_pages(task->heap, 4096);
|
free_pages(task->heap, 4096);
|
||||||
if (task->esp0)
|
if (task->esp0)
|
||||||
free_pages(task->esp0, STACK_SIZE);
|
free_pages(task->esp0, STACK_SIZE);
|
||||||
left->next = right;
|
task->heap = NULL;
|
||||||
right->prev = left;
|
task->esp0 = NULL;
|
||||||
vfree(task);
|
if (task->status != ZOMBIE) {
|
||||||
toris();
|
left->next = right;
|
||||||
|
right->prev = left;
|
||||||
|
vfree(task);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct task *copy_task(const struct task *task)
|
struct task *copy_task(const struct task *task)
|
||||||
@ -115,5 +104,5 @@ void exit_task(void)
|
|||||||
current_task->status = STOPPED;
|
current_task->status = STOPPED;
|
||||||
}
|
}
|
||||||
toris();
|
toris();
|
||||||
scheduler();
|
asm volatile("jmp scheduler");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user