blob: 880e047c2e758c2c71f0f6f508b4a8871fa10bcb (
plain) (
tree)
|
|
#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;
}
|