1 #include <lwk/kernel.h>
2 #include <lwk/aspace.h>
4 #include <arch/ptrace.h>
7 arch_task_create(struct task_struct *task,
8 const start_state_t *start_state)
14 regs = ((struct pt_regs *)((kaddr_t)task + TASK_SIZE)) - 1;
15 kstack_top = (kaddr_t)(regs + 1);
16 initial_ksp = (kaddr_t)regs;
18 task->arch.thread.rsp0 = kstack_top;
19 task->arch.thread.rsp = initial_ksp;
20 task->arch.thread.userrsp = start_state->stack_ptr;
22 /* Mark this as a new-task... arch_context_switch() checks this flag */
23 task->arch.flags = TF_NEW_TASK;
25 /* Task's address space is from [0, task->addr_limit) */
26 task->arch.addr_limit = PAGE_OFFSET;
28 /* Initialize FPU state */
29 task->arch.thread.i387.fxsave.cwd = 0x37f;
30 task->arch.thread.i387.fxsave.mxcsr = 0x1f80;
32 /* CPU control unit uses these fields to start the user task running */
33 if (start_state->aspace_id == KERNEL_ASPACE_ID) {
34 regs->ss = __KERNEL_DS;
35 regs->rsp = (vaddr_t)task + TASK_SIZE;
36 regs->eflags = (1 << 9); /* enable interrupts */
37 regs->cs = __KERNEL_CS;
40 regs->rsp = start_state->stack_ptr;
41 regs->eflags = (1 << 9); /* enable interrupts */
44 regs->rip = start_state->entry_point;