heading to laptop
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
#include <stddef.h>
|
||||
|
||||
#include <drivers/pty/pty.h>
|
||||
#include "common.h"
|
||||
#include "lib/memory.h"
|
||||
#include "lib/ringbuf.h"
|
||||
#include "memory/mm.h"
|
||||
@@ -16,11 +15,10 @@
|
||||
#include <lib/string.h>
|
||||
|
||||
typedef struct registers {
|
||||
uint32_t gs, fs, es, ds; // Pushed manually
|
||||
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; // Pushed by pusha
|
||||
uint32_t int_no, err_code; // Pushed manually
|
||||
uint32_t eip, cs, eflags, useresp, ss; // Pushed automatically by CPU
|
||||
} registers_t;
|
||||
uint32_t ds; // push %ds
|
||||
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; // pushal
|
||||
uint32_t eip, cs, eflags, useresp, ss; // pushed by cpu
|
||||
} __attribute__((packed)) registers_t;
|
||||
|
||||
static int32_t sys_exit(int status) {
|
||||
process_t* task = current_task();
|
||||
@@ -126,7 +124,7 @@ static int32_t sys_pty(int* slave_fd) {
|
||||
|
||||
static int32_t sys_fork(registers_t* parent_regs) {
|
||||
process_t* parent = current_task();
|
||||
|
||||
|
||||
process_t* child = kalloc(sizeof(process_t));
|
||||
if (!child) {
|
||||
return -1;
|
||||
@@ -142,36 +140,37 @@ static int32_t sys_fork(registers_t* parent_regs) {
|
||||
child->fd_table[i] = parent->fd_table[i];
|
||||
}
|
||||
|
||||
disable_interrupts();
|
||||
|
||||
uint32_t kstack_size = 4096;
|
||||
void* kstack_alloc = kalloc(kstack_size);
|
||||
child->kstack_top = (uint32_t)kstack_alloc + kstack_size;
|
||||
|
||||
child->cr3 = (uint32_t)clone_task_pd();
|
||||
|
||||
registers_t* child_regs = (registers_t*)(child->kstack_top - sizeof(registers_t));
|
||||
memcpy(child_regs, parent_regs, sizeof(registers_t));
|
||||
memcpy(parent_regs, child_regs, sizeof(registers_t));
|
||||
child_regs->eax = 0;
|
||||
child->esp = (uint32_t)child_regs;
|
||||
|
||||
enable_interrupts();
|
||||
kprintf("child registers for PID %d\n", child->pid);
|
||||
kprintf("\tEIP: 0x%x\n", child_regs->eip);
|
||||
|
||||
// uint32_t cr3 = (uint32_t)clone_task_pd();
|
||||
child->cr3 = parent->cr3;
|
||||
|
||||
add_task(child);
|
||||
return child->pid;
|
||||
}
|
||||
|
||||
int32_t syscall(registers_t* regs) {
|
||||
void syscall(registers_t* regs) {
|
||||
int32_t ret;
|
||||
switch(regs->eax) {
|
||||
case 1: return sys_exit(regs->ebx);
|
||||
case 3: return sys_read(regs->ebx, (void*)regs->ecx, regs->edx);
|
||||
case 4: return sys_write(regs->ebx, (const void*)regs->ecx, regs->edx);
|
||||
case 5: return sys_open((const char*)regs->ebx, regs->ecx);
|
||||
case 6: return sys_close(regs->ebx);
|
||||
case 12: return sys_brk(regs->ebx);
|
||||
case 20: return sys_pty((int*)regs->ebx);
|
||||
case 21: return sys_fork(regs);
|
||||
default:
|
||||
return -1;
|
||||
case 1: ret = sys_exit(regs->ebx); break;
|
||||
case 3: ret = sys_read(regs->ebx, (void*)regs->ecx, regs->edx); break;
|
||||
case 4: ret = sys_write(regs->ebx, (const void*)regs->ecx, regs->edx); break;
|
||||
case 5: ret = sys_open((const char*)regs->ebx, regs->ecx); break;
|
||||
case 6: ret = sys_close(regs->ebx); break;
|
||||
case 12: ret = sys_brk(regs->ebx); break;
|
||||
case 20: ret = sys_pty((int*)regs->ebx); break;
|
||||
case 21: ret = sys_fork(regs); break;
|
||||
default: ret = -1;
|
||||
}
|
||||
regs->eax = ret;
|
||||
}
|
||||
Reference in New Issue
Block a user