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
hexagon
include
asm
uaccess.h
Go to the documentation of this file.
1
/*
2
* User memory access support for Hexagon
3
*
4
* Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 and
8
* only version 2 as published by the Free Software Foundation.
9
*
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18
* 02110-1301, USA.
19
*/
20
21
#ifndef _ASM_UACCESS_H
22
#define _ASM_UACCESS_H
23
/*
24
* User space memory access functions
25
*/
26
#include <linux/sched.h>
27
#include <
linux/mm.h
>
28
#include <asm/segment.h>
29
#include <asm/sections.h>
30
31
/*
32
* access_ok: - Checks if a user space pointer is valid
33
* @type: Type of access: %VERIFY_READ or %VERIFY_WRITE. Note that
34
* %VERIFY_WRITE is a superset of %VERIFY_READ - if it is safe
35
* to write to a block, it is always safe to read from it.
36
* @addr: User space pointer to start of block to check
37
* @size: Size of block to check
38
*
39
* Context: User context only. This function may sleep.
40
*
41
* Checks if a pointer to a block of memory in user space is valid.
42
*
43
* Returns true (nonzero) if the memory block *may* be valid, false (zero)
44
* if it is definitely invalid.
45
*
46
* User address space in Hexagon, like x86, goes to 0xbfffffff, so the
47
* simple MSB-based tests used by MIPS won't work. Some further
48
* optimization is probably possible here, but for now, keep it
49
* reasonably simple and not *too* slow. After all, we've got the
50
* MMU for backup.
51
*/
52
#define VERIFY_READ 0
53
#define VERIFY_WRITE 1
54
55
#define __access_ok(addr, size) \
56
((get_fs().seg == KERNEL_DS.seg) || \
57
(((unsigned long)addr < get_fs().seg) && \
58
(unsigned long)size < (get_fs().seg - (unsigned long)addr)))
59
60
/*
61
* When a kernel-mode page fault is taken, the faulting instruction
62
* address is checked against a table of exception_table_entries.
63
* Each entry is a tuple of the address of an instruction that may
64
* be authorized to fault, and the address at which execution should
65
* be resumed instead of the faulting instruction, so as to effect
66
* a workaround.
67
*/
68
69
/* Assembly somewhat optimized copy routines */
70
unsigned
long
__copy_from_user_hexagon
(
void
*to,
const
void
__user *
from
,
71
unsigned
long
n
);
72
unsigned
long
__copy_to_user_hexagon
(
void
__user *to,
const
void
*
from
,
73
unsigned
long
n
);
74
75
#define __copy_from_user(to, from, n) __copy_from_user_hexagon(to, from, n)
76
#define __copy_to_user(to, from, n) __copy_to_user_hexagon(to, from, n)
77
78
/*
79
* XXX todo: some additonal performance gain is possible by
80
* implementing __copy_to/from_user_inatomic, which is much
81
* like __copy_to/from_user, but performs slightly less checking.
82
*/
83
84
__kernel_size_t
__clear_user_hexagon
(
void
__user *
dest
,
unsigned
long
count
);
85
#define __clear_user(a, s) __clear_user_hexagon((a), (s))
86
87
#define __strncpy_from_user(dst, src, n) hexagon_strncpy_from_user(dst, src, n)
88
89
/* get around the ifndef in asm-generic/uaccess.h */
90
#define __strnlen_user __strnlen_user
91
92
extern
long
__strnlen_user
(
const
char
__user *
src
,
long
n
);
93
94
static
inline
long
hexagon_strncpy_from_user(
char
*
dst
,
const
char
__user *
src
,
95
long
n
);
96
97
#include <
asm-generic/uaccess.h
>
98
99
/* Todo: an actual accelerated version of this. */
100
static
inline
long
hexagon_strncpy_from_user(
char
*
dst
,
const
char
__user *
src
,
101
long
n
)
102
{
103
long
res
=
__strnlen_user
(src, n);
104
105
/* return from strnlen can't be zero -- that would be rubbish. */
106
107
if
(res > n) {
108
copy_from_user
(dst, src, n);
109
return
n
;
110
}
else
{
111
copy_from_user
(dst, src, res);
112
return
res-1;
113
}
114
}
115
116
#endif
Generated on Thu Jan 10 2013 12:50:45 for Linux Kernel by
1.8.2