uaccess.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:9k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __PARISC_UACCESS_H
  2. #define __PARISC_UACCESS_H
  3. /*
  4.  * User space memory access functions
  5.  */
  6. #include <linux/sched.h>
  7. #include <asm/page.h>
  8. #include <asm/system.h>
  9. #include <asm/cache.h>
  10. #define VERIFY_READ 0
  11. #define VERIFY_WRITE 1
  12. #define KERNEL_DS ((mm_segment_t){0})
  13. #define USER_DS  ((mm_segment_t){1})
  14. #define segment_eq(a,b) ((a).seg == (b).seg)
  15. #define get_ds() (KERNEL_DS)
  16. #define get_fs() (current->addr_limit)
  17. #define set_fs(x) (current->addr_limit = (x))
  18. /*
  19.  * Note that since kernel addresses are in a separate address space on
  20.  * parisc, we don't need to do anything for access_ok() or verify_area().
  21.  * We just let the page fault handler do the right thing. This also means
  22.  * that put_user is the same as __put_user, etc.
  23.  */
  24. #define access_ok(type,addr,size)   (1)
  25. #define verify_area(type,addr,size) (0)
  26. #define put_user __put_user
  27. #define get_user __get_user
  28. #if BITS_PER_LONG == 32
  29. #define LDD_KERNEL(ptr) BUG()
  30. #define LDD_USER(ptr) BUG()
  31. #define STD_KERNEL(x, ptr) BUG()
  32. #define STD_USER(x, ptr) BUG()
  33. #else
  34. #define LDD_KERNEL(ptr) __get_kernel_asm("ldd",ptr)
  35. #define LDD_USER(ptr) __get_user_asm("ldd",ptr)
  36. #define STD_KERNEL(x, ptr) __put_kernel_asm("std",x,ptr)
  37. #define STD_USER(x, ptr) __put_user_asm("std",x,ptr)
  38. #endif
  39. /*
  40.  * The exception table contains two values: the first is an address
  41.  * for an instruction that is allowed to fault, and the second is
  42.  * the number of bytes to skip if a fault occurs. We also support in
  43.  * two bit flags: 0x2 tells the exception handler to clear register
  44.  * r9 and 0x1 tells the exception handler to put -EFAULT in r8.
  45.  * This allows us to handle the simple cases for put_user and
  46.  * get_user without having to have .fixup sections.
  47.  */
  48. struct exception_table_entry {
  49. unsigned long addr;  /* address of insn that is allowed to fault.   */
  50. long skip;           /* pcoq skip | r9 clear flag | r8 -EFAULT flag */
  51. };
  52. extern const struct exception_table_entry 
  53.     *search_exception_table(unsigned long addr);
  54. #define __get_user(x,ptr)                               
  55. ({                                                      
  56. register long __gu_err __asm__ ("r8") = 0;      
  57. register long __gu_val __asm__ ("r9") = 0;      
  58. if (segment_eq(get_fs(),KERNEL_DS)) {           
  59.     switch (sizeof(*(ptr))) {                   
  60.     case 1: __get_kernel_asm("ldb",ptr); break; 
  61.     case 2: __get_kernel_asm("ldh",ptr); break; 
  62.     case 4: __get_kernel_asm("ldw",ptr); break; 
  63.     case 8: LDD_KERNEL(ptr); break;
  64.     default: BUG(); break;                      
  65.     }                                           
  66. }                                               
  67. else {                                          
  68.     switch (sizeof(*(ptr))) {                   
  69.     case 1: __get_user_asm("ldb",ptr); break;   
  70.     case 2: __get_user_asm("ldh",ptr); break;   
  71.     case 4: __get_user_asm("ldw",ptr); break;   
  72.     case 8: LDD_USER(ptr);  break;
  73.     default: BUG(); break;                      
  74.     }                                           
  75. }                                               
  76. (x) = (__typeof__(*(ptr))) __gu_val;            
  77. __gu_err;                                       
  78. })
  79. #ifdef __LP64__
  80. #define __get_kernel_asm(ldx,ptr)                       
  81. __asm__("n1:t" ldx "t0(%2),%0n"             
  82. "2:n"
  83. "t.section __ex_table,"a"n"         
  84.  "t.dwordt1bn"                       
  85.  "t.dwordt(2b-1b)+3n"                
  86.  "t.previous"                          
  87. : "=r"(__gu_val), "=r"(__gu_err)        
  88. : "r"(ptr), "1"(__gu_err));
  89. #define __get_user_asm(ldx,ptr)                         
  90. __asm__("n1:t" ldx "t0(%%sr3,%2),%0n"       
  91. "2:n"
  92. "t.section __ex_table,"a"n"         
  93.  "t.dwordt1bn"                       
  94.  "t.dwordt(2b-1b)+3n"                
  95.  "t.previous"                          
  96. : "=r"(__gu_val), "=r"(__gu_err)        
  97. : "r"(ptr), "1"(__gu_err));
  98. #else
  99. #define __get_kernel_asm(ldx,ptr)                       
  100. __asm__("n1:t" ldx "t0(%2),%0n"             
  101. "2:n"
  102. "t.section __ex_table,"a"n"         
  103.  "t.wordt1bn"                        
  104.  "t.wordt(2b-1b)+3n"                 
  105.  "t.previous"                          
  106. : "=r"(__gu_val), "=r"(__gu_err)        
  107. : "r"(ptr), "1"(__gu_err));
  108. #define __get_user_asm(ldx,ptr)                         
  109. __asm__("n1:t" ldx "t0(%%sr3,%2),%0n"       
  110. "2:n"
  111. "t.section __ex_table,"a"n"         
  112.  "t.wordt1bn"                        
  113.  "t.wordt(2b-1b)+3n"                 
  114.  "t.previous"                          
  115. : "=r"(__gu_val), "=r"(__gu_err)        
  116. : "r"(ptr), "1"(__gu_err));
  117. #endif
  118. #define __put_user(x,ptr)                                       
  119. ({
  120. register long __pu_err __asm__ ("r8") = 0;
  121. if (segment_eq(get_fs(),KERNEL_DS)) {                   
  122.     switch (sizeof(*(ptr))) {                           
  123.     case 1: __put_kernel_asm("stb",x,ptr); break;       
  124.     case 2: __put_kernel_asm("sth",x,ptr); break;       
  125.     case 4: __put_kernel_asm("stw",x,ptr); break;       
  126.     case 8: STD_KERNEL(x,ptr); break;
  127.     default: BUG(); break;                              
  128.     }                                                   
  129. }                                                       
  130. else {                                                  
  131.     switch (sizeof(*(ptr))) {                           
  132.     case 1: __put_user_asm("stb",x,ptr); break;         
  133.     case 2: __put_user_asm("sth",x,ptr); break;         
  134.     case 4: __put_user_asm("stw",x,ptr); break;         
  135.     case 8: STD_USER(x,ptr); break;
  136.     default: BUG(); break;                              
  137.     }                                                   
  138. }                                                       
  139. __pu_err;
  140. })
  141. /*
  142.  * The "__put_user/kernel_asm()" macros tell gcc they read from memory
  143.  * instead of writing. This is because they do not write to any memory
  144.  * gcc knows about, so there are no aliasing issues.
  145.  */
  146. #ifdef __LP64__
  147. #define __put_kernel_asm(stx,x,ptr)                         
  148. __asm__ __volatile__ (                              
  149. "n1:t" stx "t%2,0(%1)n"                 
  150. "2:n"     
  151. "t.section __ex_table,"a"n"             
  152.  "t.dwordt1bn"                           
  153.  "t.dwordt(2b-1b)+1n"                    
  154.  "t.previous"                              
  155. : "=r"(__pu_err)                            
  156. : "r"(ptr), "r"(x), "0"(__pu_err))
  157. #define __put_user_asm(stx,x,ptr)                           
  158. __asm__ __volatile__ (                              
  159. "n1:t" stx "t%2,0(%%sr3,%1)n"           
  160. "2:n"     
  161. "t.section __ex_table,"a"n"             
  162.  "t.dwordt1bn"                           
  163.  "t.dwordt(2b-1b)+1n"                    
  164.  "t.previous"                              
  165. : "=r"(__pu_err)                            
  166. : "r"(ptr), "r"(x), "0"(__pu_err))
  167. #else
  168. #define __put_kernel_asm(stx,x,ptr)                         
  169. __asm__ __volatile__ (                              
  170. "n1:t" stx "t%2,0(%1)n"                 
  171. "2:n"     
  172. "t.section __ex_table,"a"n"             
  173.  "t.wordt1bn"                            
  174.  "t.wordt(2b-1b)+1n"                     
  175.  "t.previous"                              
  176. : "=r"(__pu_err)                            
  177. : "r"(ptr), "r"(x), "0"(__pu_err))
  178. #define __put_user_asm(stx,x,ptr)                           
  179. __asm__ __volatile__ (                              
  180. "n1:t" stx "t%2,0(%%sr3,%1)n"           
  181. "2:n"     
  182. "t.section __ex_table,"a"n"             
  183.  "t.wordt1bn"                            
  184.  "t.wordt(2b-1b)+1n"                     
  185.  "t.previous"                              
  186. : "=r"(__pu_err)                            
  187. : "r"(ptr), "r"(x), "0"(__pu_err))
  188. #endif
  189. /*
  190.  * Complex access routines -- external declarations
  191.  */
  192. extern unsigned long lcopy_to_user(void *, const void *, unsigned long);
  193. extern unsigned long lcopy_from_user(void *, const void *, unsigned long);
  194. extern long lstrncpy_from_user(char *, const char *, long);
  195. extern unsigned lclear_user(void *,unsigned long);
  196. extern long lstrnlen_user(const char *,long);
  197. /*
  198.  * Complex access routines -- macros
  199.  */
  200. #define strncpy_from_user lstrncpy_from_user
  201. #define strnlen_user lstrnlen_user
  202. #define strlen_user(str) lstrnlen_user(str, 0x7fffffffL)
  203. #define clear_user lclear_user
  204. #define __clear_user lclear_user
  205. #define copy_from_user lcopy_from_user
  206. #define __copy_from_user lcopy_from_user
  207. #define copy_to_user lcopy_to_user
  208. #define __copy_to_user lcopy_to_user
  209. #endif /* __PARISC_UACCESS_H */