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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1996, 1997, 1998, 1999, 2000 by Ralf Baechle
  7.  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  8.  *
  9.  * Protected memory access.  Used for everything that might take revenge
  10.  * by sending a DBE error like accessing possibly non-existant memory or
  11.  * devices.
  12.  */
  13. #ifndef _ASM_PACCESS_H
  14. #define _ASM_PACCESS_H
  15. #include <linux/errno.h>
  16. #define put_dbe(x,ptr) __put_dbe((x),(ptr),sizeof(*(ptr)))
  17. #define get_dbe(x,ptr) __get_dbe((x),(ptr),sizeof(*(ptr)))
  18. struct __large_pstruct { unsigned long buf[100]; };
  19. #define __mp(x) (*(struct __large_pstruct *)(x))
  20. #define __get_dbe(x,ptr,size) ({ 
  21. long __gu_err; 
  22. __typeof(*(ptr)) __gu_val; 
  23. long __gu_addr; 
  24. __asm__("":"=r" (__gu_val)); 
  25. __gu_addr = (long) (ptr); 
  26. __asm__("":"=r" (__gu_err)); 
  27. switch (size) { 
  28. case 1: __get_dbe_asm("lb"); break; 
  29. case 2: __get_dbe_asm("lh"); break; 
  30. case 4: __get_dbe_asm("lw"); break; 
  31. case 8:  __get_dbe_asm("ld"); break; 
  32. default: __get_dbe_unknown(); break; 
  33. } x = (__typeof__(*(ptr))) __gu_val; __gu_err; })
  34. #define __get_dbe_asm(insn) 
  35. ({ 
  36. __asm__ __volatile__( 
  37. "1:t" insn "t%1,%2nt" 
  38. "movet%0,$0n" 
  39. "2:nt" 
  40. ".sectiont.fixup,"ax"n" 
  41. "3:tlit%0,%3nt" 
  42. "movet%1,$0nt" 
  43. "jt2bnt" 
  44. ".previousnt" 
  45. ".sectiont__dbe_table,"a"nt" 
  46. ".dwordt1b,3bnt" 
  47. ".previous" 
  48. :"=r" (__gu_err), "=r" (__gu_val) 
  49. :"o" (__mp(__gu_addr)), "i" (-EFAULT)); })
  50. extern void __get_dbe_unknown(void);
  51. #define __put_dbe(x,ptr,size) ({ 
  52. long __pu_err; 
  53. __typeof__(*(ptr)) __pu_val; 
  54. long __pu_addr; 
  55. __pu_val = (x); 
  56. __pu_addr = (long) (ptr); 
  57. __asm__("":"=r" (__pu_err)); 
  58. switch (size) { 
  59. case 1: __put_dbe_asm("sb"); break; 
  60. case 2: __put_dbe_asm("sh"); break; 
  61. case 4: __put_dbe_asm("sw"); break; 
  62. case 8: __put_dbe_asm("sd"); break; 
  63. default: __put_dbe_unknown(); break; 
  64. } __pu_err; })
  65. #define __put_dbe_asm(insn) 
  66. ({ 
  67. __asm__ __volatile__( 
  68. "1:t" insn "t%1,%2nt" 
  69. "movet%0,$0n" 
  70. "2:nt" 
  71. ".sectiont.fixup,"ax"n" 
  72. "3:tlit%0,%3nt" 
  73. "jt2bnt" 
  74. ".previousnt" 
  75. ".sectiont__dbe_table,"a"nt" 
  76. ".dwordt1b,3bnt" 
  77. ".previous" 
  78. :"=r" (__pu_err) 
  79. :"r" (__pu_val), "o" (__mp(__pu_addr)), "i" (-EFAULT)); })
  80. extern void __put_dbe_unknown(void);
  81. #endif /* _ASM_PACCESS_H */