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;
}
|