optvfault.S 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. /*
  2. * arch/ia64/vmx/optvfault.S
  3. * optimize virtualization fault handler
  4. *
  5. * Copyright (C) 2006 Intel Co
  6. * Xuefei Xu (Anthony Xu) <anthony.xu@intel.com>
  7. */
  8. #include <asm/asmmacro.h>
  9. #include <asm/processor.h>
  10. #include "vti.h"
  11. #include "asm-offsets.h"
  12. #define ACCE_MOV_FROM_AR
  13. #define ACCE_MOV_FROM_RR
  14. #define ACCE_MOV_TO_RR
  15. #define ACCE_RSM
  16. #define ACCE_SSM
  17. #define ACCE_MOV_TO_PSR
  18. #define ACCE_THASH
  19. //mov r1=ar3
  20. GLOBAL_ENTRY(kvm_asm_mov_from_ar)
  21. #ifndef ACCE_MOV_FROM_AR
  22. br.many kvm_virtualization_fault_back
  23. #endif
  24. add r18=VMM_VCPU_ITC_OFS_OFFSET, r21
  25. add r16=VMM_VCPU_LAST_ITC_OFFSET,r21
  26. extr.u r17=r25,6,7
  27. ;;
  28. ld8 r18=[r18]
  29. mov r19=ar.itc
  30. mov r24=b0
  31. ;;
  32. add r19=r19,r18
  33. addl r20=@gprel(asm_mov_to_reg),gp
  34. ;;
  35. st8 [r16] = r19
  36. adds r30=kvm_resume_to_guest-asm_mov_to_reg,r20
  37. shladd r17=r17,4,r20
  38. ;;
  39. mov b0=r17
  40. br.sptk.few b0
  41. ;;
  42. END(kvm_asm_mov_from_ar)
  43. // mov r1=rr[r3]
  44. GLOBAL_ENTRY(kvm_asm_mov_from_rr)
  45. #ifndef ACCE_MOV_FROM_RR
  46. br.many kvm_virtualization_fault_back
  47. #endif
  48. extr.u r16=r25,20,7
  49. extr.u r17=r25,6,7
  50. addl r20=@gprel(asm_mov_from_reg),gp
  51. ;;
  52. adds r30=kvm_asm_mov_from_rr_back_1-asm_mov_from_reg,r20
  53. shladd r16=r16,4,r20
  54. mov r24=b0
  55. ;;
  56. add r27=VMM_VCPU_VRR0_OFFSET,r21
  57. mov b0=r16
  58. br.many b0
  59. ;;
  60. kvm_asm_mov_from_rr_back_1:
  61. adds r30=kvm_resume_to_guest-asm_mov_from_reg,r20
  62. adds r22=asm_mov_to_reg-asm_mov_from_reg,r20
  63. shr.u r26=r19,61
  64. ;;
  65. shladd r17=r17,4,r22
  66. shladd r27=r26,3,r27
  67. ;;
  68. ld8 r19=[r27]
  69. mov b0=r17
  70. br.many b0
  71. END(kvm_asm_mov_from_rr)
  72. // mov rr[r3]=r2
  73. GLOBAL_ENTRY(kvm_asm_mov_to_rr)
  74. #ifndef ACCE_MOV_TO_RR
  75. br.many kvm_virtualization_fault_back
  76. #endif
  77. extr.u r16=r25,20,7
  78. extr.u r17=r25,13,7
  79. addl r20=@gprel(asm_mov_from_reg),gp
  80. ;;
  81. adds r30=kvm_asm_mov_to_rr_back_1-asm_mov_from_reg,r20
  82. shladd r16=r16,4,r20
  83. mov r22=b0
  84. ;;
  85. add r27=VMM_VCPU_VRR0_OFFSET,r21
  86. mov b0=r16
  87. br.many b0
  88. ;;
  89. kvm_asm_mov_to_rr_back_1:
  90. adds r30=kvm_asm_mov_to_rr_back_2-asm_mov_from_reg,r20
  91. shr.u r23=r19,61
  92. shladd r17=r17,4,r20
  93. ;;
  94. //if rr6, go back
  95. cmp.eq p6,p0=6,r23
  96. mov b0=r22
  97. (p6) br.cond.dpnt.many kvm_virtualization_fault_back
  98. ;;
  99. mov r28=r19
  100. mov b0=r17
  101. br.many b0
  102. kvm_asm_mov_to_rr_back_2:
  103. adds r30=kvm_resume_to_guest-asm_mov_from_reg,r20
  104. shladd r27=r23,3,r27
  105. ;; // vrr.rid<<4 |0xe
  106. st8 [r27]=r19
  107. mov b0=r30
  108. ;;
  109. extr.u r16=r19,8,26
  110. extr.u r18 =r19,2,6
  111. mov r17 =0xe
  112. ;;
  113. shladd r16 = r16, 4, r17
  114. extr.u r19 =r19,0,8
  115. ;;
  116. shl r16 = r16,8
  117. ;;
  118. add r19 = r19, r16
  119. ;; //set ve 1
  120. dep r19=-1,r19,0,1
  121. cmp.lt p6,p0=14,r18
  122. ;;
  123. (p6) mov r18=14
  124. ;;
  125. (p6) dep r19=r18,r19,2,6
  126. ;;
  127. cmp.eq p6,p0=0,r23
  128. ;;
  129. cmp.eq.or p6,p0=4,r23
  130. ;;
  131. adds r16=VMM_VCPU_MODE_FLAGS_OFFSET,r21
  132. (p6) adds r17=VMM_VCPU_META_SAVED_RR0_OFFSET,r21
  133. ;;
  134. ld4 r16=[r16]
  135. cmp.eq p7,p0=r0,r0
  136. (p6) shladd r17=r23,1,r17
  137. ;;
  138. (p6) st8 [r17]=r19
  139. (p6) tbit.nz p6,p7=r16,0
  140. ;;
  141. (p7) mov rr[r28]=r19
  142. mov r24=r22
  143. br.many b0
  144. END(kvm_asm_mov_to_rr)
  145. //rsm
  146. GLOBAL_ENTRY(kvm_asm_rsm)
  147. #ifndef ACCE_RSM
  148. br.many kvm_virtualization_fault_back
  149. #endif
  150. add r16=VMM_VPD_BASE_OFFSET,r21
  151. extr.u r26=r25,6,21
  152. extr.u r27=r25,31,2
  153. ;;
  154. ld8 r16=[r16]
  155. extr.u r28=r25,36,1
  156. dep r26=r27,r26,21,2
  157. ;;
  158. add r17=VPD_VPSR_START_OFFSET,r16
  159. add r22=VMM_VCPU_MODE_FLAGS_OFFSET,r21
  160. //r26 is imm24
  161. dep r26=r28,r26,23,1
  162. ;;
  163. ld8 r18=[r17]
  164. movl r28=IA64_PSR_IC+IA64_PSR_I+IA64_PSR_DT+IA64_PSR_SI
  165. ld4 r23=[r22]
  166. sub r27=-1,r26
  167. mov r24=b0
  168. ;;
  169. mov r20=cr.ipsr
  170. or r28=r27,r28
  171. and r19=r18,r27
  172. ;;
  173. st8 [r17]=r19
  174. and r20=r20,r28
  175. /* Comment it out due to short of fp lazy alorgithm support
  176. adds r27=IA64_VCPU_FP_PSR_OFFSET,r21
  177. ;;
  178. ld8 r27=[r27]
  179. ;;
  180. tbit.nz p8,p0= r27,IA64_PSR_DFH_BIT
  181. ;;
  182. (p8) dep r20=-1,r20,IA64_PSR_DFH_BIT,1
  183. */
  184. ;;
  185. mov cr.ipsr=r20
  186. tbit.nz p6,p0=r23,0
  187. ;;
  188. tbit.z.or p6,p0=r26,IA64_PSR_DT_BIT
  189. (p6) br.dptk kvm_resume_to_guest
  190. ;;
  191. add r26=VMM_VCPU_META_RR0_OFFSET,r21
  192. add r27=VMM_VCPU_META_RR0_OFFSET+8,r21
  193. dep r23=-1,r23,0,1
  194. ;;
  195. ld8 r26=[r26]
  196. ld8 r27=[r27]
  197. st4 [r22]=r23
  198. dep.z r28=4,61,3
  199. ;;
  200. mov rr[r0]=r26
  201. ;;
  202. mov rr[r28]=r27
  203. ;;
  204. srlz.d
  205. br.many kvm_resume_to_guest
  206. END(kvm_asm_rsm)
  207. //ssm
  208. GLOBAL_ENTRY(kvm_asm_ssm)
  209. #ifndef ACCE_SSM
  210. br.many kvm_virtualization_fault_back
  211. #endif
  212. add r16=VMM_VPD_BASE_OFFSET,r21
  213. extr.u r26=r25,6,21
  214. extr.u r27=r25,31,2
  215. ;;
  216. ld8 r16=[r16]
  217. extr.u r28=r25,36,1
  218. dep r26=r27,r26,21,2
  219. ;; //r26 is imm24
  220. add r27=VPD_VPSR_START_OFFSET,r16
  221. dep r26=r28,r26,23,1
  222. ;; //r19 vpsr
  223. ld8 r29=[r27]
  224. mov r24=b0
  225. ;;
  226. add r22=VMM_VCPU_MODE_FLAGS_OFFSET,r21
  227. mov r20=cr.ipsr
  228. or r19=r29,r26
  229. ;;
  230. ld4 r23=[r22]
  231. st8 [r27]=r19
  232. or r20=r20,r26
  233. ;;
  234. mov cr.ipsr=r20
  235. movl r28=IA64_PSR_DT+IA64_PSR_RT+IA64_PSR_IT
  236. ;;
  237. and r19=r28,r19
  238. tbit.z p6,p0=r23,0
  239. ;;
  240. cmp.ne.or p6,p0=r28,r19
  241. (p6) br.dptk kvm_asm_ssm_1
  242. ;;
  243. add r26=VMM_VCPU_META_SAVED_RR0_OFFSET,r21
  244. add r27=VMM_VCPU_META_SAVED_RR0_OFFSET+8,r21
  245. dep r23=0,r23,0,1
  246. ;;
  247. ld8 r26=[r26]
  248. ld8 r27=[r27]
  249. st4 [r22]=r23
  250. dep.z r28=4,61,3
  251. ;;
  252. mov rr[r0]=r26
  253. ;;
  254. mov rr[r28]=r27
  255. ;;
  256. srlz.d
  257. ;;
  258. kvm_asm_ssm_1:
  259. tbit.nz p6,p0=r29,IA64_PSR_I_BIT
  260. ;;
  261. tbit.z.or p6,p0=r19,IA64_PSR_I_BIT
  262. (p6) br.dptk kvm_resume_to_guest
  263. ;;
  264. add r29=VPD_VTPR_START_OFFSET,r16
  265. add r30=VPD_VHPI_START_OFFSET,r16
  266. ;;
  267. ld8 r29=[r29]
  268. ld8 r30=[r30]
  269. ;;
  270. extr.u r17=r29,4,4
  271. extr.u r18=r29,16,1
  272. ;;
  273. dep r17=r18,r17,4,1
  274. ;;
  275. cmp.gt p6,p0=r30,r17
  276. (p6) br.dpnt.few kvm_asm_dispatch_vexirq
  277. br.many kvm_resume_to_guest
  278. END(kvm_asm_ssm)
  279. //mov psr.l=r2
  280. GLOBAL_ENTRY(kvm_asm_mov_to_psr)
  281. #ifndef ACCE_MOV_TO_PSR
  282. br.many kvm_virtualization_fault_back
  283. #endif
  284. add r16=VMM_VPD_BASE_OFFSET,r21
  285. extr.u r26=r25,13,7 //r2
  286. ;;
  287. ld8 r16=[r16]
  288. addl r20=@gprel(asm_mov_from_reg),gp
  289. ;;
  290. adds r30=kvm_asm_mov_to_psr_back-asm_mov_from_reg,r20
  291. shladd r26=r26,4,r20
  292. mov r24=b0
  293. ;;
  294. add r27=VPD_VPSR_START_OFFSET,r16
  295. mov b0=r26
  296. br.many b0
  297. ;;
  298. kvm_asm_mov_to_psr_back:
  299. ld8 r17=[r27]
  300. add r22=VMM_VCPU_MODE_FLAGS_OFFSET,r21
  301. dep r19=0,r19,32,32
  302. ;;
  303. ld4 r23=[r22]
  304. dep r18=0,r17,0,32
  305. ;;
  306. add r30=r18,r19
  307. movl r28=IA64_PSR_DT+IA64_PSR_RT+IA64_PSR_IT
  308. ;;
  309. st8 [r27]=r30
  310. and r27=r28,r30
  311. and r29=r28,r17
  312. ;;
  313. cmp.eq p5,p0=r29,r27
  314. cmp.eq p6,p7=r28,r27
  315. (p5) br.many kvm_asm_mov_to_psr_1
  316. ;;
  317. //virtual to physical
  318. (p7) add r26=VMM_VCPU_META_RR0_OFFSET,r21
  319. (p7) add r27=VMM_VCPU_META_RR0_OFFSET+8,r21
  320. (p7) dep r23=-1,r23,0,1
  321. ;;
  322. //physical to virtual
  323. (p6) add r26=VMM_VCPU_META_SAVED_RR0_OFFSET,r21
  324. (p6) add r27=VMM_VCPU_META_SAVED_RR0_OFFSET+8,r21
  325. (p6) dep r23=0,r23,0,1
  326. ;;
  327. ld8 r26=[r26]
  328. ld8 r27=[r27]
  329. st4 [r22]=r23
  330. dep.z r28=4,61,3
  331. ;;
  332. mov rr[r0]=r26
  333. ;;
  334. mov rr[r28]=r27
  335. ;;
  336. srlz.d
  337. ;;
  338. kvm_asm_mov_to_psr_1:
  339. mov r20=cr.ipsr
  340. movl r28=IA64_PSR_IC+IA64_PSR_I+IA64_PSR_DT+IA64_PSR_SI+IA64_PSR_RT
  341. ;;
  342. or r19=r19,r28
  343. dep r20=0,r20,0,32
  344. ;;
  345. add r20=r19,r20
  346. mov b0=r24
  347. ;;
  348. /* Comment it out due to short of fp lazy algorithm support
  349. adds r27=IA64_VCPU_FP_PSR_OFFSET,r21
  350. ;;
  351. ld8 r27=[r27]
  352. ;;
  353. tbit.nz p8,p0=r27,IA64_PSR_DFH_BIT
  354. ;;
  355. (p8) dep r20=-1,r20,IA64_PSR_DFH_BIT,1
  356. ;;
  357. */
  358. mov cr.ipsr=r20
  359. cmp.ne p6,p0=r0,r0
  360. ;;
  361. tbit.nz.or p6,p0=r17,IA64_PSR_I_BIT
  362. tbit.z.or p6,p0=r30,IA64_PSR_I_BIT
  363. (p6) br.dpnt.few kvm_resume_to_guest
  364. ;;
  365. add r29=VPD_VTPR_START_OFFSET,r16
  366. add r30=VPD_VHPI_START_OFFSET,r16
  367. ;;
  368. ld8 r29=[r29]
  369. ld8 r30=[r30]
  370. ;;
  371. extr.u r17=r29,4,4
  372. extr.u r18=r29,16,1
  373. ;;
  374. dep r17=r18,r17,4,1
  375. ;;
  376. cmp.gt p6,p0=r30,r17
  377. (p6) br.dpnt.few kvm_asm_dispatch_vexirq
  378. br.many kvm_resume_to_guest
  379. END(kvm_asm_mov_to_psr)
  380. ENTRY(kvm_asm_dispatch_vexirq)
  381. //increment iip
  382. mov r16=cr.ipsr
  383. ;;
  384. extr.u r17=r16,IA64_PSR_RI_BIT,2
  385. tbit.nz p6,p7=r16,IA64_PSR_RI_BIT+1
  386. ;;
  387. (p6) mov r18=cr.iip
  388. (p6) mov r17=r0
  389. (p7) add r17=1,r17
  390. ;;
  391. (p6) add r18=0x10,r18
  392. dep r16=r17,r16,IA64_PSR_RI_BIT,2
  393. ;;
  394. (p6) mov cr.iip=r18
  395. mov cr.ipsr=r16
  396. mov r30 =1
  397. br.many kvm_dispatch_vexirq
  398. END(kvm_asm_dispatch_vexirq)
  399. // thash
  400. // TODO: add support when pta.vf = 1
  401. GLOBAL_ENTRY(kvm_asm_thash)
  402. #ifndef ACCE_THASH
  403. br.many kvm_virtualization_fault_back
  404. #endif
  405. extr.u r17=r25,20,7 // get r3 from opcode in r25
  406. extr.u r18=r25,6,7 // get r1 from opcode in r25
  407. addl r20=@gprel(asm_mov_from_reg),gp
  408. ;;
  409. adds r30=kvm_asm_thash_back1-asm_mov_from_reg,r20
  410. shladd r17=r17,4,r20 // get addr of MOVE_FROM_REG(r17)
  411. adds r16=VMM_VPD_BASE_OFFSET,r21 // get vcpu.arch.priveregs
  412. ;;
  413. mov r24=b0
  414. ;;
  415. ld8 r16=[r16] // get VPD addr
  416. mov b0=r17
  417. br.many b0 // r19 return value
  418. ;;
  419. kvm_asm_thash_back1:
  420. shr.u r23=r19,61 // get RR number
  421. adds r25=VMM_VCPU_VRR0_OFFSET,r21 // get vcpu->arch.vrr[0]'s addr
  422. adds r16=VMM_VPD_VPTA_OFFSET,r16 // get vpta
  423. ;;
  424. shladd r27=r23,3,r25 // get vcpu->arch.vrr[r23]'s addr
  425. ld8 r17=[r16] // get PTA
  426. mov r26=1
  427. ;;
  428. extr.u r29=r17,2,6 // get pta.size
  429. ld8 r25=[r27] // get vcpu->arch.vrr[r23]'s value
  430. ;;
  431. extr.u r25=r25,2,6 // get rr.ps
  432. shl r22=r26,r29 // 1UL << pta.size
  433. ;;
  434. shr.u r23=r19,r25 // vaddr >> rr.ps
  435. adds r26=3,r29 // pta.size + 3
  436. shl r27=r17,3 // pta << 3
  437. ;;
  438. shl r23=r23,3 // (vaddr >> rr.ps) << 3
  439. shr.u r27=r27,r26 // (pta << 3) >> (pta.size+3)
  440. movl r16=7<<61
  441. ;;
  442. adds r22=-1,r22 // (1UL << pta.size) - 1
  443. shl r27=r27,r29 // ((pta<<3)>>(pta.size+3))<<pta.size
  444. and r19=r19,r16 // vaddr & VRN_MASK
  445. ;;
  446. and r22=r22,r23 // vhpt_offset
  447. or r19=r19,r27 // (vadr&VRN_MASK)|(((pta<<3)>>(pta.size + 3))<<pta.size)
  448. adds r26=asm_mov_to_reg-asm_mov_from_reg,r20
  449. ;;
  450. or r19=r19,r22 // calc pval
  451. shladd r17=r18,4,r26
  452. adds r30=kvm_resume_to_guest-asm_mov_from_reg,r20
  453. ;;
  454. mov b0=r17
  455. br.many b0
  456. END(kvm_asm_thash)
  457. #define MOV_TO_REG0 \
  458. {; \
  459. nop.b 0x0; \
  460. nop.b 0x0; \
  461. nop.b 0x0; \
  462. ;; \
  463. };
  464. #define MOV_TO_REG(n) \
  465. {; \
  466. mov r##n##=r19; \
  467. mov b0=r30; \
  468. br.sptk.many b0; \
  469. ;; \
  470. };
  471. #define MOV_FROM_REG(n) \
  472. {; \
  473. mov r19=r##n##; \
  474. mov b0=r30; \
  475. br.sptk.many b0; \
  476. ;; \
  477. };
  478. #define MOV_TO_BANK0_REG(n) \
  479. ENTRY_MIN_ALIGN(asm_mov_to_bank0_reg##n##); \
  480. {; \
  481. mov r26=r2; \
  482. mov r2=r19; \
  483. bsw.1; \
  484. ;; \
  485. }; \
  486. {; \
  487. mov r##n##=r2; \
  488. nop.b 0x0; \
  489. bsw.0; \
  490. ;; \
  491. }; \
  492. {; \
  493. mov r2=r26; \
  494. mov b0=r30; \
  495. br.sptk.many b0; \
  496. ;; \
  497. }; \
  498. END(asm_mov_to_bank0_reg##n##)
  499. #define MOV_FROM_BANK0_REG(n) \
  500. ENTRY_MIN_ALIGN(asm_mov_from_bank0_reg##n##); \
  501. {; \
  502. mov r26=r2; \
  503. nop.b 0x0; \
  504. bsw.1; \
  505. ;; \
  506. }; \
  507. {; \
  508. mov r2=r##n##; \
  509. nop.b 0x0; \
  510. bsw.0; \
  511. ;; \
  512. }; \
  513. {; \
  514. mov r19=r2; \
  515. mov r2=r26; \
  516. mov b0=r30; \
  517. }; \
  518. {; \
  519. nop.b 0x0; \
  520. nop.b 0x0; \
  521. br.sptk.many b0; \
  522. ;; \
  523. }; \
  524. END(asm_mov_from_bank0_reg##n##)
  525. #define JMP_TO_MOV_TO_BANK0_REG(n) \
  526. {; \
  527. nop.b 0x0; \
  528. nop.b 0x0; \
  529. br.sptk.many asm_mov_to_bank0_reg##n##; \
  530. ;; \
  531. }
  532. #define JMP_TO_MOV_FROM_BANK0_REG(n) \
  533. {; \
  534. nop.b 0x0; \
  535. nop.b 0x0; \
  536. br.sptk.many asm_mov_from_bank0_reg##n##; \
  537. ;; \
  538. }
  539. MOV_FROM_BANK0_REG(16)
  540. MOV_FROM_BANK0_REG(17)
  541. MOV_FROM_BANK0_REG(18)
  542. MOV_FROM_BANK0_REG(19)
  543. MOV_FROM_BANK0_REG(20)
  544. MOV_FROM_BANK0_REG(21)
  545. MOV_FROM_BANK0_REG(22)
  546. MOV_FROM_BANK0_REG(23)
  547. MOV_FROM_BANK0_REG(24)
  548. MOV_FROM_BANK0_REG(25)
  549. MOV_FROM_BANK0_REG(26)
  550. MOV_FROM_BANK0_REG(27)
  551. MOV_FROM_BANK0_REG(28)
  552. MOV_FROM_BANK0_REG(29)
  553. MOV_FROM_BANK0_REG(30)
  554. MOV_FROM_BANK0_REG(31)
  555. // mov from reg table
  556. ENTRY(asm_mov_from_reg)
  557. MOV_FROM_REG(0)
  558. MOV_FROM_REG(1)
  559. MOV_FROM_REG(2)
  560. MOV_FROM_REG(3)
  561. MOV_FROM_REG(4)
  562. MOV_FROM_REG(5)
  563. MOV_FROM_REG(6)
  564. MOV_FROM_REG(7)
  565. MOV_FROM_REG(8)
  566. MOV_FROM_REG(9)
  567. MOV_FROM_REG(10)
  568. MOV_FROM_REG(11)
  569. MOV_FROM_REG(12)
  570. MOV_FROM_REG(13)
  571. MOV_FROM_REG(14)
  572. MOV_FROM_REG(15)
  573. JMP_TO_MOV_FROM_BANK0_REG(16)
  574. JMP_TO_MOV_FROM_BANK0_REG(17)
  575. JMP_TO_MOV_FROM_BANK0_REG(18)
  576. JMP_TO_MOV_FROM_BANK0_REG(19)
  577. JMP_TO_MOV_FROM_BANK0_REG(20)
  578. JMP_TO_MOV_FROM_BANK0_REG(21)
  579. JMP_TO_MOV_FROM_BANK0_REG(22)
  580. JMP_TO_MOV_FROM_BANK0_REG(23)
  581. JMP_TO_MOV_FROM_BANK0_REG(24)
  582. JMP_TO_MOV_FROM_BANK0_REG(25)
  583. JMP_TO_MOV_FROM_BANK0_REG(26)
  584. JMP_TO_MOV_FROM_BANK0_REG(27)
  585. JMP_TO_MOV_FROM_BANK0_REG(28)
  586. JMP_TO_MOV_FROM_BANK0_REG(29)
  587. JMP_TO_MOV_FROM_BANK0_REG(30)
  588. JMP_TO_MOV_FROM_BANK0_REG(31)
  589. MOV_FROM_REG(32)
  590. MOV_FROM_REG(33)
  591. MOV_FROM_REG(34)
  592. MOV_FROM_REG(35)
  593. MOV_FROM_REG(36)
  594. MOV_FROM_REG(37)
  595. MOV_FROM_REG(38)
  596. MOV_FROM_REG(39)
  597. MOV_FROM_REG(40)
  598. MOV_FROM_REG(41)
  599. MOV_FROM_REG(42)
  600. MOV_FROM_REG(43)
  601. MOV_FROM_REG(44)
  602. MOV_FROM_REG(45)
  603. MOV_FROM_REG(46)
  604. MOV_FROM_REG(47)
  605. MOV_FROM_REG(48)
  606. MOV_FROM_REG(49)
  607. MOV_FROM_REG(50)
  608. MOV_FROM_REG(51)
  609. MOV_FROM_REG(52)
  610. MOV_FROM_REG(53)
  611. MOV_FROM_REG(54)
  612. MOV_FROM_REG(55)
  613. MOV_FROM_REG(56)
  614. MOV_FROM_REG(57)
  615. MOV_FROM_REG(58)
  616. MOV_FROM_REG(59)
  617. MOV_FROM_REG(60)
  618. MOV_FROM_REG(61)
  619. MOV_FROM_REG(62)
  620. MOV_FROM_REG(63)
  621. MOV_FROM_REG(64)
  622. MOV_FROM_REG(65)
  623. MOV_FROM_REG(66)
  624. MOV_FROM_REG(67)
  625. MOV_FROM_REG(68)
  626. MOV_FROM_REG(69)
  627. MOV_FROM_REG(70)
  628. MOV_FROM_REG(71)
  629. MOV_FROM_REG(72)
  630. MOV_FROM_REG(73)
  631. MOV_FROM_REG(74)
  632. MOV_FROM_REG(75)
  633. MOV_FROM_REG(76)
  634. MOV_FROM_REG(77)
  635. MOV_FROM_REG(78)
  636. MOV_FROM_REG(79)
  637. MOV_FROM_REG(80)
  638. MOV_FROM_REG(81)
  639. MOV_FROM_REG(82)
  640. MOV_FROM_REG(83)
  641. MOV_FROM_REG(84)
  642. MOV_FROM_REG(85)
  643. MOV_FROM_REG(86)
  644. MOV_FROM_REG(87)
  645. MOV_FROM_REG(88)
  646. MOV_FROM_REG(89)
  647. MOV_FROM_REG(90)
  648. MOV_FROM_REG(91)
  649. MOV_FROM_REG(92)
  650. MOV_FROM_REG(93)
  651. MOV_FROM_REG(94)
  652. MOV_FROM_REG(95)
  653. MOV_FROM_REG(96)
  654. MOV_FROM_REG(97)
  655. MOV_FROM_REG(98)
  656. MOV_FROM_REG(99)
  657. MOV_FROM_REG(100)
  658. MOV_FROM_REG(101)
  659. MOV_FROM_REG(102)
  660. MOV_FROM_REG(103)
  661. MOV_FROM_REG(104)
  662. MOV_FROM_REG(105)
  663. MOV_FROM_REG(106)
  664. MOV_FROM_REG(107)
  665. MOV_FROM_REG(108)
  666. MOV_FROM_REG(109)
  667. MOV_FROM_REG(110)
  668. MOV_FROM_REG(111)
  669. MOV_FROM_REG(112)
  670. MOV_FROM_REG(113)
  671. MOV_FROM_REG(114)
  672. MOV_FROM_REG(115)
  673. MOV_FROM_REG(116)
  674. MOV_FROM_REG(117)
  675. MOV_FROM_REG(118)
  676. MOV_FROM_REG(119)
  677. MOV_FROM_REG(120)
  678. MOV_FROM_REG(121)
  679. MOV_FROM_REG(122)
  680. MOV_FROM_REG(123)
  681. MOV_FROM_REG(124)
  682. MOV_FROM_REG(125)
  683. MOV_FROM_REG(126)
  684. MOV_FROM_REG(127)
  685. END(asm_mov_from_reg)
  686. /* must be in bank 0
  687. * parameter:
  688. * r31: pr
  689. * r24: b0
  690. */
  691. ENTRY(kvm_resume_to_guest)
  692. adds r16 = VMM_VCPU_SAVED_GP_OFFSET,r21
  693. ;;
  694. ld8 r1 =[r16]
  695. adds r20 = VMM_VCPU_VSA_BASE_OFFSET,r21
  696. ;;
  697. mov r16=cr.ipsr
  698. ;;
  699. ld8 r20 = [r20]
  700. adds r19=VMM_VPD_BASE_OFFSET,r21
  701. ;;
  702. ld8 r25=[r19]
  703. extr.u r17=r16,IA64_PSR_RI_BIT,2
  704. tbit.nz p6,p7=r16,IA64_PSR_RI_BIT+1
  705. ;;
  706. (p6) mov r18=cr.iip
  707. (p6) mov r17=r0
  708. ;;
  709. (p6) add r18=0x10,r18
  710. (p7) add r17=1,r17
  711. ;;
  712. (p6) mov cr.iip=r18
  713. dep r16=r17,r16,IA64_PSR_RI_BIT,2
  714. ;;
  715. mov cr.ipsr=r16
  716. adds r19= VPD_VPSR_START_OFFSET,r25
  717. add r28=PAL_VPS_RESUME_NORMAL,r20
  718. add r29=PAL_VPS_RESUME_HANDLER,r20
  719. ;;
  720. ld8 r19=[r19]
  721. mov b0=r29
  722. cmp.ne p6,p7 = r0,r0
  723. ;;
  724. tbit.z p6,p7 = r19,IA64_PSR_IC_BIT // p1=vpsr.ic
  725. ;;
  726. (p6) ld8 r26=[r25]
  727. (p7) mov b0=r28
  728. mov pr=r31,-2
  729. br.sptk.many b0 // call pal service
  730. ;;
  731. END(kvm_resume_to_guest)
  732. MOV_TO_BANK0_REG(16)
  733. MOV_TO_BANK0_REG(17)
  734. MOV_TO_BANK0_REG(18)
  735. MOV_TO_BANK0_REG(19)
  736. MOV_TO_BANK0_REG(20)
  737. MOV_TO_BANK0_REG(21)
  738. MOV_TO_BANK0_REG(22)
  739. MOV_TO_BANK0_REG(23)
  740. MOV_TO_BANK0_REG(24)
  741. MOV_TO_BANK0_REG(25)
  742. MOV_TO_BANK0_REG(26)
  743. MOV_TO_BANK0_REG(27)
  744. MOV_TO_BANK0_REG(28)
  745. MOV_TO_BANK0_REG(29)
  746. MOV_TO_BANK0_REG(30)
  747. MOV_TO_BANK0_REG(31)
  748. // mov to reg table
  749. ENTRY(asm_mov_to_reg)
  750. MOV_TO_REG0
  751. MOV_TO_REG(1)
  752. MOV_TO_REG(2)
  753. MOV_TO_REG(3)
  754. MOV_TO_REG(4)
  755. MOV_TO_REG(5)
  756. MOV_TO_REG(6)
  757. MOV_TO_REG(7)
  758. MOV_TO_REG(8)
  759. MOV_TO_REG(9)
  760. MOV_TO_REG(10)
  761. MOV_TO_REG(11)
  762. MOV_TO_REG(12)
  763. MOV_TO_REG(13)
  764. MOV_TO_REG(14)
  765. MOV_TO_REG(15)
  766. JMP_TO_MOV_TO_BANK0_REG(16)
  767. JMP_TO_MOV_TO_BANK0_REG(17)
  768. JMP_TO_MOV_TO_BANK0_REG(18)
  769. JMP_TO_MOV_TO_BANK0_REG(19)
  770. JMP_TO_MOV_TO_BANK0_REG(20)
  771. JMP_TO_MOV_TO_BANK0_REG(21)
  772. JMP_TO_MOV_TO_BANK0_REG(22)
  773. JMP_TO_MOV_TO_BANK0_REG(23)
  774. JMP_TO_MOV_TO_BANK0_REG(24)
  775. JMP_TO_MOV_TO_BANK0_REG(25)
  776. JMP_TO_MOV_TO_BANK0_REG(26)
  777. JMP_TO_MOV_TO_BANK0_REG(27)
  778. JMP_TO_MOV_TO_BANK0_REG(28)
  779. JMP_TO_MOV_TO_BANK0_REG(29)
  780. JMP_TO_MOV_TO_BANK0_REG(30)
  781. JMP_TO_MOV_TO_BANK0_REG(31)
  782. MOV_TO_REG(32)
  783. MOV_TO_REG(33)
  784. MOV_TO_REG(34)
  785. MOV_TO_REG(35)
  786. MOV_TO_REG(36)
  787. MOV_TO_REG(37)
  788. MOV_TO_REG(38)
  789. MOV_TO_REG(39)
  790. MOV_TO_REG(40)
  791. MOV_TO_REG(41)
  792. MOV_TO_REG(42)
  793. MOV_TO_REG(43)
  794. MOV_TO_REG(44)
  795. MOV_TO_REG(45)
  796. MOV_TO_REG(46)
  797. MOV_TO_REG(47)
  798. MOV_TO_REG(48)
  799. MOV_TO_REG(49)
  800. MOV_TO_REG(50)
  801. MOV_TO_REG(51)
  802. MOV_TO_REG(52)
  803. MOV_TO_REG(53)
  804. MOV_TO_REG(54)
  805. MOV_TO_REG(55)
  806. MOV_TO_REG(56)
  807. MOV_TO_REG(57)
  808. MOV_TO_REG(58)
  809. MOV_TO_REG(59)
  810. MOV_TO_REG(60)
  811. MOV_TO_REG(61)
  812. MOV_TO_REG(62)
  813. MOV_TO_REG(63)
  814. MOV_TO_REG(64)
  815. MOV_TO_REG(65)
  816. MOV_TO_REG(66)
  817. MOV_TO_REG(67)
  818. MOV_TO_REG(68)
  819. MOV_TO_REG(69)
  820. MOV_TO_REG(70)
  821. MOV_TO_REG(71)
  822. MOV_TO_REG(72)
  823. MOV_TO_REG(73)
  824. MOV_TO_REG(74)
  825. MOV_TO_REG(75)
  826. MOV_TO_REG(76)
  827. MOV_TO_REG(77)
  828. MOV_TO_REG(78)
  829. MOV_TO_REG(79)
  830. MOV_TO_REG(80)
  831. MOV_TO_REG(81)
  832. MOV_TO_REG(82)
  833. MOV_TO_REG(83)
  834. MOV_TO_REG(84)
  835. MOV_TO_REG(85)
  836. MOV_TO_REG(86)
  837. MOV_TO_REG(87)
  838. MOV_TO_REG(88)
  839. MOV_TO_REG(89)
  840. MOV_TO_REG(90)
  841. MOV_TO_REG(91)
  842. MOV_TO_REG(92)
  843. MOV_TO_REG(93)
  844. MOV_TO_REG(94)
  845. MOV_TO_REG(95)
  846. MOV_TO_REG(96)
  847. MOV_TO_REG(97)
  848. MOV_TO_REG(98)
  849. MOV_TO_REG(99)
  850. MOV_TO_REG(100)
  851. MOV_TO_REG(101)
  852. MOV_TO_REG(102)
  853. MOV_TO_REG(103)
  854. MOV_TO_REG(104)
  855. MOV_TO_REG(105)
  856. MOV_TO_REG(106)
  857. MOV_TO_REG(107)
  858. MOV_TO_REG(108)
  859. MOV_TO_REG(109)
  860. MOV_TO_REG(110)
  861. MOV_TO_REG(111)
  862. MOV_TO_REG(112)
  863. MOV_TO_REG(113)
  864. MOV_TO_REG(114)
  865. MOV_TO_REG(115)
  866. MOV_TO_REG(116)
  867. MOV_TO_REG(117)
  868. MOV_TO_REG(118)
  869. MOV_TO_REG(119)
  870. MOV_TO_REG(120)
  871. MOV_TO_REG(121)
  872. MOV_TO_REG(122)
  873. MOV_TO_REG(123)
  874. MOV_TO_REG(124)
  875. MOV_TO_REG(125)
  876. MOV_TO_REG(126)
  877. MOV_TO_REG(127)
  878. END(asm_mov_to_reg)