fix bug in the TSS initialization for a new task, which is a copy of the current task
This commit is contained in:
parent
bd703f6be4
commit
4fc507bc6b
1 changed files with 19 additions and 4 deletions
|
@ -58,6 +58,8 @@ int register_task(task_t* task) {
|
|||
|
||||
int arch_fork(task_t* task)
|
||||
{
|
||||
uint16_t cs = 0x08;
|
||||
uint16_t ds = 0x10;
|
||||
uint32_t id;
|
||||
task_t* curr_task = per_core(current_task);
|
||||
|
||||
|
@ -65,11 +67,24 @@ int arch_fork(task_t* task)
|
|||
return -EINVAL;
|
||||
id = task->id;
|
||||
|
||||
memcpy(task_state_segments+id, task_state_segments+curr_task->id, sizeof(tss_t));
|
||||
// copy kernel stack of the current task
|
||||
memcpy(kstacks[id], kstacks[curr_task->id], KERNEL_STACK_SIZE);
|
||||
|
||||
// reset TSS
|
||||
memset(task_state_segments+id, 0x00, sizeof(tss_t));
|
||||
|
||||
// set default values of all registers
|
||||
task_state_segments[id].cs = cs;
|
||||
task_state_segments[id].ss = ds;
|
||||
task_state_segments[id].ds = ds;
|
||||
task_state_segments[id].fs = ds;
|
||||
task_state_segments[id].gs = ds;
|
||||
task_state_segments[id].es = ds;
|
||||
task_state_segments[id].cr3 = (uint32_t) (virt_to_phys((size_t)task->pgd));
|
||||
task_state_segments[id].ss0 = ds;
|
||||
task_state_segments[id].esp0 = (uint32_t) kstacks[id] + KERNEL_STACK_SIZE - sizeof(size_t);
|
||||
|
||||
// save curret task context
|
||||
asm volatile("mov %%esp, %0" : "=r"(task_state_segments[id].esp));
|
||||
task_state_segments[id].esp -= (uint32_t) kstacks[curr_task->id];
|
||||
task_state_segments[id].esp += (uint32_t) kstacks[id];
|
||||
|
@ -90,9 +105,9 @@ int arch_fork(task_t* task)
|
|||
|
||||
// store current EFLAGS and set IF flag
|
||||
// => the parent task will enable the interrupt handling
|
||||
task_state_segments[id].eflags = read_eflags() | (1 << 9);
|
||||
asm volatile ("pushf; pop %%eax; or $2,%%ah" : "=a"(task_state_segments[id].eflags));
|
||||
// This will be the entry point for the new task.
|
||||
task_state_segments[id].eip = read_eip();
|
||||
asm volatile ("call read_eip" : "=a"(task_state_segments[id].eip));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -111,7 +126,7 @@ int create_default_frame(task_t* task, entry_point_t ep, void* arg)
|
|||
memset(task_state_segments+id, 0x00, sizeof(tss_t));
|
||||
memset(kstacks[id], 0xCD, KERNEL_STACK_SIZE);
|
||||
|
||||
/* set default values of all regsiters */
|
||||
/* set default values of all registers */
|
||||
task_state_segments[id].cs = cs;
|
||||
task_state_segments[id].ss = ds;
|
||||
task_state_segments[id].ds = ds;
|
||||
|
|
Loading…
Add table
Reference in a new issue