[TEMP FIX] This is a temporary attempt to fix forking.
This commit is contained in:
parent
04817c0423
commit
f4f780ed90
2
Makefile
2
Makefile
@ -30,7 +30,7 @@ install: toaruos-initrd toaruos-kernel
|
|||||||
@${ECHO} "\r\033[34;1m -- Kernel and ramdisk installed.\033[0m"
|
@${ECHO} "\r\033[34;1m -- Kernel and ramdisk installed.\033[0m"
|
||||||
|
|
||||||
run: toaruos-kernel toaruos-initrd
|
run: toaruos-kernel toaruos-initrd
|
||||||
${EMU} -kernel toaruos-kernel -initrd toaruos-initrd -append vid=qemu -serial stdio -vga std
|
${EMU} -kernel toaruos-kernel -initrd toaruos-initrd -append vid=qemu -serial stdio -vga std -s
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# Documentation #
|
# Documentation #
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* vim:noexpandtab
|
* vim:noexpandtab
|
||||||
*/
|
*/
|
||||||
#include <system.h>
|
#include <system.h>
|
||||||
#define KERNEL_STACK_SIZE 0x1000
|
#define KERNEL_STACK_SIZE 0x2400
|
||||||
|
|
||||||
__volatile__ task_t * current_task = NULL;
|
__volatile__ task_t * current_task = NULL;
|
||||||
__volatile__ task_t * ready_queue;
|
__volatile__ task_t * ready_queue;
|
||||||
@ -79,8 +79,10 @@ copy_stack(
|
|||||||
uintptr_t old_base_pointer;
|
uintptr_t old_base_pointer;
|
||||||
__asm__ __volatile__ ("mov %%ebp, %0" : "=r" (old_base_pointer));
|
__asm__ __volatile__ ("mov %%ebp, %0" : "=r" (old_base_pointer));
|
||||||
uintptr_t offset = (uintptr_t)new_stack_start - initial;
|
uintptr_t offset = (uintptr_t)new_stack_start - initial;
|
||||||
|
kprintf("Offset is %x\n", offset);
|
||||||
uintptr_t new_stack_pointer = old_stack_pointer + offset;
|
uintptr_t new_stack_pointer = old_stack_pointer + offset;
|
||||||
uintptr_t new_base_pointer = old_base_pointer + offset;
|
uintptr_t new_base_pointer = old_base_pointer + offset;
|
||||||
|
kprintf("New base pointer is %x %x\n");
|
||||||
memcpy((void *)new_stack_pointer, (void *)old_stack_pointer, initial - old_stack_pointer);
|
memcpy((void *)new_stack_pointer, (void *)old_stack_pointer, initial - old_stack_pointer);
|
||||||
for (i = (uintptr_t)new_stack_start; i > (uintptr_t)new_stack_start - size; i -= 4) {
|
for (i = (uintptr_t)new_stack_start; i > (uintptr_t)new_stack_start - size; i -= 4) {
|
||||||
uintptr_t temp = *(uintptr_t*)i;
|
uintptr_t temp = *(uintptr_t*)i;
|
||||||
@ -92,7 +94,7 @@ copy_stack(
|
|||||||
}
|
}
|
||||||
__asm__ __volatile__ ("mov %0, %%esp" : : "r" (new_stack_pointer));
|
__asm__ __volatile__ ("mov %0, %%esp" : : "r" (new_stack_pointer));
|
||||||
__asm__ __volatile__ ("mov %0, %%ebp" : : "r" (new_base_pointer));
|
__asm__ __volatile__ ("mov %0, %%ebp" : : "r" (new_base_pointer));
|
||||||
return new_stack_pointer + (initial_esp - old_stack_pointer);
|
return new_stack_pointer - size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -136,11 +138,19 @@ fork() {
|
|||||||
uintptr_t ebp;
|
uintptr_t ebp;
|
||||||
__asm__ __volatile__ ("mov %%esp, %0" : "=r" (esp));
|
__asm__ __volatile__ ("mov %%esp, %0" : "=r" (esp));
|
||||||
__asm__ __volatile__ ("mov %%ebp, %0" : "=r" (ebp));
|
__asm__ __volatile__ ("mov %%ebp, %0" : "=r" (ebp));
|
||||||
uint32_t old_stack_offset = current_task->stack + KERNEL_STACK_SIZE - esp;
|
kprintf("%x %x %x\n", esp, current_task->stack, (current_task->stack + KERNEL_STACK_SIZE));
|
||||||
new_task->esp = (new_task->stack + KERNEL_STACK_SIZE) - old_stack_offset;
|
signed int old_stack_offset;
|
||||||
memcpy((void *)(new_task->esp),(void*)esp,old_stack_offset);
|
if (current_task->stack > new_task->stack) {
|
||||||
|
old_stack_offset = -(current_task->stack - new_task->stack);
|
||||||
|
} else {
|
||||||
|
old_stack_offset = new_task->stack - current_task->stack;
|
||||||
|
}
|
||||||
|
new_task->esp = esp + old_stack_offset;
|
||||||
|
kprintf("%x %x %x\n", new_task->esp, new_task->stack, new_task->stack + KERNEL_STACK_SIZE);
|
||||||
|
memcpy((void *)(new_task->esp),(void*)esp,current_task->stack + KERNEL_STACK_SIZE - esp);
|
||||||
//new_task->esp = esp;
|
//new_task->esp = esp;
|
||||||
new_task->ebp = ebp;
|
kprintf("Herp.\n");
|
||||||
|
new_task->ebp = ebp + old_stack_offset;
|
||||||
new_task->eip = eip;
|
new_task->eip = eip;
|
||||||
__asm__ __volatile__ ("sti");
|
__asm__ __volatile__ ("sti");
|
||||||
return new_task->id;
|
return new_task->id;
|
||||||
|
Loading…
Reference in New Issue
Block a user