• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (C) 2011 Texas Instruments Incorporated
3  *  Author: Mark Salter <msalter@redhat.com>
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  */
__copy_from_user(void * to,const void __user * from,unsigned long n)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 
__copy_to_user(void __user * to,const void * from,unsigned long n)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 */
108