]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
ae2587e4 | 2 | * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
1da177e4 LT |
3 | * Licensed under the GPL |
4 | */ | |
5 | ||
6 | #ifndef __ARCH_UM_UACCESS_H | |
7 | #define __ARCH_UM_UACCESS_H | |
8 | ||
8192ab42 JD |
9 | #include <asm/elf.h> |
10 | #include <asm/fixmap.h> | |
11 | #include "sysdep/archsetjmp.h" | |
bf001b26 | 12 | |
7a590611 PBG |
13 | #define __under_task_size(addr, size) \ |
14 | (((unsigned long) (addr) < TASK_SIZE) && \ | |
ae2587e4 | 15 | (((unsigned long) (addr) + (size)) < TASK_SIZE)) |
7a590611 PBG |
16 | |
17 | #define __access_ok_vsyscall(type, addr, size) \ | |
18 | ((type == VERIFY_READ) && \ | |
19 | ((unsigned long) (addr) >= FIXADDR_USER_START) && \ | |
20 | ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \ | |
21 | ((unsigned long) (addr) + (size) >= (unsigned long)(addr))) | |
22 | ||
23 | #define __addr_range_nowrap(addr, size) \ | |
24 | ((unsigned long) (addr) <= ((unsigned long) (addr) + (size))) | |
25 | ||
1da177e4 | 26 | #define access_ok(type, addr, size) \ |
7a590611 PBG |
27 | (__addr_range_nowrap(addr, size) && \ |
28 | (__under_task_size(addr, size) || \ | |
29 | __access_ok_vsyscall(type, addr, size) || \ | |
6aa802ce | 30 | segment_eq(get_fs(), KERNEL_DS))) |
1da177e4 | 31 | |
6aa802ce JD |
32 | extern int copy_from_user(void *to, const void __user *from, int n); |
33 | extern int copy_to_user(void __user *to, const void *from, int n); | |
1da177e4 | 34 | |
fab95c55 JD |
35 | extern int __do_copy_to_user(void *to, const void *from, int n, |
36 | void **fault_addr, jmp_buf **fault_catcher); | |
fab95c55 | 37 | |
1da177e4 LT |
38 | /* |
39 | * strncpy_from_user: - Copy a NUL terminated string from userspace. | |
40 | * @dst: Destination address, in kernel space. This buffer must be at | |
41 | * least @count bytes long. | |
42 | * @src: Source address, in user space. | |
43 | * @count: Maximum number of bytes to copy, including the trailing NUL. | |
44 | * | |
45 | * Copies a NUL-terminated string from userspace to kernel space. | |
46 | * | |
47 | * On success, returns the length of the string (not including the trailing | |
48 | * NUL). | |
49 | * | |
50 | * If access to userspace fails, returns -EFAULT (some data may have been | |
51 | * copied). | |
52 | * | |
53 | * If @count is smaller than the length of the string, copies @count bytes | |
54 | * and returns @count. | |
55 | */ | |
56 | ||
6aa802ce | 57 | extern int strncpy_from_user(char *dst, const char __user *src, int count); |
1da177e4 LT |
58 | |
59 | /* | |
60 | * __clear_user: - Zero a block of memory in user space, with less checking. | |
61 | * @to: Destination address, in user space. | |
62 | * @n: Number of bytes to zero. | |
63 | * | |
64 | * Zero a block of memory in user space. Caller must check | |
65 | * the specified block with access_ok() before calling this function. | |
66 | * | |
67 | * Returns number of bytes that could not be cleared. | |
68 | * On success, this will be zero. | |
69 | */ | |
6aa802ce | 70 | extern int __clear_user(void __user *mem, int len); |
1da177e4 LT |
71 | |
72 | /* | |
73 | * clear_user: - Zero a block of memory in user space. | |
74 | * @to: Destination address, in user space. | |
75 | * @n: Number of bytes to zero. | |
76 | * | |
77 | * Zero a block of memory in user space. | |
78 | * | |
79 | * Returns number of bytes that could not be cleared. | |
80 | * On success, this will be zero. | |
81 | */ | |
6aa802ce | 82 | extern int clear_user(void __user *mem, int len); |
1da177e4 LT |
83 | |
84 | /* | |
85 | * strlen_user: - Get the size of a string in user space. | |
86 | * @str: The string to measure. | |
87 | * @n: The maximum valid length | |
88 | * | |
89 | * Get the size of a NUL-terminated string in user space. | |
90 | * | |
91 | * Returns the size of the string INCLUDING the terminating NUL. | |
92 | * On exception, returns 0. | |
93 | * If the string is too long, returns a value greater than @n. | |
94 | */ | |
6aa802ce | 95 | extern int strnlen_user(const void __user *str, int len); |
1da177e4 LT |
96 | |
97 | #endif |