ia64/xen-unstable

view xen/arch/ia64/vmx/optvfault.S @ 11824:ee7799388ab1

[IA64] fix a bug in accelerating mov to rr

Signed-off-by: Anthony Xu <anthony.xu@intel.com>
author awilliam@xenbuild.aw
date Wed Oct 18 22:07:18 2006 -0600 (2006-10-18)
parents fcd746cf4647
children 622bb65e2011
line source
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 */
9 #include <linux/config.h>
10 #include <asm/asmmacro.h>
11 #include <asm/kregs.h>
12 #include <asm/offsets.h>
13 #include <asm/percpu.h>
14 #include <asm/processor.h>
15 #include <asm/vmx_vpd.h>
16 #include <asm/vmx_pal_vsa.h>
17 #include <asm/asm-offsets.h>
19 #define ACCE_MOV_FROM_AR
20 #define ACCE_MOV_FROM_RR
21 #define ACCE_MOV_TO_RR
23 //mov r1=ar3
24 GLOBAL_ENTRY(vmx_asm_mov_from_ar)
25 #ifndef ACCE_MOV_FROM_AR
26 br.many vmx_virtualization_fault_back
27 #endif
28 add r18=VCPU_VTM_OFFSET_OFS,r21
29 mov r19=ar.itc
30 extr.u r17=r25,6,7
31 ;;
32 ld8 r18=[r18]
33 movl r20=asm_mov_to_reg
34 ;;
35 adds r30=vmx_resume_to_guest-asm_mov_to_reg,r20
36 shladd r17=r17,4,r20
37 mov r24=b0
38 ;;
39 add r19=r19,r18
40 mov b0=r17
41 br.sptk.few b0
42 ;;
43 END(vmx_asm_mov_from_ar)
46 // mov r1=rr[r3]
47 GLOBAL_ENTRY(vmx_asm_mov_from_rr)
48 #ifndef ACCE_MOV_FROM_RR
49 br.many vmx_virtualization_fault_back
50 #endif
51 extr.u r16=r25,20,7
52 extr.u r17=r25,6,7
53 movl r20=asm_mov_from_reg
54 ;;
55 adds r30=vmx_asm_mov_from_rr_back_1-asm_mov_from_reg,r20
56 shladd r16=r16,4,r20
57 mov r24=b0
58 ;;
59 add r27=VCPU_VRR0_OFS,r21
60 mov b0=r16
61 br.many b0
62 ;;
63 vmx_asm_mov_from_rr_back_1:
64 adds r30=vmx_resume_to_guest-asm_mov_from_reg,r20
65 adds r22=asm_mov_to_reg-asm_mov_from_reg,r20
66 shr.u r26=r19,61
67 ;;
68 shladd r17=r17,4,r22
69 shladd r27=r26,3,r27
70 ;;
71 ld8 r19=[r27]
72 mov b0=r17
73 br.many b0
74 END(vmx_asm_mov_from_rr)
77 // mov rr[r3]=r2
78 GLOBAL_ENTRY(vmx_asm_mov_to_rr)
79 #ifndef ACCE_MOV_TO_RR
80 br.many vmx_virtualization_fault_back
81 #endif
82 extr.u r16=r25,20,7
83 extr.u r17=r25,13,7
84 movl r20=asm_mov_from_reg
85 ;;
86 adds r30=vmx_asm_mov_to_rr_back_1-asm_mov_from_reg,r20
87 shladd r16=r16,4,r20
88 mov r22=b0
89 ;;
90 add r27=VCPU_VRR0_OFS,r21
91 mov b0=r16
92 br.many b0
93 ;;
94 vmx_asm_mov_to_rr_back_1:
95 adds r30=vmx_asm_mov_to_rr_back_2-asm_mov_from_reg,r20
96 shr.u r23=r19,61
97 shladd r17=r17,4,r20
98 ;;
99 //if rr7, go back
100 cmp.eq p6,p0=7,r23
101 mov b0=r22
102 (p6) br.cond.dpnt.many vmx_virtualization_fault_back
103 ;;
104 mov r28=r19
105 mov b0=r17
106 br.many b0
107 vmx_asm_mov_to_rr_back_2:
108 adds r30=vmx_resume_to_guest-asm_mov_from_reg,r20
109 shladd r27=r23,3,r27
110 ;; // +starting_rid
111 st8 [r27]=r19
112 mov b0=r30
113 ;;
114 adds r16=IA64_VCPU_STARTING_RID_OFFSET,r21
115 ;;
116 ld4 r16=[r16]
117 ;;
118 shl r16=r16,8
119 ;;
120 add r19=r19,r16
121 ;; //mangling rid 1 and 3
122 extr.u r16=r19,8,8
123 extr.u r17=r19,24,8
124 extr.u r18=r19,2,6
125 ;;
126 dep r19=r16,r19,24,8
127 ;;
128 dep r19=r17,r19,8,8
129 ;; //set ve 1
130 dep r19=-1,r19,0,1
131 cmp.lt p6,p0=14,r18
132 ;;
133 (p6) mov r18=14
134 ;;
135 (p6) dep r19=r18,r19,2,6
136 ;;
137 cmp.eq p6,p0=0,r23
138 ;;
139 cmp.eq.or p6,p0=4,r23
140 ;;
141 adds r16=IA64_VCPU_MODE_FLAGS_OFFSET,r21
142 (p6) adds r17=IA64_VCPU_META_SAVED_RR0_OFFSET,r21
143 ;;
144 ld4 r16=[r16]
145 cmp.eq p7,p0=r0,r0
146 (p6) shladd r17=r23,1,r17
147 ;;
148 (p6) st8 [r17]=r19
149 (p6) tbit.nz p6,p7=r16,0
150 ;;
151 (p7) mov rr[r28]=r19
152 mov r24=r22
153 br.many b0
154 END(vmx_asm_mov_to_rr)
157 #define MOV_TO_REG0 \
158 {; \
159 nop.b 0x0; \
160 nop.b 0x0; \
161 nop.b 0x0; \
162 ;; \
163 };
166 #define MOV_TO_REG(n) \
167 {; \
168 mov r##n##=r19; \
169 mov b0=r30; \
170 br.sptk.many b0; \
171 ;; \
172 };
175 #define MOV_FROM_REG(n) \
176 {; \
177 mov r19=r##n##; \
178 mov b0=r30; \
179 br.sptk.many b0; \
180 ;; \
181 };
184 #define MOV_TO_BANK0_REG(n) \
185 ENTRY_MIN_ALIGN(asm_mov_to_bank0_reg##n##); \
186 {; \
187 mov r26=r2; \
188 mov r2=r19; \
189 bsw.1; \
190 ;; \
191 }; \
192 {; \
193 mov r##n##=r2; \
194 nop.b 0x0; \
195 bsw.0; \
196 ;; \
197 }; \
198 {; \
199 mov r2=r26; \
200 mov b0=r30; \
201 br.sptk.many b0; \
202 ;; \
203 }; \
204 END(asm_mov_to_bank0_reg##n##)
207 #define MOV_FROM_BANK0_REG(n) \
208 ENTRY_MIN_ALIGN(asm_mov_from_bank0_reg##n##); \
209 {; \
210 mov r26=r2; \
211 nop.b 0x0; \
212 bsw.1; \
213 ;; \
214 }; \
215 {; \
216 mov r2=r##n##; \
217 nop.b 0x0; \
218 bsw.0; \
219 ;; \
220 }; \
221 {; \
222 mov r19=r2; \
223 mov r2=r26; \
224 mov b0=r30; \
225 }; \
226 {; \
227 nop.b 0x0; \
228 nop.b 0x0; \
229 br.sptk.many b0; \
230 ;; \
231 }; \
232 END(asm_mov_from_bank0_reg##n##)
235 #define JMP_TO_MOV_TO_BANK0_REG(n) \
236 {; \
237 nop.b 0x0; \
238 nop.b 0x0; \
239 br.sptk.many asm_mov_to_bank0_reg##n##; \
240 ;; \
241 }
244 #define JMP_TO_MOV_FROM_BANK0_REG(n) \
245 {; \
246 nop.b 0x0; \
247 nop.b 0x0; \
248 br.sptk.many asm_mov_from_bank0_reg##n##; \
249 ;; \
250 }
253 MOV_FROM_BANK0_REG(16)
254 MOV_FROM_BANK0_REG(17)
255 MOV_FROM_BANK0_REG(18)
256 MOV_FROM_BANK0_REG(19)
257 MOV_FROM_BANK0_REG(20)
258 MOV_FROM_BANK0_REG(21)
259 MOV_FROM_BANK0_REG(22)
260 MOV_FROM_BANK0_REG(23)
261 MOV_FROM_BANK0_REG(24)
262 MOV_FROM_BANK0_REG(25)
263 MOV_FROM_BANK0_REG(26)
264 MOV_FROM_BANK0_REG(27)
265 MOV_FROM_BANK0_REG(28)
266 MOV_FROM_BANK0_REG(29)
267 MOV_FROM_BANK0_REG(30)
268 MOV_FROM_BANK0_REG(31)
271 // mov from reg table
272 ENTRY(asm_mov_from_reg)
273 MOV_FROM_REG(0)
274 MOV_FROM_REG(1)
275 MOV_FROM_REG(2)
276 MOV_FROM_REG(3)
277 MOV_FROM_REG(4)
278 MOV_FROM_REG(5)
279 MOV_FROM_REG(6)
280 MOV_FROM_REG(7)
281 MOV_FROM_REG(8)
282 MOV_FROM_REG(9)
283 MOV_FROM_REG(10)
284 MOV_FROM_REG(11)
285 MOV_FROM_REG(12)
286 MOV_FROM_REG(13)
287 MOV_FROM_REG(14)
288 MOV_FROM_REG(15)
289 JMP_TO_MOV_FROM_BANK0_REG(16)
290 JMP_TO_MOV_FROM_BANK0_REG(17)
291 JMP_TO_MOV_FROM_BANK0_REG(18)
292 JMP_TO_MOV_FROM_BANK0_REG(19)
293 JMP_TO_MOV_FROM_BANK0_REG(20)
294 JMP_TO_MOV_FROM_BANK0_REG(21)
295 JMP_TO_MOV_FROM_BANK0_REG(22)
296 JMP_TO_MOV_FROM_BANK0_REG(23)
297 JMP_TO_MOV_FROM_BANK0_REG(24)
298 JMP_TO_MOV_FROM_BANK0_REG(25)
299 JMP_TO_MOV_FROM_BANK0_REG(26)
300 JMP_TO_MOV_FROM_BANK0_REG(27)
301 JMP_TO_MOV_FROM_BANK0_REG(28)
302 JMP_TO_MOV_FROM_BANK0_REG(29)
303 JMP_TO_MOV_FROM_BANK0_REG(30)
304 JMP_TO_MOV_FROM_BANK0_REG(31)
305 MOV_FROM_REG(32)
306 MOV_FROM_REG(33)
307 MOV_FROM_REG(34)
308 MOV_FROM_REG(35)
309 MOV_FROM_REG(36)
310 MOV_FROM_REG(37)
311 MOV_FROM_REG(38)
312 MOV_FROM_REG(39)
313 MOV_FROM_REG(40)
314 MOV_FROM_REG(41)
315 MOV_FROM_REG(42)
316 MOV_FROM_REG(43)
317 MOV_FROM_REG(44)
318 MOV_FROM_REG(45)
319 MOV_FROM_REG(46)
320 MOV_FROM_REG(47)
321 MOV_FROM_REG(48)
322 MOV_FROM_REG(49)
323 MOV_FROM_REG(50)
324 MOV_FROM_REG(51)
325 MOV_FROM_REG(52)
326 MOV_FROM_REG(53)
327 MOV_FROM_REG(54)
328 MOV_FROM_REG(55)
329 MOV_FROM_REG(56)
330 MOV_FROM_REG(57)
331 MOV_FROM_REG(58)
332 MOV_FROM_REG(59)
333 MOV_FROM_REG(60)
334 MOV_FROM_REG(61)
335 MOV_FROM_REG(62)
336 MOV_FROM_REG(63)
337 MOV_FROM_REG(64)
338 MOV_FROM_REG(65)
339 MOV_FROM_REG(66)
340 MOV_FROM_REG(67)
341 MOV_FROM_REG(68)
342 MOV_FROM_REG(69)
343 MOV_FROM_REG(70)
344 MOV_FROM_REG(71)
345 MOV_FROM_REG(72)
346 MOV_FROM_REG(73)
347 MOV_FROM_REG(74)
348 MOV_FROM_REG(75)
349 MOV_FROM_REG(76)
350 MOV_FROM_REG(77)
351 MOV_FROM_REG(78)
352 MOV_FROM_REG(79)
353 MOV_FROM_REG(80)
354 MOV_FROM_REG(81)
355 MOV_FROM_REG(82)
356 MOV_FROM_REG(83)
357 MOV_FROM_REG(84)
358 MOV_FROM_REG(85)
359 MOV_FROM_REG(86)
360 MOV_FROM_REG(87)
361 MOV_FROM_REG(88)
362 MOV_FROM_REG(89)
363 MOV_FROM_REG(90)
364 MOV_FROM_REG(91)
365 MOV_FROM_REG(92)
366 MOV_FROM_REG(93)
367 MOV_FROM_REG(94)
368 MOV_FROM_REG(95)
369 MOV_FROM_REG(96)
370 MOV_FROM_REG(97)
371 MOV_FROM_REG(98)
372 MOV_FROM_REG(99)
373 MOV_FROM_REG(100)
374 MOV_FROM_REG(101)
375 MOV_FROM_REG(102)
376 MOV_FROM_REG(103)
377 MOV_FROM_REG(104)
378 MOV_FROM_REG(105)
379 MOV_FROM_REG(106)
380 MOV_FROM_REG(107)
381 MOV_FROM_REG(108)
382 MOV_FROM_REG(109)
383 MOV_FROM_REG(110)
384 MOV_FROM_REG(111)
385 MOV_FROM_REG(112)
386 MOV_FROM_REG(113)
387 MOV_FROM_REG(114)
388 MOV_FROM_REG(115)
389 MOV_FROM_REG(116)
390 MOV_FROM_REG(117)
391 MOV_FROM_REG(118)
392 MOV_FROM_REG(119)
393 MOV_FROM_REG(120)
394 MOV_FROM_REG(121)
395 MOV_FROM_REG(122)
396 MOV_FROM_REG(123)
397 MOV_FROM_REG(124)
398 MOV_FROM_REG(125)
399 MOV_FROM_REG(126)
400 MOV_FROM_REG(127)
401 END(asm_mov_from_reg)
404 /* must be in bank 0
405 * parameter:
406 * r31: pr
407 * r24: b0
408 */
409 ENTRY(vmx_resume_to_guest)
410 mov r16=cr.ipsr
411 movl r20=__vsa_base
412 ;;
413 ld8 r20=[r20]
414 adds r19=IA64_VPD_BASE_OFFSET,r21
415 ;;
416 ld8 r25=[r19]
417 extr.u r17=r16,IA64_PSR_RI_BIT,2
418 tbit.nz p6,p7=r16,IA64_PSR_RI_BIT+1
419 ;;
420 (p6) mov r18=cr.iip
421 (p6) mov r17=r0
422 ;;
423 (p6) add r18=0x10,r18
424 (p7) add r17=1,r17
425 ;;
426 (p6) mov cr.iip=r18
427 dep r16=r17,r16,IA64_PSR_RI_BIT,2
428 ;;
429 mov cr.ipsr=r16
430 adds r19= VPD_VPSR_START_OFFSET,r25
431 add r28=PAL_VPS_RESUME_NORMAL,r20
432 add r29=PAL_VPS_RESUME_HANDLER,r20
433 ;;
434 ld8 r19=[r19]
435 mov b0=r29
436 cmp.ne p6,p7 = r0,r0
437 ;;
438 tbit.z p6,p7 = r19,IA64_PSR_IC_BIT // p1=vpsr.ic
439 ;;
440 (p6) ld8 r26=[r25]
441 (p7) mov b0=r28
442 mov pr=r31,-2
443 br.sptk.many b0 // call pal service
444 ;;
445 END(vmx_resume_to_guest)
448 MOV_TO_BANK0_REG(16)
449 MOV_TO_BANK0_REG(17)
450 MOV_TO_BANK0_REG(18)
451 MOV_TO_BANK0_REG(19)
452 MOV_TO_BANK0_REG(20)
453 MOV_TO_BANK0_REG(21)
454 MOV_TO_BANK0_REG(22)
455 MOV_TO_BANK0_REG(23)
456 MOV_TO_BANK0_REG(24)
457 MOV_TO_BANK0_REG(25)
458 MOV_TO_BANK0_REG(26)
459 MOV_TO_BANK0_REG(27)
460 MOV_TO_BANK0_REG(28)
461 MOV_TO_BANK0_REG(29)
462 MOV_TO_BANK0_REG(30)
463 MOV_TO_BANK0_REG(31)
466 // mov to reg table
467 ENTRY(asm_mov_to_reg)
468 MOV_TO_REG0
469 MOV_TO_REG(1)
470 MOV_TO_REG(2)
471 MOV_TO_REG(3)
472 MOV_TO_REG(4)
473 MOV_TO_REG(5)
474 MOV_TO_REG(6)
475 MOV_TO_REG(7)
476 MOV_TO_REG(8)
477 MOV_TO_REG(9)
478 MOV_TO_REG(10)
479 MOV_TO_REG(11)
480 MOV_TO_REG(12)
481 MOV_TO_REG(13)
482 MOV_TO_REG(14)
483 MOV_TO_REG(15)
484 JMP_TO_MOV_TO_BANK0_REG(16)
485 JMP_TO_MOV_TO_BANK0_REG(17)
486 JMP_TO_MOV_TO_BANK0_REG(18)
487 JMP_TO_MOV_TO_BANK0_REG(19)
488 JMP_TO_MOV_TO_BANK0_REG(20)
489 JMP_TO_MOV_TO_BANK0_REG(21)
490 JMP_TO_MOV_TO_BANK0_REG(22)
491 JMP_TO_MOV_TO_BANK0_REG(23)
492 JMP_TO_MOV_TO_BANK0_REG(24)
493 JMP_TO_MOV_TO_BANK0_REG(25)
494 JMP_TO_MOV_TO_BANK0_REG(26)
495 JMP_TO_MOV_TO_BANK0_REG(27)
496 JMP_TO_MOV_TO_BANK0_REG(28)
497 JMP_TO_MOV_TO_BANK0_REG(29)
498 JMP_TO_MOV_TO_BANK0_REG(30)
499 JMP_TO_MOV_TO_BANK0_REG(31)
500 MOV_TO_REG(32)
501 MOV_TO_REG(33)
502 MOV_TO_REG(34)
503 MOV_TO_REG(35)
504 MOV_TO_REG(36)
505 MOV_TO_REG(37)
506 MOV_TO_REG(38)
507 MOV_TO_REG(39)
508 MOV_TO_REG(40)
509 MOV_TO_REG(41)
510 MOV_TO_REG(42)
511 MOV_TO_REG(43)
512 MOV_TO_REG(44)
513 MOV_TO_REG(45)
514 MOV_TO_REG(46)
515 MOV_TO_REG(47)
516 MOV_TO_REG(48)
517 MOV_TO_REG(49)
518 MOV_TO_REG(50)
519 MOV_TO_REG(51)
520 MOV_TO_REG(52)
521 MOV_TO_REG(53)
522 MOV_TO_REG(54)
523 MOV_TO_REG(55)
524 MOV_TO_REG(56)
525 MOV_TO_REG(57)
526 MOV_TO_REG(58)
527 MOV_TO_REG(59)
528 MOV_TO_REG(60)
529 MOV_TO_REG(61)
530 MOV_TO_REG(62)
531 MOV_TO_REG(63)
532 MOV_TO_REG(64)
533 MOV_TO_REG(65)
534 MOV_TO_REG(66)
535 MOV_TO_REG(67)
536 MOV_TO_REG(68)
537 MOV_TO_REG(69)
538 MOV_TO_REG(70)
539 MOV_TO_REG(71)
540 MOV_TO_REG(72)
541 MOV_TO_REG(73)
542 MOV_TO_REG(74)
543 MOV_TO_REG(75)
544 MOV_TO_REG(76)
545 MOV_TO_REG(77)
546 MOV_TO_REG(78)
547 MOV_TO_REG(79)
548 MOV_TO_REG(80)
549 MOV_TO_REG(81)
550 MOV_TO_REG(82)
551 MOV_TO_REG(83)
552 MOV_TO_REG(84)
553 MOV_TO_REG(85)
554 MOV_TO_REG(86)
555 MOV_TO_REG(87)
556 MOV_TO_REG(88)
557 MOV_TO_REG(89)
558 MOV_TO_REG(90)
559 MOV_TO_REG(91)
560 MOV_TO_REG(92)
561 MOV_TO_REG(93)
562 MOV_TO_REG(94)
563 MOV_TO_REG(95)
564 MOV_TO_REG(96)
565 MOV_TO_REG(97)
566 MOV_TO_REG(98)
567 MOV_TO_REG(99)
568 MOV_TO_REG(100)
569 MOV_TO_REG(101)
570 MOV_TO_REG(102)
571 MOV_TO_REG(103)
572 MOV_TO_REG(104)
573 MOV_TO_REG(105)
574 MOV_TO_REG(106)
575 MOV_TO_REG(107)
576 MOV_TO_REG(108)
577 MOV_TO_REG(109)
578 MOV_TO_REG(110)
579 MOV_TO_REG(111)
580 MOV_TO_REG(112)
581 MOV_TO_REG(113)
582 MOV_TO_REG(114)
583 MOV_TO_REG(115)
584 MOV_TO_REG(116)
585 MOV_TO_REG(117)
586 MOV_TO_REG(118)
587 MOV_TO_REG(119)
588 MOV_TO_REG(120)
589 MOV_TO_REG(121)
590 MOV_TO_REG(122)
591 MOV_TO_REG(123)
592 MOV_TO_REG(124)
593 MOV_TO_REG(125)
594 MOV_TO_REG(126)
595 MOV_TO_REG(127)
596 END(asm_mov_to_reg)