blob: 13269d2a9a7e79564d82878d2c8bd3b1316db5a9 [file] [log] [blame]
/* Copyright (c) 2009, 2010 The Regents of the University of California
* Barret Rhoden <brho@cs.berkeley.edu>
* Andrew Waterman <waterman@cs.berkeley.edu>
* See LICENSE for details.
*
* Functions for working with userspace's address space. */
#include <ros/common.h>
#include <process.h>
/* Is this a valid user pointer for read/write? It doesn't care if the address
* is paged out or even an unmapped region: simply if it is in part of the
* address space that could be RW user. Will also check for len bytes. */
static inline bool is_user_rwaddr(void *addr, size_t len);
/* Same deal, but read-only */
static inline bool is_user_raddr(void *addr, size_t len);
/* Copy from proc p into the kernel's dest from src */
int memcpy_from_user(struct proc *p, void *dest, const void *DANGEROUS va,
size_t len);
/* Copy to proc p into va from the kernel's src */
int memcpy_to_user(struct proc *p, void *DANGEROUS va, const void *src,
size_t len);
/* Same as above, but sets errno */
int memcpy_from_user_errno(struct proc *p, void *dst, const void *src, int len);
int memcpy_to_user_errno(struct proc *p, void *dst, const void *src, int len);
/* Creates a buffer (kmalloc) and safely copies into it from va. Can return an
* error code. Check its response with IS_ERR(). Must be paired with
* user_memdup_free() if this succeeded. */
void *user_memdup(struct proc *p, const void *va, int len);
/* Same as above, but sets errno */
void *user_memdup_errno(struct proc *p, const void *va, int len);
void user_memdup_free(struct proc *p, void *va);
/* Same as memdup, but just does strings. still needs memdup_freed */
char *user_strdup(struct proc *p, const char *u_string, size_t strlen);
char *user_strdup_errno(struct proc *p, const char *u_string, size_t strlen);
void *kmalloc_errno(int len);
bool uva_is_kva(struct proc *p, void *uva, void *kva);
uintptr_t uva2kva(struct proc *p, void *uva);
/* UWLIM is defined as virtual address below which a process can write */
static inline bool is_user_rwaddr(void *addr, size_t len)
{
if (((uintptr_t)addr < UWLIM) && ((uintptr_t)addr + len <= UWLIM))
return TRUE;
else
return FALSE;
}
/* ULIM is defined as virtual address below which a process can read */
static inline bool is_user_raddr(void *addr, size_t len)
{
if (((uintptr_t)addr < ULIM) && ((uintptr_t)addr + len <= ULIM))
return TRUE;
else
return FALSE;
}