BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 6217f0db2c8f2513994f4cc773aaa4171a049963 / task / task.c

// Related

Nucleus

Barry Kernel threads + threads share address space 6217f0d (3 years, 1 month ago)
diff --git a/task/task.c b/task/task.c
index 539026a..c1e744e 100644
--- a/task/task.c
+++ b/task/task.c
@@ -21,7 +21,7 @@ static void task_delete(Object *);
 /* Task object type */
 ObjectType taskType = {
 	.name = "TASK",
-	.size = sizeof(Task),
+	.size = KERNEL_STACK_SIZE, //sizeof(Task),
 	.new = task_new,
 	.delete = task_delete,
 };
@@ -47,8 +47,6 @@ task_delete(Object *obj)
 	Task *task = (void *) obj;
 	if (task->executable)
 		put(task->executable);
-	if (task->stack)
-		put(task->stack);
 	if (task->target)
 		put(task->target);
 	if (task->wait)
@@ -63,44 +61,11 @@ task_delete(Object *obj)
 		put(task->signals);
 }
 
-/* Move the stack */
-static void
-move_stack(uintptr_t top, size_t size)
-{
-	size_t offset;
-	uintptr_t oldStack, oldBase;
-	uintptr_t newStack, newBase;
-	top -= sizeof(uintptr_t);
-	asm volatile("mov %%esp, %0" : "=r" (oldStack));
-	asm volatile("mov %%ebp, %0" : "=r" (oldBase));
-	offset = top - (uintptr_t) stackTop;
-	newStack = oldStack + offset;
-	newBase = oldBase + offset;
-
-	memcpy((void *) newStack, (void *) oldStack, (size_t) stackTop - oldStack);
-
-	/* Update pointers on the stack */
-	uintptr_t i, tmp;
-	for (i = top; i > top - size; i -= sizeof(uintptr_t)) {
-		tmp = *(uintptr_t *) i;
-		if (tmp > oldStack && tmp < (uintptr_t) stackTop) {
-			tmp += offset;
-			*(uintptr_t *) i = tmp;
-		}
-	}
-
-	asm volatile("mov %0, %%esp" :: "r" (newStack));
-	asm volatile("mov %0, %%ebp" :: "r" (newBase));
-}
-
 /* Initialise tasking */
 void
 init_tasking(void)
 {
-	move_stack(0xF0800000, 0x2000);
-
 	current = new(&taskType);
-	asm volatile("mov %%cr3, %0" : "=r" (current->pageDir));
 	current->state = RUNNING;
 
 	/* File System namespace */
@@ -115,6 +80,7 @@ init_tasking(void)
 	cpu->scheduler->tasks = 1;
 	register_interrupt(0, timer_handler);
 	register_exception(128, syscall_handler);
+	set_kernel_stack((uintptr_t) current + KERNEL_STACK_SIZE);
 }
 
 /* Get the current task's PID */