summaryrefslogtreecommitdiffstats
path: root/task/umode_vma.c
blob: 880e047c2e758c2c71f0f6f508b4a8871fa10bcb (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
#include "umode_vma.h"
#include "arch/processor.h"
#include "api/errno.h"
#include "print.h"

__attribute__((naked))
int
_umode_vma_fail(void)
{
    __asm__ volatile(" \
    movq %%rbp, %%rsp; \
    popq %%rbp; \
    mov $1, %%eax; \
    retq":::);
}

int
user_vma_read(void *dest, const void *src, size_t w)
{
    if((uintptr_t)src > USERLAND_MEMORY_LIMIT) return -EACCESS;

    _exrtab_push((void*)_umode_vma_fail);
    for(size_t i = 0; i < w; i++) ((char*)dest)[i] = ((const char*)src)[i];
    _exrtab_pop();
    return 0;
}

int
user_vma_write(void *dest, const void *src, size_t w)
{
    if((uintptr_t)dest > USERLAND_MEMORY_LIMIT) return -EACCESS;
    
    _exrtab_push((void*)_umode_vma_fail);
    for(size_t i = 0; i < w; i++) ((char*)dest)[i] = ((const char*)src)[i];
    _exrtab_pop();
    return 0;
}