diff --git a/include/kernel.h b/include/kernel.h index 635c5f8..c61eb8c 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -5,13 +5,19 @@ #include "resource.h" #include "module.h" #include "process.h" +#include "memorymap.h" #include enum syscall_id_t { - SYSCALL_YIELD = 1 + SYSCALL_TEST = 1, + SYSCALL_YIELD, + SYSCALL_MMAP, + SYSCALL_MUNMAP }; +typedef size_t (*syscall_t)(struct kernel_t*, size_t, size_t, size_t); + struct kernel_t { struct page_stack_t *page_stack; @@ -20,8 +26,14 @@ struct kernel_t struct resource_table_t *resource_table; }; +extern syscall_t syscall_table[32]; + extern struct kernel_t kernel_state; +void construct_kernel_state(struct kernel_t *kernel, struct page_stack_t *page_stack, + struct priority_queue_t *priority_queue, struct resource_table_t *resource_table, + size_t module_count, struct module_t *module_list); + size_t do_syscall(struct kernel_t *kernel, enum syscall_id_t id, size_t arg1, size_t arg2, size_t arg3); int load_module(struct kernel_t *kernel, struct module_t *module); diff --git a/src/kernel.c b/src/kernel.c index 4ca80aa..6138f4c 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -5,9 +5,29 @@ #include "context.h" #include "types/status.h" +syscall_t syscall_table[32]; + +void construct_kernel_state(struct kernel_t *kernel, struct page_stack_t *page_stack, + struct priority_queue_t *priority_queue, struct resource_table_t *resource_table, + size_t module_count, struct module_t *module_list) +{ + kernel->page_stack = page_stack; + kernel->resource_table = resource_table; + kernel->priority_queue = priority_queue; + kernel->active_process = NULL; + for(int i = 0; i < module_count; i++) + { + load_module(&kernel_state, &module_list[i]); + } +} + size_t do_syscall(struct kernel_t *kernel, enum syscall_id_t id, size_t arg1, size_t arg2, size_t arg3) { - + if(syscall_table[id] == NULL) + { + return S_BAD_SYSCALL; + } + return syscall_table[id](kernel, arg1, arg2, arg3); } int load_module(struct kernel_t *kernel, struct module_t *module)