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

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. int __gu_err; 
  22. __typeof(*(ptr)) __gu_val; 
  23. unsigned long __gu_addr; 
  24. __asm__("":"=r" (__gu_val)); 
  25. __gu_addr = (unsigned 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. ".settpushnt" 
  38. ".settnoreordernt" 
  39. insn "t%1,%2nt" 
  40. "1:tmovet%0,$0n" 
  41. ".settpopnt" 
  42. "2:nt" 
  43. ".sectiont.fixup,"ax"n" 
  44. "3:tlit%0,%3nt" 
  45. "movet%1,$0nt" 
  46. "jt2bnt" 
  47. ".previousnt" 
  48. ".sectiont__dbe_table,"a"nt" 
  49. ".wordt1b-4,3bnt" 
  50. ".previous" 
  51. :"=r" (__gu_err), "=r" (__gu_val) 
  52. :"o" (__mp(__gu_addr)), "i" (-EFAULT)); })
  53. extern void __get_dbe_unknown(void);
  54. #define __put_dbe(x,ptr,size) ({ 
  55. int __pu_err; 
  56. __typeof__(*(ptr)) __pu_val; 
  57. unsigned long __pu_addr; 
  58. __pu_val = (x); 
  59. __pu_addr = (unsigned long) (ptr); 
  60. __asm__("":"=r" (__pu_err)); 
  61. switch (size) { 
  62. case 1: __put_dbe_asm("sb"); break; 
  63. case 2: __put_dbe_asm("sh"); break; 
  64. case 4: __put_dbe_asm("sw"); break; 
  65. case 8: __put_dbe_asm("sd"); break; 
  66. default: __put_dbe_unknown(); break; 
  67. } __pu_err; })
  68. #define __put_dbe_asm(insn) 
  69. ({ 
  70. __asm__ __volatile__( 
  71. ".settpushnt" 
  72. ".settnoreordernt" 
  73. insn "t%1,%2nt" 
  74. "1:tmovet%0,$0n" 
  75. ".settpopnt" 
  76. "2:nt" 
  77. ".sectiont.fixup,"ax"n" 
  78. "3:tlit%0,%3nt" 
  79. "jt2bnt" 
  80. ".previousnt" 
  81. ".sectiont__dbe_table,"a"nt" 
  82. ".wordt1b-4,3bnt" 
  83. ".previous" 
  84. :"=r" (__pu_err) 
  85. :"r" (__pu_val), "o" (__mp(__pu_addr)), "i" (-EFAULT)); })
  86. extern void __put_dbe_unknown(void);
  87. #endif /* _ASM_PACCESS_H */