inst.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. /******************************************************************************
  2. * arch/ia64/include/asm/xen/inst.h
  3. *
  4. * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
  5. * VA Linux Systems Japan K.K.
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  20. *
  21. */
  22. #include <asm/xen/privop.h>
  23. #define MOV_FROM_IFA(reg) \
  24. movl reg = XSI_IFA; \
  25. ;; \
  26. ld8 reg = [reg]
  27. #define MOV_FROM_ITIR(reg) \
  28. movl reg = XSI_ITIR; \
  29. ;; \
  30. ld8 reg = [reg]
  31. #define MOV_FROM_ISR(reg) \
  32. movl reg = XSI_ISR; \
  33. ;; \
  34. ld8 reg = [reg]
  35. #define MOV_FROM_IHA(reg) \
  36. movl reg = XSI_IHA; \
  37. ;; \
  38. ld8 reg = [reg]
  39. #define MOV_FROM_IPSR(pred, reg) \
  40. (pred) movl reg = XSI_IPSR; \
  41. ;; \
  42. (pred) ld8 reg = [reg]
  43. #define MOV_FROM_IIM(reg) \
  44. movl reg = XSI_IIM; \
  45. ;; \
  46. ld8 reg = [reg]
  47. #define MOV_FROM_IIP(reg) \
  48. movl reg = XSI_IIP; \
  49. ;; \
  50. ld8 reg = [reg]
  51. .macro __MOV_FROM_IVR reg, clob
  52. .ifc "\reg", "r8"
  53. XEN_HYPER_GET_IVR
  54. .exitm
  55. .endif
  56. .ifc "\clob", "r8"
  57. XEN_HYPER_GET_IVR
  58. ;;
  59. mov \reg = r8
  60. .exitm
  61. .endif
  62. mov \clob = r8
  63. ;;
  64. XEN_HYPER_GET_IVR
  65. ;;
  66. mov \reg = r8
  67. ;;
  68. mov r8 = \clob
  69. .endm
  70. #define MOV_FROM_IVR(reg, clob) __MOV_FROM_IVR reg, clob
  71. .macro __MOV_FROM_PSR pred, reg, clob
  72. .ifc "\reg", "r8"
  73. (\pred) XEN_HYPER_GET_PSR;
  74. .exitm
  75. .endif
  76. .ifc "\clob", "r8"
  77. (\pred) XEN_HYPER_GET_PSR
  78. ;;
  79. (\pred) mov \reg = r8
  80. .exitm
  81. .endif
  82. (\pred) mov \clob = r8
  83. (\pred) XEN_HYPER_GET_PSR
  84. ;;
  85. (\pred) mov \reg = r8
  86. (\pred) mov r8 = \clob
  87. .endm
  88. #define MOV_FROM_PSR(pred, reg, clob) __MOV_FROM_PSR pred, reg, clob
  89. #define MOV_TO_IFA(reg, clob) \
  90. movl clob = XSI_IFA; \
  91. ;; \
  92. st8 [clob] = reg \
  93. #define MOV_TO_ITIR(pred, reg, clob) \
  94. (pred) movl clob = XSI_ITIR; \
  95. ;; \
  96. (pred) st8 [clob] = reg
  97. #define MOV_TO_IHA(pred, reg, clob) \
  98. (pred) movl clob = XSI_IHA; \
  99. ;; \
  100. (pred) st8 [clob] = reg
  101. #define MOV_TO_IPSR(pred, reg, clob) \
  102. (pred) movl clob = XSI_IPSR; \
  103. ;; \
  104. (pred) st8 [clob] = reg; \
  105. ;;
  106. #define MOV_TO_IFS(pred, reg, clob) \
  107. (pred) movl clob = XSI_IFS; \
  108. ;; \
  109. (pred) st8 [clob] = reg; \
  110. ;;
  111. #define MOV_TO_IIP(reg, clob) \
  112. movl clob = XSI_IIP; \
  113. ;; \
  114. st8 [clob] = reg
  115. .macro ____MOV_TO_KR kr, reg, clob0, clob1
  116. .ifc "\clob0", "r9"
  117. .error "clob0 \clob0 must not be r9"
  118. .endif
  119. .ifc "\clob1", "r8"
  120. .error "clob1 \clob1 must not be r8"
  121. .endif
  122. .ifnc "\reg", "r9"
  123. .ifnc "\clob1", "r9"
  124. mov \clob1 = r9
  125. .endif
  126. mov r9 = \reg
  127. .endif
  128. .ifnc "\clob0", "r8"
  129. mov \clob0 = r8
  130. .endif
  131. mov r8 = \kr
  132. ;;
  133. XEN_HYPER_SET_KR
  134. .ifnc "\reg", "r9"
  135. .ifnc "\clob1", "r9"
  136. mov r9 = \clob1
  137. .endif
  138. .endif
  139. .ifnc "\clob0", "r8"
  140. mov r8 = \clob0
  141. .endif
  142. .endm
  143. .macro __MOV_TO_KR kr, reg, clob0, clob1
  144. .ifc "\clob0", "r9"
  145. ____MOV_TO_KR \kr, \reg, \clob1, \clob0
  146. .exitm
  147. .endif
  148. .ifc "\clob1", "r8"
  149. ____MOV_TO_KR \kr, \reg, \clob1, \clob0
  150. .exitm
  151. .endif
  152. ____MOV_TO_KR \kr, \reg, \clob0, \clob1
  153. .endm
  154. #define MOV_TO_KR(kr, reg, clob0, clob1) \
  155. __MOV_TO_KR IA64_KR_ ## kr, reg, clob0, clob1
  156. .macro __ITC_I pred, reg, clob
  157. .ifc "\reg", "r8"
  158. (\pred) XEN_HYPER_ITC_I
  159. .exitm
  160. .endif
  161. .ifc "\clob", "r8"
  162. (\pred) mov r8 = \reg
  163. ;;
  164. (\pred) XEN_HYPER_ITC_I
  165. .exitm
  166. .endif
  167. (\pred) mov \clob = r8
  168. (\pred) mov r8 = \reg
  169. ;;
  170. (\pred) XEN_HYPER_ITC_I
  171. ;;
  172. (\pred) mov r8 = \clob
  173. ;;
  174. .endm
  175. #define ITC_I(pred, reg, clob) __ITC_I pred, reg, clob
  176. .macro __ITC_D pred, reg, clob
  177. .ifc "\reg", "r8"
  178. (\pred) XEN_HYPER_ITC_D
  179. ;;
  180. .exitm
  181. .endif
  182. .ifc "\clob", "r8"
  183. (\pred) mov r8 = \reg
  184. ;;
  185. (\pred) XEN_HYPER_ITC_D
  186. ;;
  187. .exitm
  188. .endif
  189. (\pred) mov \clob = r8
  190. (\pred) mov r8 = \reg
  191. ;;
  192. (\pred) XEN_HYPER_ITC_D
  193. ;;
  194. (\pred) mov r8 = \clob
  195. ;;
  196. .endm
  197. #define ITC_D(pred, reg, clob) __ITC_D pred, reg, clob
  198. .macro __ITC_I_AND_D pred_i, pred_d, reg, clob
  199. .ifc "\reg", "r8"
  200. (\pred_i)XEN_HYPER_ITC_I
  201. ;;
  202. (\pred_d)XEN_HYPER_ITC_D
  203. ;;
  204. .exitm
  205. .endif
  206. .ifc "\clob", "r8"
  207. mov r8 = \reg
  208. ;;
  209. (\pred_i)XEN_HYPER_ITC_I
  210. ;;
  211. (\pred_d)XEN_HYPER_ITC_D
  212. ;;
  213. .exitm
  214. .endif
  215. mov \clob = r8
  216. mov r8 = \reg
  217. ;;
  218. (\pred_i)XEN_HYPER_ITC_I
  219. ;;
  220. (\pred_d)XEN_HYPER_ITC_D
  221. ;;
  222. mov r8 = \clob
  223. ;;
  224. .endm
  225. #define ITC_I_AND_D(pred_i, pred_d, reg, clob) \
  226. __ITC_I_AND_D pred_i, pred_d, reg, clob
  227. .macro __THASH pred, reg0, reg1, clob
  228. .ifc "\reg0", "r8"
  229. (\pred) mov r8 = \reg1
  230. (\pred) XEN_HYPER_THASH
  231. .exitm
  232. .endc
  233. .ifc "\reg1", "r8"
  234. (\pred) XEN_HYPER_THASH
  235. ;;
  236. (\pred) mov \reg0 = r8
  237. ;;
  238. .exitm
  239. .endif
  240. .ifc "\clob", "r8"
  241. (\pred) mov r8 = \reg1
  242. (\pred) XEN_HYPER_THASH
  243. ;;
  244. (\pred) mov \reg0 = r8
  245. ;;
  246. .exitm
  247. .endif
  248. (\pred) mov \clob = r8
  249. (\pred) mov r8 = \reg1
  250. (\pred) XEN_HYPER_THASH
  251. ;;
  252. (\pred) mov \reg0 = r8
  253. (\pred) mov r8 = \clob
  254. ;;
  255. .endm
  256. #define THASH(pred, reg0, reg1, clob) __THASH pred, reg0, reg1, clob
  257. #define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1) \
  258. mov clob0 = 1; \
  259. movl clob1 = XSI_PSR_IC; \
  260. ;; \
  261. st4 [clob1] = clob0 \
  262. ;;
  263. #define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1) \
  264. ;; \
  265. srlz.d; \
  266. mov clob1 = 1; \
  267. movl clob0 = XSI_PSR_IC; \
  268. ;; \
  269. st4 [clob0] = clob1
  270. #define RSM_PSR_IC(clob) \
  271. movl clob = XSI_PSR_IC; \
  272. ;; \
  273. st4 [clob] = r0; \
  274. ;;
  275. /* pred will be clobbered */
  276. #define MASK_TO_PEND_OFS (-1)
  277. #define SSM_PSR_I(pred, pred_clob, clob) \
  278. (pred) movl clob = XSI_PSR_I_ADDR \
  279. ;; \
  280. (pred) ld8 clob = [clob] \
  281. ;; \
  282. /* if (pred) vpsr.i = 1 */ \
  283. /* if (pred) (vcpu->vcpu_info->evtchn_upcall_mask)=0 */ \
  284. (pred) st1 [clob] = r0, MASK_TO_PEND_OFS \
  285. ;; \
  286. /* if (vcpu->vcpu_info->evtchn_upcall_pending) */ \
  287. (pred) ld1 clob = [clob] \
  288. ;; \
  289. (pred) cmp.ne.unc pred_clob, p0 = clob, r0 \
  290. ;; \
  291. (pred_clob)XEN_HYPER_SSM_I /* do areal ssm psr.i */
  292. #define RSM_PSR_I(pred, clob0, clob1) \
  293. movl clob0 = XSI_PSR_I_ADDR; \
  294. mov clob1 = 1; \
  295. ;; \
  296. ld8 clob0 = [clob0]; \
  297. ;; \
  298. (pred) st1 [clob0] = clob1
  299. #define RSM_PSR_I_IC(clob0, clob1, clob2) \
  300. movl clob0 = XSI_PSR_I_ADDR; \
  301. movl clob1 = XSI_PSR_IC; \
  302. ;; \
  303. ld8 clob0 = [clob0]; \
  304. mov clob2 = 1; \
  305. ;; \
  306. /* note: clears both vpsr.i and vpsr.ic! */ \
  307. st1 [clob0] = clob2; \
  308. st4 [clob1] = r0; \
  309. ;;
  310. #define RSM_PSR_DT \
  311. XEN_HYPER_RSM_PSR_DT
  312. #define SSM_PSR_DT_AND_SRLZ_I \
  313. XEN_HYPER_SSM_PSR_DT
  314. #define BSW_0(clob0, clob1, clob2) \
  315. ;; \
  316. /* r16-r31 all now hold bank1 values */ \
  317. mov clob2 = ar.unat; \
  318. movl clob0 = XSI_BANK1_R16; \
  319. movl clob1 = XSI_BANK1_R16 + 8; \
  320. ;; \
  321. .mem.offset 0, 0; st8.spill [clob0] = r16, 16; \
  322. .mem.offset 8, 0; st8.spill [clob1] = r17, 16; \
  323. ;; \
  324. .mem.offset 0, 0; st8.spill [clob0] = r18, 16; \
  325. .mem.offset 8, 0; st8.spill [clob1] = r19, 16; \
  326. ;; \
  327. .mem.offset 0, 0; st8.spill [clob0] = r20, 16; \
  328. .mem.offset 8, 0; st8.spill [clob1] = r21, 16; \
  329. ;; \
  330. .mem.offset 0, 0; st8.spill [clob0] = r22, 16; \
  331. .mem.offset 8, 0; st8.spill [clob1] = r23, 16; \
  332. ;; \
  333. .mem.offset 0, 0; st8.spill [clob0] = r24, 16; \
  334. .mem.offset 8, 0; st8.spill [clob1] = r25, 16; \
  335. ;; \
  336. .mem.offset 0, 0; st8.spill [clob0] = r26, 16; \
  337. .mem.offset 8, 0; st8.spill [clob1] = r27, 16; \
  338. ;; \
  339. .mem.offset 0, 0; st8.spill [clob0] = r28, 16; \
  340. .mem.offset 8, 0; st8.spill [clob1] = r29, 16; \
  341. ;; \
  342. .mem.offset 0, 0; st8.spill [clob0] = r30, 16; \
  343. .mem.offset 8, 0; st8.spill [clob1] = r31, 16; \
  344. ;; \
  345. mov clob1 = ar.unat; \
  346. movl clob0 = XSI_B1NAT; \
  347. ;; \
  348. st8 [clob0] = clob1; \
  349. mov ar.unat = clob2; \
  350. movl clob0 = XSI_BANKNUM; \
  351. ;; \
  352. st4 [clob0] = r0
  353. /* FIXME: THIS CODE IS NOT NaT SAFE! */
  354. #define XEN_BSW_1(clob) \
  355. mov clob = ar.unat; \
  356. movl r30 = XSI_B1NAT; \
  357. ;; \
  358. ld8 r30 = [r30]; \
  359. mov r31 = 1; \
  360. ;; \
  361. mov ar.unat = r30; \
  362. movl r30 = XSI_BANKNUM; \
  363. ;; \
  364. st4 [r30] = r31; \
  365. movl r30 = XSI_BANK1_R16; \
  366. movl r31 = XSI_BANK1_R16+8; \
  367. ;; \
  368. ld8.fill r16 = [r30], 16; \
  369. ld8.fill r17 = [r31], 16; \
  370. ;; \
  371. ld8.fill r18 = [r30], 16; \
  372. ld8.fill r19 = [r31], 16; \
  373. ;; \
  374. ld8.fill r20 = [r30], 16; \
  375. ld8.fill r21 = [r31], 16; \
  376. ;; \
  377. ld8.fill r22 = [r30], 16; \
  378. ld8.fill r23 = [r31], 16; \
  379. ;; \
  380. ld8.fill r24 = [r30], 16; \
  381. ld8.fill r25 = [r31], 16; \
  382. ;; \
  383. ld8.fill r26 = [r30], 16; \
  384. ld8.fill r27 = [r31], 16; \
  385. ;; \
  386. ld8.fill r28 = [r30], 16; \
  387. ld8.fill r29 = [r31], 16; \
  388. ;; \
  389. ld8.fill r30 = [r30]; \
  390. ld8.fill r31 = [r31]; \
  391. ;; \
  392. mov ar.unat = clob
  393. #define BSW_1(clob0, clob1) XEN_BSW_1(clob1)
  394. #define COVER \
  395. XEN_HYPER_COVER
  396. #define RFI \
  397. XEN_HYPER_RFI; \
  398. dv_serialize_data