Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
m68k
include
asm
uaccess_no.h
Go to the documentation of this file.
1
#ifndef __M68KNOMMU_UACCESS_H
2
#define __M68KNOMMU_UACCESS_H
3
4
/*
5
* User space memory access functions
6
*/
7
#include <linux/sched.h>
8
#include <
linux/mm.h
>
9
#include <linux/string.h>
10
11
#include <asm/segment.h>
12
13
#define VERIFY_READ 0
14
#define VERIFY_WRITE 1
15
16
#define access_ok(type,addr,size) _access_ok((unsigned long)(addr),(size))
17
18
/*
19
* It is not enough to just have access_ok check for a real RAM address.
20
* This would disallow the case of code/ro-data running XIP in flash/rom.
21
* Ideally we would check the possible flash ranges too, but that is
22
* currently not so easy.
23
*/
24
static
inline
int
_access_ok
(
unsigned
long
addr
,
unsigned
long
size
)
25
{
26
return
1;
27
}
28
29
/*
30
* The exception table consists of pairs of addresses: the first is the
31
* address of an instruction that is allowed to fault, and the second is
32
* the address at which the program should continue. No registers are
33
* modified, so it is entirely up to the continuation code to figure out
34
* what to do.
35
*
36
* All the routines below use bits of fixup code that are out of line
37
* with the main instruction path. This means when everything is well,
38
* we don't even have to jump over them. Further, they do not intrude
39
* on our cache or tlb entries.
40
*/
41
42
struct
exception_table_entry
43
{
44
unsigned
long
insn
,
fixup
;
45
};
46
47
/* Returns 0 if exception not found and fixup otherwise. */
48
extern
unsigned
long
search_exception_table
(
unsigned
long
);
49
50
51
/*
52
* These are the main single-value transfer routines. They automatically
53
* use the right size if we just have the right pointer type.
54
*/
55
56
#define put_user(x, ptr) \
57
({ \
58
int __pu_err = 0; \
59
typeof(*(ptr)) __pu_val = (x); \
60
switch (sizeof (*(ptr))) { \
61
case 1: \
62
__put_user_asm(__pu_err, __pu_val, ptr, b); \
63
break; \
64
case 2: \
65
__put_user_asm(__pu_err, __pu_val, ptr, w); \
66
break; \
67
case 4: \
68
__put_user_asm(__pu_err, __pu_val, ptr, l); \
69
break; \
70
case 8: \
71
memcpy(ptr, &__pu_val, sizeof (*(ptr))); \
72
break; \
73
default: \
74
__pu_err = __put_user_bad(); \
75
break; \
76
} \
77
__pu_err; \
78
})
79
#define __put_user(x, ptr) put_user(x, ptr)
80
81
extern
int
__put_user_bad
(
void
);
82
83
/*
84
* Tell gcc we read from memory instead of writing: this is because
85
* we do not write to any memory gcc knows about, so there are no
86
* aliasing issues.
87
*/
88
89
#define __ptr(x) ((unsigned long *)(x))
90
91
#define __put_user_asm(err,x,ptr,bwl) \
92
__asm__ ("move" #bwl " %0,%1" \
93
:
/* no outputs */
\
94
:"d" (x),"m" (*__ptr(ptr)) : "memory")
95
96
#define get_user(x, ptr) \
97
({ \
98
int __gu_err = 0; \
99
typeof(x) __gu_val = 0; \
100
switch (sizeof(*(ptr))) { \
101
case 1: \
102
__get_user_asm(__gu_err, __gu_val, ptr, b, "=d"); \
103
break; \
104
case 2: \
105
__get_user_asm(__gu_err, __gu_val, ptr, w, "=r"); \
106
break; \
107
case 4: \
108
__get_user_asm(__gu_err, __gu_val, ptr, l, "=r"); \
109
break; \
110
case 8: \
111
memcpy((void *) &__gu_val, ptr, sizeof (*(ptr))); \
112
break; \
113
default: \
114
__gu_val = 0; \
115
__gu_err = __get_user_bad(); \
116
break; \
117
} \
118
(x) = (typeof(*(ptr))) __gu_val; \
119
__gu_err; \
120
})
121
#define __get_user(x, ptr) get_user(x, ptr)
122
123
extern
int
__get_user_bad
(
void
);
124
125
#define __get_user_asm(err,x,ptr,bwl,reg) \
126
__asm__ ("move" #bwl " %1,%0" \
127
: "=d" (x) \
128
: "m" (*__ptr(ptr)))
129
130
#define copy_from_user(to, from, n) (memcpy(to, from, n), 0)
131
#define copy_to_user(to, from, n) (memcpy(to, from, n), 0)
132
133
#define __copy_from_user(to, from, n) copy_from_user(to, from, n)
134
#define __copy_to_user(to, from, n) copy_to_user(to, from, n)
135
#define __copy_to_user_inatomic __copy_to_user
136
#define __copy_from_user_inatomic __copy_from_user
137
138
#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; })
139
140
#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; })
141
142
/*
143
* Copy a null terminated string from userspace.
144
*/
145
146
static
inline
long
147
strncpy_from_user
(
char
*
dst
,
const
char
*
src
,
long
count
)
148
{
149
char
*
tmp
;
150
strncpy
(dst, src, count);
151
for
(tmp = dst; *tmp && count > 0; tmp++, count--)
152
;
153
return
(tmp - dst);
/* DAVIDM should we count a NUL ? check getname */
154
}
155
156
/*
157
* Return the size of a string (including the ending 0)
158
*
159
* Return 0 on exception, a value greater than N if too long
160
*/
161
static
inline
long
strnlen_user
(
const
char
*
src
,
long
n
)
162
{
163
return
(
strlen
(src) + 1);
/* DAVIDM make safer */
164
}
165
166
#define strlen_user(str) strnlen_user(str, 32767)
167
168
/*
169
* Zero Userspace
170
*/
171
172
static
inline
unsigned
long
173
__clear_user
(
void
*to,
unsigned
long
n)
174
{
175
memset
(to, 0, n);
176
return
0;
177
}
178
179
#define clear_user(to,n) __clear_user(to,n)
180
181
#endif
/* _M68KNOMMU_UACCESS_H */
Generated on Thu Jan 10 2013 13:08:08 for Linux Kernel by
1.8.2