- task_t* create_task( page_directory_t* directory, void* entry, uint8_t privilege)
- {
- cli();
- ///
- #ifdef _DIAGNOSIS_
- settextcolor(2,0);
- printformat("cr_task: ");
- settextcolor(15,0);
- #endif
- ///
- task_t* new_task = (task_t*)malloc(sizeof(task_t),0);
- new_task->id = next_pid++;
- new_task->page_directory = directory;
- new_task->heap_top = USER_HEAP_START;
- ///
- #ifdef _DIAGNOSIS_
- settextcolor(2,0);
- printformat("cr_task_ks: ");
- settextcolor(15,0);
- #endif
- ///
- new_task->kernel_stack = (uint32_t) malloc(KERNEL_STACK_SIZE,PAGESIZE)+KERNEL_STACK_SIZE;
- new_task->next = 0;
- task_t* tmp_task = (task_t*)ready_queue;
- while (tmp_task->next)
- {
- tmp_task = tmp_task->next;
- }
- tmp_task->next = new_task;
- uint32_t* kernel_stack = (uint32_t*) new_task->kernel_stack;
- uint32_t code_segment=0x08, data_segment=0x10;
- ///TEST///
- *(--kernel_stack) = 0x0; // return address dummy
- ///TEST///
- if(privilege == 3)
- {
- // general information: Intel 3A Chapter 5.12
- *(--kernel_stack) = new_task->ss = 0x23; // ss
- *(--kernel_stack) = new_task->kernel_stack; // esp
- code_segment = 0x1B; // 0x18|0x3=0x1B
- }
- *(--kernel_stack) = 0x0202; // eflags = interrupts activated and iopl = 0
- *(--kernel_stack) = code_segment; // cs
- *(--kernel_stack) = (uint32_t)entry; // eip
- *(--kernel_stack) = 0; // error code
- *(--kernel_stack) = 0; // interrupt nummer
- // general purpose registers w/o esp
- *(--kernel_stack) = 0;
- *(--kernel_stack) = 0;
- *(--kernel_stack) = 0;
- *(--kernel_stack) = 0;
- *(--kernel_stack) = 0;
- *(--kernel_stack) = 0;
- *(--kernel_stack) = 0;
- if(privilege == 3) data_segment = 0x23; // 0x20|0x3=0x23
- *(--kernel_stack) = data_segment;
- *(--kernel_stack) = data_segment;
- *(--kernel_stack) = data_segment;
- *(--kernel_stack) = data_segment;
- //setup TSS
- tss.ss0 = 0x10;
- tss.esp0 = new_task->kernel_stack;
- tss.ss = data_segment;
- //setup task_t
- new_task->ebp = 0xd00fc0de; // test value
- new_task->esp = (uint32_t)kernel_stack;
- new_task->eip = (uint32_t)irq_tail;
- new_task->ss = data_segment;
- sti();
- return new_task;
- }
