sched: fix a dumb stack bug inside the scheduler
This commit is contained in:
parent
5168cfa4e1
commit
6e77fbc323
3 changed files with 13 additions and 9 deletions
|
@ -34,6 +34,8 @@ void sched_init() {
|
||||||
memcpy(proc_list->name, "System\0", 7);
|
memcpy(proc_list->name, "System\0", 7);
|
||||||
proc_list->pid = -1;
|
proc_list->pid = -1;
|
||||||
proc_list->type = SCHED_EMPTY;
|
proc_list->type = SCHED_EMPTY;
|
||||||
|
proc_list->flags = SCHED_KERNEL_PROCESS;
|
||||||
|
proc_list->pm = vmm_kernel_pm;
|
||||||
|
|
||||||
curr_proc = proc_list;
|
curr_proc = proc_list;
|
||||||
|
|
||||||
|
@ -71,13 +73,13 @@ sched_process *sched_create(char *name, uint64_t entry_point, pagemap_t *pm,
|
||||||
if (flags == SCHED_KERNEL_PROCESS) {
|
if (flags == SCHED_KERNEL_PROCESS) {
|
||||||
proc->stack_base = stack_phys;
|
proc->stack_base = stack_phys;
|
||||||
proc->stack_base_physical = stack_phys;
|
proc->stack_base_physical = stack_phys;
|
||||||
proc->stack_end = proc_list->stack_base + PMM_PAGE_SIZE;
|
proc->stack_end = proc->stack_base + PMM_PAGE_SIZE;
|
||||||
} else if (flags == SCHED_USER_PROCESS) {
|
} else if (flags == SCHED_USER_PROCESS) {
|
||||||
vmm_map_user(proc->pm, (uint64_t)stack_virt, (uint64_t)stack_phys,
|
vmm_map_user(proc->pm, (uint64_t)stack_virt, (uint64_t)stack_phys,
|
||||||
VMM_PRESENT | VMM_WRITABLE | VMM_USER);
|
VMM_PRESENT | VMM_WRITABLE | VMM_USER);
|
||||||
proc->stack_base = stack_virt;
|
proc->stack_base = stack_virt;
|
||||||
proc->stack_base_physical = stack_phys;
|
proc->stack_base_physical = stack_phys;
|
||||||
proc->stack_end = proc_list->stack_base + PMM_PAGE_SIZE;
|
proc->stack_end = proc->stack_base + PMM_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
proc->regs.rip = (uint64_t)entry_point;
|
proc->regs.rip = (uint64_t)entry_point;
|
||||||
|
|
||||||
|
@ -85,8 +87,8 @@ sched_process *sched_create(char *name, uint64_t entry_point, pagemap_t *pm,
|
||||||
proc->regs.cs = 0x28; // Run in kernel mode
|
proc->regs.cs = 0x28; // Run in kernel mode
|
||||||
proc->regs.ss = 0x30;
|
proc->regs.ss = 0x30;
|
||||||
} else if (flags == SCHED_USER_PROCESS) {
|
} else if (flags == SCHED_USER_PROCESS) {
|
||||||
proc->regs.cs = 0x43; // Run in user mode
|
proc->regs.cs = 0x38 | 3; // Run in user mode
|
||||||
proc->regs.ss = 0x3B;
|
proc->regs.ss = 0x40 | 3;
|
||||||
}
|
}
|
||||||
proc->regs.rflags = 0x202; // Enable interrupts
|
proc->regs.rflags = 0x202; // Enable interrupts
|
||||||
proc->regs.rsp = (uint64_t)proc->stack_end;
|
proc->regs.rsp = (uint64_t)proc->stack_end;
|
||||||
|
@ -153,9 +155,9 @@ void schedule(registers_t *regs) {
|
||||||
if (curr_proc == NULL)
|
if (curr_proc == NULL)
|
||||||
curr_proc = proc_list;
|
curr_proc = proc_list;
|
||||||
|
|
||||||
log("sched - I choosed process %d\n", curr_proc->pid);
|
//log("sched - I choosed process %d\n", curr_proc->pid);
|
||||||
|
|
||||||
// log("sched - I choosed process %d\n", curr_proc->pid);
|
//log("sched - I choosed process %d (pm: %s, rip: %p)\n", curr_proc->pid, curr_proc->pm == vmm_kernel_pm ? "kernel" : "user", curr_proc->regs.rip);
|
||||||
memcpy(regs, &curr_proc->regs, sizeof(registers_t));
|
memcpy(regs, &curr_proc->regs, sizeof(registers_t));
|
||||||
|
|
||||||
// Finally, load our pagemap
|
// Finally, load our pagemap
|
||||||
|
|
|
@ -16,8 +16,8 @@ gdt_table def_table = {{
|
||||||
0x00af9b000000ffff, // 0x28 64 bit code cs
|
0x00af9b000000ffff, // 0x28 64 bit code cs
|
||||||
0x00af93000000ffff, // 0x30 64 bit data ss
|
0x00af93000000ffff, // 0x30 64 bit data ss
|
||||||
|
|
||||||
0x00aff3000000ffff, // 0x38 data ss
|
0x00affb000000ffff, // 0x38 user mode code cs
|
||||||
0x00affb000000ffff, // 0x40 user mode code cs
|
0x00aff3000000ffff, // 0x40 user mode data ss
|
||||||
},
|
},
|
||||||
{}};
|
{}};
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@ tssr tss_list[256]; // One tssr per CPU
|
||||||
void gdt_init(char *kstack) {
|
void gdt_init(char *kstack) {
|
||||||
|
|
||||||
// TODO: adapt for multiprocessor kernel
|
// TODO: adapt for multiprocessor kernel
|
||||||
|
memset(&tss_list[0], 0, sizeof(tssr));
|
||||||
tss_list[0].rsp[0] = (uint64_t)kstack;
|
tss_list[0].rsp[0] = (uint64_t)kstack;
|
||||||
|
tss_list[0].iopb = sizeof(tssr);
|
||||||
uintptr_t tss = (uintptr_t)&tss_list[0];
|
uintptr_t tss = (uintptr_t)&tss_list[0];
|
||||||
|
|
||||||
def_table.tss_entry.length = sizeof(tss_entry);
|
def_table.tss_entry.length = sizeof(tss_entry);
|
||||||
|
|
|
@ -18,7 +18,7 @@ void syscall_handle(registers_t *regs) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curr_proc == NULL || curr_proc->regs.cs != 0x43) {
|
if (curr_proc == NULL || curr_proc->regs.cs != 0x3B) {
|
||||||
log("syscall - syscall_handle was called by the kernel. is this wanted?\n");
|
log("syscall - syscall_handle was called by the kernel. is this wanted?\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue