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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: VIS.h,v 1.4 1999/05/25 16:52:50 jj Exp $
  2.  * VIS.h: High speed copy/clear operations utilizing the UltraSparc
  3.  *        Visual Instruction Set.
  4.  *
  5.  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
  6.  * Copyright (C) 1996, 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
  7.  */
  8. /* VIS code can be used for numerous copy/set operation variants.
  9.  * It can be made to work in the kernel, one single instance,
  10.  * for all of memcpy, copy_to_user, and copy_from_user by setting
  11.  * the ASI src/dest globals correctly.  Furthermore it can
  12.  * be used for kernel-->kernel page copies as well, a hook label
  13.  * is put in here just for this purpose.
  14.  *
  15.  * For userland, compiling this without __KERNEL__ defined makes
  16.  * it work just fine as a generic libc bcopy and memcpy.
  17.  * If for userland it is compiled with a 32bit gcc (but you need
  18.  * -Wa,-Av9a), the code will just rely on lower 32bits of
  19.  * IEU registers, if you compile it with 64bit gcc (ie. define
  20.  * __sparc_v9__), the code will use full 64bit.
  21.  */
  22. #ifndef __VIS_H
  23. #define __VIS_H
  24.  
  25. #ifdef __KERNEL__
  26. #include <asm/head.h>
  27. #include <asm/asi.h>
  28. #else
  29. #define ASI_AIUS 0x11 /* Secondary, user */
  30. #define ASI_BLK_AIUS 0x71 /* Secondary, user, blk ld/st */
  31. #define ASI_P 0x80 /* Primary, implicit */
  32. #define ASI_S 0x81 /* Secondary, implicit */
  33. #define ASI_BLK_COMMIT_P 0xe0 /* Primary, blk store commit */
  34. #define ASI_BLK_COMMIT_S 0xe1 /* Secondary, blk store commit */
  35. #define ASI_BLK_P 0xf0 /* Primary, blk ld/st */
  36. #define ASI_BLK_S 0xf1 /* Secondary, blk ld/st */
  37. #define FPRS_FEF 0x04
  38. #endif
  39. /* I'm telling you, they really did this chip right.
  40.  * Perhaps the SunSoft folks should visit some of the
  41.  * people in Sun Microelectronics and start some brain
  42.  * cell exchange program...
  43.  */
  44. #define ASI_BLK_XOR (ASI_P ^ ASI_BLK_P)
  45. /* Well, things get more hairy if we use ASI_AIUS as
  46.  * USER_DS and ASI_P as KERNEL_DS, we'd reach
  47.  * commit block stores this way which is not what we want...
  48.  */
  49. /* ASI_P->ASI_BLK_P && ASI_AIUS->ASI_BLK_AIUS transitions can be done
  50.  * as blkasi = asi | ASI_BLK_OR
  51.  */
  52. #define ASI_BLK_OR (ASI_BLK_P & ~ASI_P)
  53. /* Transition back from ASI_BLK_P->ASI_P && ASI_BLK_AIUS->ASI_AIUS is
  54.  * more complicated:
  55.  * asi = blkasi ^ (blkasi >> 3) ^ ASI_BLK_XOR1
  56.  */
  57. #define ASI_BLK_XOR1 (ASI_BLK_P ^ (ASI_BLK_P >> 3) ^ ASI_P)
  58. #define asi_src %o3
  59. #define asi_dest %o4
  60. #ifdef __KERNEL__
  61. #define ASI_SETSRC_BLK wr asi_src, 0, %asi;
  62. #define ASI_SETSRC_NOBLK wr asi_src, 0, %asi;
  63. #define ASI_SETDST_BLK wr asi_dest, 0, %asi;
  64. #define ASI_SETDST_NOBLK wr asi_dest, 0, %asi;
  65. #define ASIBLK %asi
  66. #define ASINORMAL %asi
  67. #define LDUB lduba
  68. #define LDUH lduha
  69. #define LDUW lduwa
  70. #define LDX ldxa
  71. #define LDD ldda
  72. #define LDDF ldda
  73. #define LDBLK ldda
  74. #define STB stba
  75. #define STH stha
  76. #define STW stwa
  77. #define STD stda
  78. #define STX stxa
  79. #define STDF stda
  80. #define STBLK stda
  81. #else
  82. #define ASI_SETSRC_BLK
  83. #define ASI_SETSRC_NOBLK
  84. #define ASI_SETDST_BLK
  85. #define ASI_SETDST_NOBLK
  86. #define ASI_SETDST_SPECIAL
  87. #define ASIBLK %asi
  88. #define ASINORMAL
  89. #define LDUB ldub
  90. #define LDUH lduh
  91. #define LDUW lduw
  92. #define LDD ldd
  93. #define LDX ldx
  94. #define LDDF ldd
  95. #define LDBLK ldda
  96. #define STB stb
  97. #define STH sth
  98. #define STW stw
  99. #define STD std
  100. #define STX stx
  101. #define STDF std
  102. #define STBLK stda
  103. #endif
  104. #ifdef __KERNEL__
  105. #define REGS_64BIT
  106. #else
  107. #ifndef REGS_64BIT
  108. #ifdef __sparc_v9__
  109. #define REGS_64BIT
  110. #endif
  111. #endif
  112. #endif
  113. #ifndef REGS_64BIT
  114. #define xcc icc
  115. #endif
  116. #endif