optvfault.S 18 KB

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