#ifndef _JOVE_API_SYSCALL_H #define _JOVE_API_SYSCALL_H 1 #include #include #include "process.h" #include "obj.h" /* General syscall behavior: * If the message passed is not a JOVE_OBJ_MESSAGE type, the kernel will return EBADOBJ. * If the message is too small to hold the target path, the kernel will return ETOOSMALL. * If the target path does not target a real object, the kernel will return EBADPATH. * If the target does not support the callid, the kernel will return EBADARG. * Otherwise, behavior depends on the syscall specified in callid. * */ struct syscall_header { uint16_t callid; uint16_t pathlen; objpath_part_t path[]; }; /* If the message is too small for data, the kernel will return ETOOSMALL. * */ struct syscall_generic_write { size_t len; char data[]; }; struct syscall_generic_objpath { objpath_part_t pathlen; objpath_part_t path[]; }; /**JOVE_OBJ_UNTYPED syscalls. * */ enum { _SYSCALL_UNTYPED_BADCALL = 0, SYSCALL_UNTYPED_ADDRESS, SYSCALL_UNTYPED_SIZE, SYSCALL_UNTYPED_SPLIT, SYSCALL_UNTYPED_MERGE, SYSCALL_UNTYPED_RETYPE_OBJDIR, SYSCALL_UNTYPED_RETYPE_PAGEDIR, SYSCALL_UNTYPED_RETYPE_SHMEMORY, SYSCALL_UNTYPED_RETYPE_PCB, SYSCALL_UNTYPED_RETYPE_MESSAGE, _SYSCALL_UNTYPED_ARCH_BEGIN }; #define SYSCALL_PERM_UNTYPED_ADDRESS JOVE_PERM_READ #define SYSCALL_PERM_UNTYPED_SIZE JOVE_PERM_READ #define SYSCALL_PERM_UNTYPED_SPLIT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) #define SYSCALL_PERM_UNTYPED_MERGE (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) #define SYSCALL_PERM_UNTYPED_RETYPE (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) struct syscall_untyped_split { size_t bytes; objpath_part_t dest_pathlen; objpath_part_t dest_path[]; }; /**JOVE_OBJ_OBJDIR syscalls. * */ enum { _SYSCALL_OBJDIR_BADCALL = 0, SYSCALL_OBJDIR_OBJTYPE, SYSCALL_OBJDIR_SWAP, SYSCALL_OBJDIR_LINK, SYSCALL_OBJDIR_ISLINK }; #define SYSCALL_PERM_OBJDIR_OBJTYPE (JOVE_PERM_READ) #define SYSCALL_PERM_OBJDIR_SWAP (JOVE_PERM_WRITE) #define SYSCALL_PERM_OBJDIR_LINK (JOVE_PERM_WRITE) #define SYSCALL_PERM_OBJDIR_SWAP_TGT (JOVE_PERM_WRITE) #define SYSCALL_PERM_OBJDIR_LINK_TGT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) struct syscall_objdir_swap { objpath_part_t index; objpath_part_t other_path_length; objpath_part_t other_path[]; }; struct syscall_objdir_link { objpath_part_t index; objpath_part_t other_path_length; objpath_part_t other_path[]; }; /* JOVE_OBJ_PAGEDIR syscalls * */ enum { _SYSCALL_PAGEDIR_NONE = 0, SYSCALL_PAGEDIR_MAP_FRAME, SYSCALL_PAGEDIR_MAP_TABLE, SYSCALL_PAGEDIR_MAP_SHMEM, SYSCALL_PAGEDIR_UNMAP_FRAME, SYSCALL_PAGEDIR_UNMAP_TABLE, SYSCALL_PAGEDIR_UNMAP_SHMEM, }; #define SYSCALL_PERM_PAGEDIR_MAP_FRAME (JOVE_PERM_READ | JOVE_PERM_WRITE) #define SYSCALL_PERM_PAGEDIR_MAP_TABLE (JOVE_PERM_READ | JOVE_PERM_WRITE) #define SYSCALL_PERM_PAGEDIR_MAP_SHMEM (JOVE_PERM_READ | JOVE_PERM_WRITE) #define SYSCALL_PERM_PAGEDIR_UNMAP_FRAME (JOVE_PERM_READ | JOVE_PERM_WRITE) #define SYSCALL_PERM_PAGEDIR_UNMAP_TABLE (JOVE_PERM_READ | JOVE_PERM_WRITE) #define SYSCALL_PERM_PAGEDIR_UNMAP_SHMEM (JOVE_PERM_READ | JOVE_PERM_WRITE) struct syscall_pagedir_flags { uint8_t writeable : 1; uint8_t executable : 1; uint8_t flg_unused : 6; }; struct syscall_pagedir_map { uintptr_t virtual_address; struct syscall_pagedir_flags page_flags; objpath_part_t untyped_pathlen; objpath_part_t untyped_path[]; }; struct syscall_pagedir_map_shmem { uintptr_t virtual_address; unsigned short page_offset; struct syscall_pagedir_flags page_flags; objpath_part_t shmem_pathlen; objpath_part_t shmem_path[]; }; struct syscall_pagedir_unmap { uintptr_t virtual_address; objpath_part_t none_pathlen; objpath_part_t none_path[]; }; /**JOVE_OBJ_REGION syscalls. * */ enum { _SYSCALL_REGION_NONE = 0, SYSCALL_REGION_ADDRESS, SYSCALL_REGION_TOTAL_PAGES, SYSCALL_REGION_FREE_PAGES, SYSCALL_REGION_ALLOC, SYSCALL_REGION_SPLIT, SYSCALL_REGION_RELEASE, }; #define SYSCALL_PERM_REGION_GETTERS (JOVE_PERM_READ) #define SYSCALL_PERM_REGION_ALLOC (JOVE_PERM_WRITE) #define SYSCALL_PERM_REGION_SPLIT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) #define SYSCALL_PERM_REGION_MERGE (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) #define SYSCALL_PERM_REGION_ALLOC_TGT (JOVE_PERM_MUTATE) #define SYSCALL_PERM_REGION_SPLIT_TGT (JOVE_PERM_MUTATE) #define SYSCALL_PERM_REGION_MERGE_TGT (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) struct syscall_region_alloc { size_t alloc_pages; objpath_part_t dest_pathlen; objpath_part_t dest_path[]; }; struct syscall_region_split { size_t split_pages; objpath_part_t dest_pathlen; objpath_part_t dest_path[]; }; struct syscall_region_merge { objpath_part_t dest_pathlen; objpath_part_t dest_path[]; }; /**JOVE_OBJ_PCB syscalls. * */ enum { _SYSCALL_PCB_NONE = 0, SYSCALL_PCB_PID, SYSCALL_PCB_YIELD, SYSCALL_PCB_SEND, SYSCALL_PCB_RECV, SYSCALL_PCB_SWAP, SYSCALL_PCB_STACK, SYSCALL_PCB_READY, SYSCALL_PCB_STOP, SYSCALL_PCB_STATE, }; #define SYSCALL_PERM_PCB_PID (JOVE_PERM_READ) #define SYSCALL_PERM_PCB_YIELD (JOVE_PERM_WRITE) #define SYSCALL_PERM_PCB_SEND (JOVE_PERM_WRITE) #define SYSCALL_PERM_PCB_RECV (JOVE_PERM_READ | JOVE_PERM_WRITE) #define SYSCALL_PERM_PCB_SWAP (SYSCALL_PERM_PCB_SEND | SYSCALL_PERM_PCB_RECV) #define SYSCALL_PERM_PCB_STACK (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) #define SYSCALL_PERM_PCB_READY (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) #define SYSCALL_PERM_PCB_STOP (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) #define SYSCALL_PERM_PCB_STATE (JOVE_PERM_READ) #define SYSCALL_PERM_PCB_SEND_OBJDIR (JOVE_PERM_WRITE) #define SYSCALL_PERM_PCB_RECV_DST (JOVE_PERM_MUTATE) #define SYSCALL_PERM_PCB_SWAP_OBJ (JOVE_PERM_MUTATE) #define SYSCALL_PERM_PCB_STACK_OBJ (JOVE_PERM_WRITE | JOVE_PERM_MUTATE) struct syscall_pcb_yield { pid_t yield_target; }; struct syscall_pcb_send { pid_t send_target; uintmax_t send_timeout; objpath_part_t send_path_length; objpath_part_t send_path[]; }; struct syscall_pcb_recv { pid_t recv_target; uintmax_t recv_timeout; objpath_part_t recv_path_length; objpath_part_t recv_path[]; }; struct syscall_pcb_swap { pid_t swap_target; uintmax_t send_timeout; uintmax_t recv_timeout; objpath_part_t swap_path_length; objpath_part_t swap_path[]; }; struct syscall_pcb_stack { unsigned char type; objpath_part_t stack_path_length; objpath_part_t stack_path[]; }; /**JOVE_OBJ_INITRD_FILE syscalls * */ enum { _SYSCALL_INITRD_FILE_NONE = 0, SYSCALL_INITRD_FILE_NAME, SYSCALL_INITRD_FILE_SIZE, SYSCALL_INITRD_FILE_READ }; #define SYSCALL_PERM_INITRD_FILE_NAME (JOVE_PERM_READ) #define SYSCALL_PERM_INITRD_FILE_SIZE (JOVE_PERM_READ) #define SYSCALL_PERM_INITRD_FILE_READ (JOVE_PERM_READ) struct syscall_initrd_file_name_ret { size_t len; char c_str[]; }; struct syscall_initrd_file_read { size_t start_index; size_t read_size; }; /**JOVE_OBJ_MESSAGE syscalls. * */ enum { _SYSCALL_MESSAGE_NONE = 0, }; /**JOVE_OBJ_VIRTTERM syscalls.*/ enum { _SYSCALL_VTT_NONE = 0, SYSCALL_VTT_WRITE }; #endif