From 6df3f203b8884b2bf5410062f4c51cfdffe7aea9 Mon Sep 17 00:00:00 2001 From: ngiddings Date: Mon, 19 Apr 2021 06:51:48 -0500 Subject: [PATCH] Added source file for syscalls --- include/syscalls.h | 9 +++++ src/Makefile.am | 2 +- src/syscalls.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 include/syscalls.h create mode 100644 src/syscalls.c diff --git a/include/syscalls.h b/include/syscalls.h new file mode 100644 index 0000000..e2aafa3 --- /dev/null +++ b/include/syscalls.h @@ -0,0 +1,9 @@ +#pragma once + +#include "kernel.h" + +size_t test_syscall(struct kernel_t *kernel, size_t arg1, size_t arg2, size_t arg3); + +size_t mmap(struct kernel_t *kernel, size_t location, size_t length, size_t flags); + +size_t munmap(struct kernel_t *kernel, size_t location, size_t length, size_t arg3); diff --git a/src/Makefile.am b/src/Makefile.am index 8f5c591..90ff4d9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,5 @@ noinst_PROGRAMS = quark-kernel -quark_kernel_SOURCES = kernel.c memorymap.c pageallocator.c priorityqueue.c stdio.c string.c elf.c resource.c allocator.c +quark_kernel_SOURCES = kernel.c memorymap.c pageallocator.c priorityqueue.c stdio.c string.c elf.c resource.c allocator.c syscalls.c quark_kernel_LDADD = -lgcc quark_kernel_CFLAGS = -I$(top_srcdir)/include -ffreestanding -mgeneral-regs-only -O0 -Wall -ggdb quark_kernel_LDFLAGS = -nostdlib diff --git a/src/syscalls.c b/src/syscalls.c new file mode 100644 index 0000000..687e4f2 --- /dev/null +++ b/src/syscalls.c @@ -0,0 +1,83 @@ +#include "syscalls.h" +#include "kernel.h" +#include "mmgr.h" +#include "stdio.h" +#include "types/status.h" + +size_t test_syscall(struct kernel_t *kernel, size_t arg1, size_t arg2, size_t arg3) +{ + printf("%s", (char*)arg1); + return 17; +} + +size_t mmap(struct kernel_t *kernel, size_t location, size_t length, size_t flags) +{ + if(location % page_size != 0 || length % page_size != 0) + { + return S_INVALID_ARGUMENT; + } + else if(location == NULL) + { + return S_NULL_POINTER; + } + for(size_t i = 0; i < length; i += page_size) + { + if(page_type((void*)(location + i)) != PAGE_NOT_PRESENT) + { + return S_EXISTS; + } + } + size_t n = 0; + int status = S_OK; + while(n < length && status == S_OK) + { + physaddr_t frame = reserve_page(kernel->page_stack); + status = frame % page_size; + if(status == S_OK) + { + status = map_page(kernel->page_stack, (void*)(location + n), frame, PAGE_USERMODE | PAGE_RW); + if(status != S_OK && free_page(kernel->page_stack, frame) != S_OK) + { + panic("critical error reached during mmap."); + } + n += page_size; + } + else + { + break; + } + } + if(status != S_OK && munmap(kernel, location, page_size, NULL) != S_OK) + { + panic("critical error reached during mmap."); + } + return status; +} + +size_t munmap(struct kernel_t *kernel, size_t location, size_t length, size_t arg3) +{ + if(location % page_size != 0 || length % page_size != 0) + { + return S_INVALID_ARGUMENT; + } + else if(location == 0) + { + return S_NULL_POINTER; + } + size_t n = 0; + int status = S_OK; + while(n < length && status == S_OK) + { + enum page_type_t type = page_type((void*)(location + n)); + physaddr_t frame; + if(type != PAGE_NOT_PRESENT) + { + frame = unmap_page((void*)(location + n)); + } + if(type == PAGE_ANON) + { + status = free_page(kernel->page_stack, frame); + } + } + return status; +}