#ifndef _JOVE_SYS_SYSCALL_H #define _JOVE_SYS_SYSCALL_H 1 #include "config.h" #include "api/syscall.h" #include "hal/obj.h" #include "sys/objdir.h" #include "lockstack.h" #include "link.h" #include #define CHECK_TOOSMALL(required, present, fail_msg) \ do { if(present < required) { \ kprintf("%s: %s\n", __func__, fail_msg); \ return -ETOOSMALL; \ } } while(0) #define CHECK_OBJEXISTS(obj, fail_msg) \ do { if(obj == NULL) { \ kprintf("%s: %s\n", __func__, fail_msg); \ return -EBADOBJ; \ } } while(0) #define CHECK_OBJTYPE(obj, type, fail_msg) \ do { if(obj_gettype(obj) != type) { \ kprintf("%s: %s\n", __func__, fail_msg); \ return -EBADOBJ; \ } } while(0) #define CHECK_OBJPERM(obj, perms, fail_msg) \ do { if((obj.permissions & perms) == 0) { \ kprintf("%s: %s\n", __func__, fail_msg); \ return -EPERM; \ } } while(0) typedef struct syscall_state { lockstack_t lockstack; jove_owned_obj_t *pcb; jove_obj_t *objdir; jove_perm_obj_t message; jove_perm_obj_t target; struct syscall_header *header; size_t bytes_left; void *payload; } syscall_context_t; typedef int (*syscall_handle_t)(syscall_context_t*); int _syscall_handle_switch(syscall_context_t *ctx); int _syscall_handle_generic(syscall_context_t *ctx); int _syscall_handle_arch(syscall_context_t *ctx); int _syscall_handle_objdir(syscall_context_t *ctx); int _syscall_handle_untyped(syscall_context_t *ctx); int _syscall_handle_pagedir(syscall_context_t *ctx); int _syscall_handle_region(syscall_context_t *ctx); int _syscall_handle_pcb(syscall_context_t *ctx); int _syscall_handle_initrd_file(syscall_context_t *ctx); int _syscall_handle_message(syscall_context_t *ctx); #endif