Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
uaccess.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Texas Instruments Incorporated
3  * Author: Mark Salter <[email protected]>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9 #ifndef _ASM_C6X_UACCESS_H
10 #define _ASM_C6X_UACCESS_H
11 
12 #include <linux/types.h>
13 #include <linux/compiler.h>
14 #include <linux/string.h>
15 
16 #ifdef CONFIG_ACCESS_CHECK
17 #define __access_ok _access_ok
18 #endif
19 
20 /*
21  * __copy_from_user/copy_to_user are based on ones in asm-generic/uaccess.h
22  *
23  * C6X supports unaligned 32 and 64 bit loads and stores.
24  */
25 static inline __must_check long __copy_from_user(void *to,
26  const void __user *from, unsigned long n)
27 {
28  u32 tmp32;
29  u64 tmp64;
30 
31  if (__builtin_constant_p(n)) {
32  switch (n) {
33  case 1:
34  *(u8 *)to = *(u8 __force *)from;
35  return 0;
36  case 4:
37  asm volatile ("ldnw .d1t1 *%2,%0\n"
38  "nop 4\n"
39  "stnw .d1t1 %0,*%1\n"
40  : "=&a"(tmp32)
41  : "A"(to), "a"(from)
42  : "memory");
43  return 0;
44  case 8:
45  asm volatile ("ldndw .d1t1 *%2,%0\n"
46  "nop 4\n"
47  "stndw .d1t1 %0,*%1\n"
48  : "=&a"(tmp64)
49  : "a"(to), "a"(from)
50  : "memory");
51  return 0;
52  default:
53  break;
54  }
55  }
56 
57  memcpy(to, (const void __force *)from, n);
58  return 0;
59 }
60 
61 static inline __must_check long __copy_to_user(void __user *to,
62  const void *from, unsigned long n)
63 {
64  u32 tmp32;
65  u64 tmp64;
66 
67  if (__builtin_constant_p(n)) {
68  switch (n) {
69  case 1:
70  *(u8 __force *)to = *(u8 *)from;
71  return 0;
72  case 4:
73  asm volatile ("ldnw .d1t1 *%2,%0\n"
74  "nop 4\n"
75  "stnw .d1t1 %0,*%1\n"
76  : "=&a"(tmp32)
77  : "a"(to), "a"(from)
78  : "memory");
79  return 0;
80  case 8:
81  asm volatile ("ldndw .d1t1 *%2,%0\n"
82  "nop 4\n"
83  "stndw .d1t1 %0,*%1\n"
84  : "=&a"(tmp64)
85  : "a"(to), "a"(from)
86  : "memory");
87  return 0;
88  default:
89  break;
90  }
91  }
92 
93  memcpy((void __force *)to, from, n);
94  return 0;
95 }
96 
97 #define __copy_to_user __copy_to_user
98 #define __copy_from_user __copy_from_user
99 
100 extern int _access_ok(unsigned long addr, unsigned long size);
101 #ifdef CONFIG_ACCESS_CHECK
102 #define __access_ok _access_ok
103 #endif
104 
105 #include <asm-generic/uaccess.h>
106 
107 #endif /* _ASM_C6X_UACCESS_H */