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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 1999 Hewlett-Packard (Frank Rowand)
  3.  * Copyright (C) 1999 Philipp Rumpf <prumpf@tux.org>
  4.  * Copyright (C) 1999 SuSE GmbH
  5.  *
  6.  *    This program is free software; you can redistribute it and/or modify
  7.  *    it under the terms of the GNU General Public License as published by
  8.  *    the Free Software Foundation; either version 2, or (at your option)
  9.  *    any later version.
  10.  *
  11.  *    This program is distributed in the hope that it will be useful,
  12.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *    GNU General Public License for more details.
  15.  *
  16.  *    You should have received a copy of the GNU General Public License
  17.  *    along with this program; if not, write to the Free Software
  18.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20. #ifndef _PARISC_ASSEMBLY_H
  21. #define _PARISC_ASSEMBLY_H
  22. #if defined(__LP64__) && defined(__ASSEMBLY__)
  23. /* the 64-bit pa gnu assembler unfortunately defaults to .level 1.1 or 2.0 so
  24.  * work around that for now... */
  25. .level 2.0w
  26. #endif
  27. #include <asm/offset.h>
  28. #include <asm/page.h>
  29. #include <asm/asmregs.h>
  30. sp = 30
  31. gp = 27
  32. ipsw = 22
  33. /*
  34.  * We provide two versions of each macro to convert from physical
  35.  * to virtual and vice versa. The "_r1" versions take one argument
  36.  * register, but trashes r1 to do the conversion. The other
  37.  * version takes two arguments: a src and destination register.
  38.  * However, the source and destination registers can not be
  39.  * the same register.
  40.  */
  41. .macro  tophys  grvirt, grphys
  42. ldil    L%(__PAGE_OFFSET), grphys
  43. sub     grvirt, grphys, grphys
  44. .endm
  45. .macro  tovirt  grphys, grvirt
  46. ldil    L%(__PAGE_OFFSET), grvirt
  47. add     grphys, grvirt, grvirt
  48. .endm
  49. .macro  tophys_r1  gr
  50. ldil    L%(__PAGE_OFFSET), %r1
  51. sub     gr, %r1, gr
  52. .endm
  53. .macro  tovirt_r1  gr
  54. ldil    L%(__PAGE_OFFSET), %r1
  55. add     gr, %r1, gr
  56. .endm
  57. .macro delay value
  58. ldil L%value, 1
  59. ldo R%value(1), 1
  60. addib,UV,n -1,1,.
  61. addib,NUV,n -1,1,.+8
  62. nop
  63. .endm
  64. .macro debug value
  65. .endm
  66. /* Shift Left - note the r and t can NOT be the same! */
  67. .macro shl r, sa, t
  68. dep,z r, 31-sa, 32-sa, t
  69. .endm
  70. /* The PA 2.0 shift left */
  71. .macro shlw r, sa, t
  72. depw,z r, 31-sa, 32-sa, t
  73. .endm
  74. /* And the PA 2.0W shift left */
  75. .macro shld r, sa, t
  76. depd,z r, 63-sa, 64-sa, t
  77. .endm
  78. /* load 32-bit 'value' into 'reg' compensating for the ldil
  79.  * sign-extension when running in wide mode.
  80.  * WARNING!! neither 'value' nor 'reg' can be expressions
  81.  * containing '.'!!!! */
  82. .macro load32 value, reg
  83. ldil L%value, reg
  84. ldo R%value(reg), reg
  85. .endm
  86. #ifdef __LP64__
  87. #define LDREG   ldd
  88. #define STREG   std
  89. #define RP_OFFSET 16
  90. #else
  91. #define LDREG   ldw
  92. #define STREG   stw
  93. #define RP_OFFSET 20
  94. #endif
  95. .macro loadgp
  96. #ifdef __LP64__
  97. ldil L%__gp, %r27
  98. ldo R%__gp(%r27), %r27
  99. #else
  100. ldil L%$global$, %r27
  101. ldo R%$global$(%r27), %r27
  102. #endif
  103. .endm
  104. #define SAVE_SP(r, where) mfsp r, %r1 ! STREG %r1, where
  105. #define REST_SP(r, where) LDREG where, %r1 ! mtsp %r1, r
  106. #define SAVE_CR(r, where) mfctl r, %r1 ! STREG %r1, where
  107. #define REST_CR(r, where) LDREG where, %r1 ! mtctl %r1, r
  108. .macro save_general regs
  109. STREG %r1, PT_GR1 (regs)
  110. STREG %r2, PT_GR2 (regs)
  111. STREG %r3, PT_GR3 (regs)
  112. STREG %r4, PT_GR4 (regs)
  113. STREG %r5, PT_GR5 (regs)
  114. STREG %r6, PT_GR6 (regs)
  115. STREG %r7, PT_GR7 (regs)
  116. STREG %r8, PT_GR8 (regs)
  117. STREG %r9, PT_GR9 (regs)
  118. STREG %r10, PT_GR10(regs)
  119. STREG %r11, PT_GR11(regs)
  120. STREG %r12, PT_GR12(regs)
  121. STREG %r13, PT_GR13(regs)
  122. STREG %r14, PT_GR14(regs)
  123. STREG %r15, PT_GR15(regs)
  124. STREG %r16, PT_GR16(regs)
  125. STREG %r17, PT_GR17(regs)
  126. STREG %r18, PT_GR18(regs)
  127. STREG %r19, PT_GR19(regs)
  128. STREG %r20, PT_GR20(regs)
  129. STREG %r21, PT_GR21(regs)
  130. STREG %r22, PT_GR22(regs)
  131. STREG %r23, PT_GR23(regs)
  132. STREG %r24, PT_GR24(regs)
  133. STREG %r25, PT_GR25(regs)
  134. /* r26 is saved in get_stack and used to preserve a value across virt_map */
  135. STREG %r27, PT_GR27(regs)
  136. STREG %r28, PT_GR28(regs)
  137. /* r29 is saved in get_stack and used to point to saved registers */
  138. /* r30 stack pointer saved in get_stack */
  139. STREG %r31, PT_GR31(regs)
  140. .endm
  141. .macro rest_general regs
  142. /* r1 used as a temp in rest_stack and is restored there */
  143. LDREG PT_GR2 (regs), %r2
  144. LDREG PT_GR3 (regs), %r3
  145. LDREG PT_GR4 (regs), %r4
  146. LDREG PT_GR5 (regs), %r5
  147. LDREG PT_GR6 (regs), %r6
  148. LDREG PT_GR7 (regs), %r7
  149. LDREG PT_GR8 (regs), %r8
  150. LDREG PT_GR9 (regs), %r9
  151. LDREG PT_GR10(regs), %r10
  152. LDREG PT_GR11(regs), %r11
  153. LDREG PT_GR12(regs), %r12
  154. LDREG PT_GR13(regs), %r13
  155. LDREG PT_GR14(regs), %r14
  156. LDREG PT_GR15(regs), %r15
  157. LDREG PT_GR16(regs), %r16
  158. LDREG PT_GR17(regs), %r17
  159. LDREG PT_GR18(regs), %r18
  160. LDREG PT_GR19(regs), %r19
  161. LDREG PT_GR20(regs), %r20
  162. LDREG PT_GR21(regs), %r21
  163. LDREG PT_GR22(regs), %r22
  164. LDREG PT_GR23(regs), %r23
  165. LDREG PT_GR24(regs), %r24
  166. LDREG PT_GR25(regs), %r25
  167. LDREG PT_GR26(regs), %r26
  168. LDREG PT_GR27(regs), %r27
  169. LDREG PT_GR28(regs), %r28
  170. /* r29 points to register save area, and is restored in rest_stack */
  171. /* r30 stack pointer restored in rest_stack */
  172. LDREG PT_GR31(regs), %r31
  173. .endm
  174. .macro save_fp  regs
  175. fstd,ma  %fr0, 8(regs)
  176. fstd,ma  %fr1, 8(regs)
  177. fstd,ma  %fr2, 8(regs)
  178. fstd,ma  %fr3, 8(regs)
  179. fstd,ma  %fr4, 8(regs)
  180. fstd,ma  %fr5, 8(regs)
  181. fstd,ma  %fr6, 8(regs)
  182. fstd,ma  %fr7, 8(regs)
  183. fstd,ma  %fr8, 8(regs)
  184. fstd,ma  %fr9, 8(regs)
  185. fstd,ma %fr10, 8(regs)
  186. fstd,ma %fr11, 8(regs)
  187. fstd,ma %fr12, 8(regs)
  188. fstd,ma %fr13, 8(regs)
  189. fstd,ma %fr14, 8(regs)
  190. fstd,ma %fr15, 8(regs)
  191. fstd,ma %fr16, 8(regs)
  192. fstd,ma %fr17, 8(regs)
  193. fstd,ma %fr18, 8(regs)
  194. fstd,ma %fr19, 8(regs)
  195. fstd,ma %fr20, 8(regs)
  196. fstd,ma %fr21, 8(regs)
  197. fstd,ma %fr22, 8(regs)
  198. fstd,ma %fr23, 8(regs)
  199. fstd,ma %fr24, 8(regs)
  200. fstd,ma %fr25, 8(regs)
  201. fstd,ma %fr26, 8(regs)
  202. fstd,ma %fr27, 8(regs)
  203. fstd,ma %fr28, 8(regs)
  204. fstd,ma %fr29, 8(regs)
  205. fstd,ma %fr30, 8(regs)
  206. fstd %fr31, 0(regs)
  207. .endm
  208. .macro rest_fp  regs
  209. fldd 0(regs),  %fr31
  210. fldd,mb -8(regs),       %fr30
  211. fldd,mb -8(regs),       %fr29
  212. fldd,mb -8(regs),       %fr28
  213. fldd,mb -8(regs),       %fr27
  214. fldd,mb -8(regs),       %fr26
  215. fldd,mb -8(regs),       %fr25
  216. fldd,mb -8(regs),       %fr24
  217. fldd,mb -8(regs),       %fr23
  218. fldd,mb -8(regs),       %fr22
  219. fldd,mb -8(regs),       %fr21
  220. fldd,mb -8(regs),       %fr20
  221. fldd,mb -8(regs),       %fr19
  222. fldd,mb -8(regs),       %fr18
  223. fldd,mb -8(regs),       %fr17
  224. fldd,mb -8(regs),       %fr16
  225. fldd,mb -8(regs),       %fr15
  226. fldd,mb -8(regs),       %fr14
  227. fldd,mb -8(regs),       %fr13
  228. fldd,mb -8(regs),       %fr12
  229. fldd,mb -8(regs),       %fr11
  230. fldd,mb -8(regs),       %fr10
  231. fldd,mb -8(regs),       %fr9
  232. fldd,mb -8(regs),       %fr8
  233. fldd,mb -8(regs),       %fr7
  234. fldd,mb -8(regs),       %fr6
  235. fldd,mb -8(regs),       %fr5
  236. fldd,mb -8(regs),       %fr4
  237. fldd,mb -8(regs),       %fr3
  238. fldd,mb -8(regs),       %fr2
  239. fldd,mb -8(regs),       %fr1
  240. fldd,mb -8(regs),       %fr0
  241. .endm
  242. #ifdef __LP64__
  243. .macro callee_save
  244. std,ma   %r3, 144(%r30)
  245. mfctl   %cr27, %r3
  246. std   %r4, -136(%r30)
  247. std   %r5, -128(%r30)
  248. std   %r6, -120(%r30)
  249. std   %r7, -112(%r30)
  250. std   %r8, -104(%r30)
  251. std   %r9,  -96(%r30)
  252. std  %r10,  -88(%r30)
  253. std  %r11,  -80(%r30)
  254. std  %r12,  -72(%r30)
  255. std  %r13,  -64(%r30)
  256. std  %r14,  -56(%r30)
  257. std  %r15,  -48(%r30)
  258. std  %r16,  -40(%r30)
  259. std  %r17,  -32(%r30)
  260. std  %r18,  -24(%r30)
  261. std   %r3,  -16(%r30)
  262. .endm
  263. .macro callee_rest
  264. ldd  -16(%r30),    %r3
  265. ldd  -24(%r30),   %r18
  266. ldd  -32(%r30),   %r17
  267. ldd  -40(%r30),   %r16
  268. ldd  -48(%r30),   %r15
  269. ldd  -56(%r30),   %r14
  270. ldd  -64(%r30),   %r13
  271. ldd  -72(%r30),   %r12
  272. ldd  -80(%r30),   %r11
  273. ldd  -88(%r30),   %r10
  274. ldd  -96(%r30),    %r9
  275. ldd -104(%r30),    %r8
  276. ldd -112(%r30),    %r7
  277. ldd -120(%r30),    %r6
  278. ldd -128(%r30),    %r5
  279. ldd -136(%r30),    %r4
  280. mtctl %r3, %cr27
  281. ldd,mb -144(%r30),    %r3
  282. .endm
  283. #else /* ! __LP64__ */
  284. .macro callee_save
  285. stw,ma  %r3, 128(%r30)
  286. mfctl  %cr27, %r3
  287. stw  %r4, -124(%r30)
  288. stw  %r5, -120(%r30)
  289. stw  %r6, -116(%r30)
  290. stw  %r7, -112(%r30)
  291. stw  %r8, -108(%r30)
  292. stw  %r9, -104(%r30)
  293. stw  %r10, -100(%r30)
  294. stw  %r11,  -96(%r30)
  295. stw  %r12,  -92(%r30)
  296. stw  %r13,  -88(%r30)
  297. stw  %r14,  -84(%r30)
  298. stw  %r15,  -80(%r30)
  299. stw  %r16,  -76(%r30)
  300. stw  %r17,  -72(%r30)
  301. stw  %r18,  -68(%r30)
  302. stw   %r3,  -64(%r30)
  303. .endm
  304. .macro callee_rest
  305. ldw  -64(%r30),    %r3
  306. ldw  -68(%r30),   %r18
  307. ldw  -72(%r30),   %r17
  308. ldw  -76(%r30),   %r16
  309. ldw  -80(%r30),   %r15
  310. ldw  -84(%r30),   %r14
  311. ldw  -88(%r30),   %r13
  312. ldw  -92(%r30),   %r12
  313. ldw  -96(%r30),   %r11
  314. ldw -100(%r30),   %r10
  315. ldw -104(%r30),   %r9
  316. ldw -108(%r30),   %r8
  317. ldw -112(%r30),   %r7
  318. ldw -116(%r30),   %r6
  319. ldw -120(%r30),   %r5
  320. ldw -124(%r30),   %r4
  321. mtctl %r3, %cr27
  322. ldw,mb -128(%r30),   %r3
  323. .endm
  324. #endif /* ! __LP64__ */
  325. .macro save_specials regs
  326. SAVE_SP  (%sr0, PT_SR0 (regs))
  327. SAVE_SP  (%sr1, PT_SR1 (regs))
  328. SAVE_SP  (%sr2, PT_SR2 (regs))
  329. SAVE_SP  (%sr3, PT_SR3 (regs))
  330. SAVE_SP  (%sr4, PT_SR4 (regs))
  331. SAVE_SP  (%sr5, PT_SR5 (regs))
  332. SAVE_SP  (%sr6, PT_SR6 (regs))
  333. SAVE_SP  (%sr7, PT_SR7 (regs))
  334. SAVE_CR  (%cr17, PT_IASQ0(regs))
  335. mtctl  %r0, %cr17
  336. SAVE_CR  (%cr17, PT_IASQ1(regs))
  337. SAVE_CR  (%cr18, PT_IAOQ0(regs))
  338. mtctl  %r0, %cr18
  339. SAVE_CR  (%cr18, PT_IAOQ1(regs))
  340. #ifdef __LP64__
  341. /* cr11 (sar) is a funny one.  5 bits on PA1.1 and 6 bit on PA2.0
  342.  * For PA2.0 mtsar or mtctl always write 6 bits, but mfctl only
  343.  * reads 5 bits.  Use mfctl,w to read all six bits.  Otherwise
  344.  * we loose the 6th bit on a save/restore over interrupt.
  345.  */
  346. mfctl,w  %cr11, %r1
  347. STREG    %r1, PT_SAR (regs)
  348. #else
  349. SAVE_CR  (%cr11, PT_SAR  (regs))
  350. #endif
  351. SAVE_CR  (%cr19, PT_IIR  (regs))
  352. /*
  353.  * Code immediately following this macro (in intr_save) relies
  354.  * on r8 containing ipsw.
  355.  */
  356. mfctl    %cr22, %r8
  357. STREG    %r8,   PT_PSW(regs)
  358. .endm
  359. .macro rest_specials regs
  360. REST_SP  (%sr0, PT_SR0 (regs))
  361. REST_SP  (%sr1, PT_SR1 (regs))
  362. REST_SP  (%sr2, PT_SR2 (regs))
  363. REST_SP  (%sr3, PT_SR3 (regs))
  364. REST_SP  (%sr4, PT_SR4 (regs))
  365. REST_SP  (%sr5, PT_SR5 (regs))
  366. REST_SP  (%sr6, PT_SR6 (regs))
  367. REST_SP  (%sr7, PT_SR7 (regs))
  368. REST_CR (%cr17, PT_IASQ0(regs))
  369. REST_CR (%cr17, PT_IASQ1(regs))
  370. REST_CR (%cr18, PT_IAOQ0(regs))
  371. REST_CR (%cr18, PT_IAOQ1(regs))
  372. REST_CR (%cr11, PT_SAR (regs))
  373. REST_CR (%cr22, PT_PSW (regs))
  374. .endm
  375. #endif