summaryrefslogtreecommitdiffstats
path: root/lib/libjove/arch/x86_64/object/pagemap.c
blob: 0c03028c97c1494f0b553e0fff8c032d489b5dd0 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <object.h>
#include <jove.h>
#include <error.h>
#include <kernel/error.h>
#include <string.h>
#include <arch/x86_64/object-pagemap.h>
#include <arch/x86_64/syscall.h>

KernelObjectPageMap*
jove_object_as_pagemap(KernelObjectTyped *typed)
{
    if(typed->type == KO_MEMORY_MAPPING) return (KernelObjectPageMap*)typed;
    jove_errno = EJOVE_BADOBJ;
    return NULL;
}

void 
_jove_alloc_pagemap_inplace(
        KernelObjectPageMap *pagemap,
        KernelObjectDirectory *dir,
        uint8_t memb)
{
    *pagemap = (KernelObjectPageMap) {
        .typed = (KernelObjectTyped) {
            .parent = dir,
            .type = KO_MEMORY_MAPPING,
            .membi = memb
        },
    };
    dir->children[memb] = JOVE_OBJECT_TYPED(pagemap);
}

KernelObjectPageMap* 
_jove_alloc_pagemap(
        KernelObjectDirectory *dir, 
        uint8_t memb)
{
    if(_jove_alloc == NULL) {
        jove_errno = EJOVE_NOALLOC;
        return NULL;
    }
    if(dir->children[memb] != NULL) {
        jove_errno = EJOVE_FULL;
        return NULL;
    }

    KernelObjectPageMap *pagemap = _jove_alloc(sizeof(KernelObjectPageMap));
    if(pagemap == NULL) return NULL;

    _jove_alloc_pagemap_inplace(pagemap, dir, memb);
    jove_errno = EJOVE_OK;
    return pagemap;
}

int
jove_pagemap_exists(
        KernelObjectPageMap *map,
        uint8_t depth,
        uint16_t *path
        )
{
    int kerr = _syscall_invoke_mapping_exists(map, depth, path);
    if(kerr == KE_DNE) return 0;

    int jerr = jove_error_from_kerror(kerr);

    if(jerr) {
        jove_errno = jerr;
        return 0;
    }
    return 1;
}

JoveError
jove_pagemap_map(
        KernelObjectPageMap *map,
        uint8_t depth,
        uint16_t *path,
        KernelObjectUntyped *untyped)
{
    if(jove_untyped_size(untyped) != 0x1000) {
        return EJOVE_BADSIZE;
    }

    return jove_error_from_kerror(_syscall_invoke_mapping_map(map, depth, path, untyped));
}

JoveError
jove_pagemap_unmap(
        KernelObjectPageMap *map,
        uint8_t depth,
        uint16_t *path,
        KernelObjectUntyped *untyped)
{
    JoveError err = jove_error_from_kerror(_syscall_invoke_mapping_unmap(map, depth, path, untyped));
    if(err) return err;

    untyped->alignment = 0x1000;
    untyped->bytes = 0x1000;
    return EJOVE_OK;
}