blob: 16194f502ddfa3271170df0a07baf9226d0ac00a [file] [log] [blame]
/* Copyright (c) 2015 Google Inc
* Davide Libenzi <dlibenzi@google.com>
* See LICENSE for details.
*
* Part of this code coming from a Linux kernel file:
*
* linux/arch/x86/include/asm/uaccess.h
*
* Which, even though missing specific copyright, it is supposed to be
* ruled by the overall Linux copyright.
*/
#pragma once
#include <ros/errno.h>
#include <compiler.h>
#include <stdint.h>
#include <umem.h>
#define ASM_STAC
#define ASM_CLAC
#define __m(x) *(x)
struct extable_ip_fixup {
uint64_t insn;
uint64_t fixup;
};
#define _ASM_EXTABLE(from, to) \
" .pushsection \"__ex_table\",\"a\"\n" \
" .balign 16\n" \
" .quad (" #from ") - .\n" \
" .quad (" #to ") - .\n" \
" .popsection\n"
static inline int __put_user(void *dst, const void *src, unsigned int count)
{
#warning "The __put_user() API is a stub and should be re-implemented"
memcpy(dst, src, count);
return 0;
}
static inline int copy_to_user(void *dst, const void *src, unsigned int count)
{
#warning "The copy_to_user() API is a stub and should be re-implemented"
int err = 0;
if (unlikely(!is_user_rwaddr(dst, count))) {
err = -EFAULT;
} else {
err = __put_user(dst, src, count);
}
return err;
}
static inline int __get_user(void *dst, const void *src, unsigned int count)
{
#warning "The __get_user() API is a stub and should be re-implemented"
memcpy(dst, src, count);
return 0;
}
static inline int copy_from_user(void *dst, const void *src,
unsigned int count)
{
#warning "The copy_from_user() API is a stub and should be re-implemented"
int err = 0;
if (unlikely(!is_user_raddr((void *) src, count))) {
err = -EFAULT;
} else {
err = __get_user(dst, src, count);
}
return err;
}
static inline uintptr_t ex_insn_addr(const struct extable_ip_fixup *x)
{
return (uintptr_t) &x->insn + x->insn;
}
static inline uintptr_t ex_fixup_addr(const struct extable_ip_fixup *x)
{
return (uintptr_t) &x->fixup + x->fixup;
}