summaryrefslogtreecommitdiffstats
path: root/sys/syscall.h
blob: 6387d798edfb4fc9e9fba037bf7a4ed0ce03a9ae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef _JOVE_SYS_SYSCALL_H
#define _JOVE_SYS_SYSCALL_H 1

#include "config.h"
#include "api/syscall.h"
#include "hal/obj.h"
#include "lockstack.h"
#include "link.h"
#include <stdint.h>

#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_owned_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_generic_objpath(jove_owned_obj_t *objdir, size_t bytes_left, void *payload_data, jove_owned_obj_t **retobj);

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_vtt(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