assembly.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

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. #if __PAGE_OFFSET == 0xc0000000
  34. .macro tophys gr
  35. zdep gr, 31, 30, gr
  36. .endm
  37. .macro tovirt gr
  38. depi 3,1,2,gr
  39. .endm
  40. #else
  41. #error unknown __PAGE_OFFSET
  42. #endif
  43. .macro delay value
  44. ldil L%value, 1
  45. ldo R%value(1), 1
  46. addib,UV,n -1,1,.
  47. addib,NUV,n -1,1,.+8
  48. nop
  49. .endm
  50. .macro debug value
  51. .endm
  52. #ifdef __LP64__
  53. # define LDIL_FIXUP(reg) depdi 0,31,32,reg
  54. #else
  55. # define LDIL_FIXUP(reg)
  56. #endif
  57. /* load 32-bit 'value' into 'reg' compensating for the ldil
  58.  * sign-extension when running in wide mode.
  59.  * WARNING!! neither 'value' nor 'reg' can be expressions
  60.  * containing '.'!!!! */
  61. .macro load32 value, reg
  62. ldil L%value, reg
  63. ldo R%value(reg), reg
  64. LDIL_FIXUP(reg)
  65. .endm
  66. #ifdef __LP64__
  67. #define LDREG   ldd
  68. #define STREG   std
  69. #define RP_OFFSET 16
  70. #else
  71. #define LDREG   ldw
  72. #define STREG   stw
  73. #define RP_OFFSET 20
  74. #endif
  75. .macro loadgp
  76. #ifdef __LP64__
  77. ldil L%__gp, %r27
  78. ldo R%__gp(%r27), %r27
  79. LDIL_FIXUP(%r27)
  80. #else
  81. ldil L%$global$, %r27
  82. ldo R%$global$(%r27), %r27
  83. #endif
  84. .endm
  85. #define SAVE_SP(r, where) mfsp r, %r1 ! STREG %r1, where
  86. #define REST_SP(r, where) LDREG where, %r1 ! mtsp %r1, r
  87. #define SAVE_CR(r, where) mfctl r, %r1 ! STREG %r1, where
  88. #define REST_CR(r, where) LDREG where, %r1 ! mtctl %r1, r
  89. .macro save_general regs
  90. STREG %r2, PT_GR2 (regs)
  91. STREG %r3, PT_GR3 (regs)
  92. STREG %r4, PT_GR4 (regs)
  93. STREG %r5, PT_GR5 (regs)
  94. STREG %r6, PT_GR6 (regs)
  95. STREG %r7, PT_GR7 (regs)
  96. STREG %r8, PT_GR8 (regs)
  97. STREG %r9, PT_GR9 (regs)
  98. STREG %r10, PT_GR10(regs)
  99. STREG %r11, PT_GR11(regs)
  100. STREG %r12, PT_GR12(regs)
  101. STREG %r13, PT_GR13(regs)
  102. STREG %r14, PT_GR14(regs)
  103. STREG %r15, PT_GR15(regs)
  104. STREG %r16, PT_GR16(regs)
  105. STREG %r17, PT_GR17(regs)
  106. STREG %r18, PT_GR18(regs)
  107. STREG %r19, PT_GR19(regs)
  108. STREG %r20, PT_GR20(regs)
  109. STREG %r21, PT_GR21(regs)
  110. STREG %r22, PT_GR22(regs)
  111. STREG %r23, PT_GR23(regs)
  112. STREG %r24, PT_GR24(regs)
  113. STREG %r25, PT_GR25(regs)
  114. /* r26 is clobbered by cr19 and assumed to be saved before hand */
  115. STREG %r27, PT_GR27(regs)
  116. STREG %r28, PT_GR28(regs)
  117. /* r29 is already saved and points to PT_xxx struct */
  118. /* r30 stack pointer saved in get_stack */
  119. STREG %r31, PT_GR31(regs)
  120. .endm
  121. .macro rest_general regs
  122. LDREG PT_GR2 (regs), %r2
  123. LDREG PT_GR3 (regs), %r3
  124. LDREG PT_GR4 (regs), %r4
  125. LDREG PT_GR5 (regs), %r5
  126. LDREG PT_GR6 (regs), %r6
  127. LDREG PT_GR7 (regs), %r7
  128. LDREG PT_GR8 (regs), %r8
  129. LDREG PT_GR9 (regs), %r9
  130. LDREG PT_GR10(regs), %r10
  131. LDREG PT_GR11(regs), %r11
  132. LDREG PT_GR12(regs), %r12
  133. LDREG PT_GR13(regs), %r13
  134. LDREG PT_GR14(regs), %r14
  135. LDREG PT_GR15(regs), %r15
  136. LDREG PT_GR16(regs), %r16
  137. LDREG PT_GR17(regs), %r17
  138. LDREG PT_GR18(regs), %r18
  139. LDREG PT_GR19(regs), %r19
  140. LDREG PT_GR20(regs), %r20
  141. LDREG PT_GR21(regs), %r21
  142. LDREG PT_GR22(regs), %r22
  143. LDREG PT_GR23(regs), %r23
  144. LDREG PT_GR24(regs), %r24
  145. LDREG PT_GR25(regs), %r25
  146. LDREG PT_GR26(regs), %r26
  147. LDREG PT_GR27(regs), %r27
  148. LDREG PT_GR28(regs), %r28
  149. /* r30 stack pointer restored in rest_stack */
  150. LDREG PT_GR31(regs), %r31
  151. .endm
  152. .macro save_fp  regs
  153. fstd,ma  %fr0, 8(regs)
  154. fstd,ma  %fr1, 8(regs)
  155. fstd,ma  %fr2, 8(regs)
  156. fstd,ma  %fr3, 8(regs)
  157. fstd,ma  %fr4, 8(regs)
  158. fstd,ma  %fr5, 8(regs)
  159. fstd,ma  %fr6, 8(regs)
  160. fstd,ma  %fr7, 8(regs)
  161. fstd,ma  %fr8, 8(regs)
  162. fstd,ma  %fr9, 8(regs)
  163. fstd,ma %fr10, 8(regs)
  164. fstd,ma %fr11, 8(regs)
  165. fstd,ma %fr12, 8(regs)
  166. fstd,ma %fr13, 8(regs)
  167. fstd,ma %fr14, 8(regs)
  168. fstd,ma %fr15, 8(regs)
  169. fstd,ma %fr16, 8(regs)
  170. fstd,ma %fr17, 8(regs)
  171. fstd,ma %fr18, 8(regs)
  172. fstd,ma %fr19, 8(regs)
  173. fstd,ma %fr20, 8(regs)
  174. fstd,ma %fr21, 8(regs)
  175. fstd,ma %fr22, 8(regs)
  176. fstd,ma %fr23, 8(regs)
  177. fstd,ma %fr24, 8(regs)
  178. fstd,ma %fr25, 8(regs)
  179. fstd,ma %fr26, 8(regs)
  180. fstd,ma %fr27, 8(regs)
  181. fstd,ma %fr28, 8(regs)
  182. fstd,ma %fr29, 8(regs)
  183. fstd,ma %fr30, 8(regs)
  184. fstd %fr31, 0(regs)
  185. .endm
  186. .macro rest_fp  regs
  187. fldd 0(regs),  %fr31
  188. fldd,mb -8(regs),       %fr30
  189. fldd,mb -8(regs),       %fr29
  190. fldd,mb -8(regs),       %fr28
  191. fldd,mb -8(regs),       %fr27
  192. fldd,mb -8(regs),       %fr26
  193. fldd,mb -8(regs),       %fr25
  194. fldd,mb -8(regs),       %fr24
  195. fldd,mb -8(regs),       %fr23
  196. fldd,mb -8(regs),       %fr22
  197. fldd,mb -8(regs),       %fr21
  198. fldd,mb -8(regs),       %fr20
  199. fldd,mb -8(regs),       %fr19
  200. fldd,mb -8(regs),       %fr18
  201. fldd,mb -8(regs),       %fr17
  202. fldd,mb -8(regs),       %fr16
  203. fldd,mb -8(regs),       %fr15
  204. fldd,mb -8(regs),       %fr14
  205. fldd,mb -8(regs),       %fr13
  206. fldd,mb -8(regs),       %fr12
  207. fldd,mb -8(regs),       %fr11
  208. fldd,mb -8(regs),       %fr10
  209. fldd,mb -8(regs),       %fr9
  210. fldd,mb -8(regs),       %fr8
  211. fldd,mb -8(regs),       %fr7
  212. fldd,mb -8(regs),       %fr6
  213. fldd,mb -8(regs),       %fr5
  214. fldd,mb -8(regs),       %fr4
  215. fldd,mb -8(regs),       %fr3
  216. fldd,mb -8(regs),       %fr2
  217. fldd,mb -8(regs),       %fr1
  218. fldd,mb -8(regs),       %fr0
  219. .endm
  220. #ifdef __LP64__
  221. .macro callee_save
  222. ldo 144(%r30), %r30
  223. std   %r3, -144(%r30)
  224. std   %r4, -136(%r30)
  225. std   %r5, -128(%r30)
  226. std   %r6, -120(%r30)
  227. std   %r7, -112(%r30)
  228. std   %r8, -104(%r30)
  229. std   %r9,  -96(%r30)
  230. std  %r10,  -88(%r30)
  231. std  %r11,  -80(%r30)
  232. std  %r12,  -72(%r30)
  233. std  %r13,  -64(%r30)
  234. std  %r14,  -56(%r30)
  235. std  %r15,  -48(%r30)
  236. std  %r16,  -40(%r30)
  237. std  %r17,  -32(%r30)
  238. std  %r18,  -24(%r30)
  239. .endm
  240. .macro callee_rest
  241. ldd  -24(%r30),   %r18
  242. ldd  -32(%r30),   %r17
  243. ldd  -40(%r30),   %r16
  244. ldd  -48(%r30),   %r15
  245. ldd  -56(%r30),   %r14
  246. ldd  -64(%r30),   %r13
  247. ldd  -72(%r30),   %r12
  248. ldd  -80(%r30),   %r11
  249. ldd  -88(%r30),   %r10
  250. ldd  -96(%r30),    %r9
  251. ldd -104(%r30),    %r8
  252. ldd -112(%r30),    %r7
  253. ldd -120(%r30),    %r6
  254. ldd -128(%r30),    %r5
  255. ldd -136(%r30),    %r4
  256. ldd -144(%r30),    %r3
  257. ldo -144(%r30),   %r30
  258. .endm
  259. #else /* __LP64__ */
  260. .macro callee_save
  261. ldo 128(30), 30
  262. stw  3, -128(30)
  263. stw  4, -124(30)
  264. stw  5, -120(30)
  265. stw  6, -116(30)
  266. stw  7, -112(30)
  267. stw  8, -108(30)
  268. stw  9, -104(30)
  269. stw  10, -100(30)
  270. stw  11,  -96(30)
  271. stw  12,  -92(30)
  272. stw  13,  -88(30)
  273. stw  14,  -84(30)
  274. stw  15,  -80(30)
  275. stw  16,  -76(30)
  276. stw  17,  -72(30)
  277. stw  18,  -68(30)
  278. .endm
  279. .macro callee_rest
  280. ldw  -68(30),   18
  281. ldw  -72(30),   17
  282. ldw  -76(30),   16
  283. ldw  -80(30),   15
  284. ldw  -84(30),   14
  285. ldw  -88(30),   13
  286. ldw  -92(30),   12
  287. ldw  -96(30),   11
  288. ldw -100(30),   10
  289. ldw -104(30),    9
  290. ldw -108(30),    8
  291. ldw -112(30),    7
  292. ldw -116(30),    6
  293. ldw -120(30),    5
  294. ldw -124(30),    4
  295. ldw -128(30),    3
  296. ldo -128(30),   30
  297. .endm
  298. #endif /* __LP64__ */
  299. .macro save_specials regs
  300. SAVE_SP  (%sr0, PT_SR0 (regs))
  301. SAVE_SP  (%sr1, PT_SR1 (regs))
  302. SAVE_SP  (%sr2, PT_SR2 (regs))
  303. SAVE_SP  (%sr3, PT_SR3 (regs))
  304. SAVE_SP  (%sr4, PT_SR4 (regs))
  305. SAVE_SP  (%sr5, PT_SR5 (regs))
  306. SAVE_SP  (%sr6, PT_SR6 (regs))
  307. SAVE_SP  (%sr7, PT_SR7 (regs))
  308. SAVE_CR  (%cr17, PT_IASQ0(regs))
  309. mtctl  %r0, %cr17
  310. SAVE_CR  (%cr17, PT_IASQ1(regs))
  311. SAVE_CR  (%cr18, PT_IAOQ0(regs))
  312. mtctl  %r0, %cr18
  313. SAVE_CR  (%cr18, PT_IAOQ1(regs))
  314. SAVE_CR  (%cr11, PT_SAR  (regs))
  315. SAVE_CR  (%cr22, PT_PSW  (regs))
  316. SAVE_CR  (%cr19, PT_IIR  (regs))
  317. SAVE_CR  (%cr28, PT_GR1  (regs))
  318. SAVE_CR  (%cr31, PT_GR29 (regs))
  319. STREG %r26, PT_GR26 (regs)
  320. mfctl %cr29, %r26
  321. .endm
  322. .macro rest_specials regs
  323. REST_SP  (%sr0, PT_SR0 (regs))
  324. REST_SP  (%sr1, PT_SR1 (regs))
  325. REST_SP  (%sr2, PT_SR2 (regs))
  326. REST_SP  (%sr3, PT_SR3 (regs))
  327. REST_SP  (%sr4, PT_SR4 (regs))
  328. REST_SP  (%sr5, PT_SR5 (regs))
  329. REST_SP  (%sr6, PT_SR6 (regs))
  330. REST_SP  (%sr7, PT_SR7 (regs))
  331. REST_CR (%cr17, PT_IASQ0(regs))
  332. REST_CR (%cr17, PT_IASQ1(regs))
  333. REST_CR (%cr18, PT_IAOQ0(regs))
  334. REST_CR (%cr18, PT_IAOQ1(regs))
  335. REST_CR (%cr11, PT_SAR (regs))
  336. REST_CR (%cr22, PT_PSW (regs))
  337. .endm
  338. #endif