From aa8a8811818331cf511681327e3ba95e456f0d33 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Sat, 2 May 2020 15:44:11 +0200 Subject: Added many syscalls to get better POSIX compliance --- src/kernel/syscall/actions/sys_exit.c | 8 ++++++++ src/kernel/syscall/actions/sys_fork.c | 19 +++++++++++++++++++ src/kernel/syscall/actions/sys_get_pid.c | 7 +++++++ src/kernel/syscall/actions/sys_pointers.c | 20 -------------------- src/kernel/syscall/actions/sys_putch.c | 9 --------- src/kernel/syscall/actions/sys_read.c | 22 ++++++++++++++++++++++ src/kernel/syscall/actions/sys_scancode.c | 11 ----------- src/kernel/syscall/actions/sys_write.c | 22 ++++++++++++++++++++++ 8 files changed, 78 insertions(+), 40 deletions(-) create mode 100644 src/kernel/syscall/actions/sys_exit.c create mode 100644 src/kernel/syscall/actions/sys_fork.c create mode 100644 src/kernel/syscall/actions/sys_get_pid.c delete mode 100644 src/kernel/syscall/actions/sys_pointers.c delete mode 100644 src/kernel/syscall/actions/sys_putch.c create mode 100644 src/kernel/syscall/actions/sys_read.c delete mode 100644 src/kernel/syscall/actions/sys_scancode.c create mode 100644 src/kernel/syscall/actions/sys_write.c (limited to 'src/kernel/syscall/actions') diff --git a/src/kernel/syscall/actions/sys_exit.c b/src/kernel/syscall/actions/sys_exit.c new file mode 100644 index 0000000..e2761fd --- /dev/null +++ b/src/kernel/syscall/actions/sys_exit.c @@ -0,0 +1,8 @@ +#include +#include + +uint32_t sys_exit(uint32_t code) +{ + current_proc->state = PROC_ASLEEP; + return code; +} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_fork.c b/src/kernel/syscall/actions/sys_fork.c new file mode 100644 index 0000000..af64ff9 --- /dev/null +++ b/src/kernel/syscall/actions/sys_fork.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include + +uint32_t sys_fork(struct regs *r) +{ + struct page_directory *dir = paging_copy_user_directory(current_proc->cr3); + struct process *proc = process_make_new(); + proc->cr3 = dir; + memcpy(&proc->registers, r, sizeof(struct regs)); + proc->registers.eax = proc->pid; + proc->pid = current_proc->pid; + + process_spawn(proc); + + return 0; +} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_get_pid.c b/src/kernel/syscall/actions/sys_get_pid.c new file mode 100644 index 0000000..7631230 --- /dev/null +++ b/src/kernel/syscall/actions/sys_get_pid.c @@ -0,0 +1,7 @@ +#include +#include + +uint32_t sys_get_pid() +{ + return current_proc->pid; +} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_pointers.c b/src/kernel/syscall/actions/sys_pointers.c deleted file mode 100644 index 1a9a5cf..0000000 --- a/src/kernel/syscall/actions/sys_pointers.c +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include -#include -#include -#include -#include - -struct pointers { - struct vbe_mode_info *current_mode_info; - struct font *font; -}; - -uint32_t sys_pointers() -{ - struct pointers *pointers = umalloc(sizeof(struct vbe_mode_info) + sizeof(struct font)); - pointers->current_mode_info = current_mode_info; - pointers->font = font; - - return pointers; -} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_putch.c b/src/kernel/syscall/actions/sys_putch.c deleted file mode 100644 index beaa4a2..0000000 --- a/src/kernel/syscall/actions/sys_putch.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -uint32_t sys_putch(char ch) -{ - putch(ch); - return 0; -} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_read.c b/src/kernel/syscall/actions/sys_read.c new file mode 100644 index 0000000..a954f56 --- /dev/null +++ b/src/kernel/syscall/actions/sys_read.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include + +uint32_t sys_read(char *path, uint32_t offset, uint32_t count, char *buf) +{ + struct fs_node *node = (struct fs_node *)umalloc(sizeof(struct fs_node)); + strcpy(node->name, path); + ext2_root->open(node); + if (node->inode != 0) { + uint32_t size = ((struct ext2_file *)node->impl)->inode.size; + ext2_root->read(node, 0, size, buf); + buf[size - 1] = '\0'; + ext2_root->close(node); + return size; + } else { + ext2_root->close(node); + return -1; + } +} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_scancode.c b/src/kernel/syscall/actions/sys_scancode.c deleted file mode 100644 index 612326a..0000000 --- a/src/kernel/syscall/actions/sys_scancode.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -uint32_t sys_scancode() -{ - sti(); - uint32_t key = wait_scancode(); - cli(); - return key; -} \ No newline at end of file diff --git a/src/kernel/syscall/actions/sys_write.c b/src/kernel/syscall/actions/sys_write.c new file mode 100644 index 0000000..d79ef37 --- /dev/null +++ b/src/kernel/syscall/actions/sys_write.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include + +uint32_t sys_write(char *path, uint32_t offset, uint32_t count, char *buf) +{ + struct fs_node *node = (struct fs_node *)umalloc(sizeof(struct fs_node)); + strcpy(node->name, path); + ext2_root->open(node); + if (node->inode != 0) { + uint32_t size = ((struct ext2_file *)node->impl)->inode.size; + ext2_root->write(node, 0, size, buf); + buf[size - 1] = '\0'; + ext2_root->close(node); + return size; + } else { + ext2_root->close(node); + return -1; + } +} \ No newline at end of file -- cgit v1.2.3