blob: 6839a52f7a41eae84571b0d6a5f6b5b109279857 [file] [log] [blame]
Xiantao Zhang60a07bb2008-04-01 16:14:28 +08001/*
2 * kvm_vcpu.c: handling all virtual cpu related thing.
3 * Copyright (c) 2005, Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16 * Place - Suite 330, Boston, MA 02111-1307 USA.
17 *
18 * Shaofan Li (Susue Li) <susie.li@intel.com>
19 * Yaozu Dong (Eddie Dong) (Eddie.dong@intel.com)
20 * Xuefei Xu (Anthony Xu) (Anthony.xu@intel.com)
21 * Xiantao Zhang <xiantao.zhang@intel.com>
22 */
23
24#include <linux/kvm_host.h>
25#include <linux/types.h>
26
27#include <asm/processor.h>
28#include <asm/ia64regs.h>
29#include <asm/gcc_intrin.h>
30#include <asm/kregs.h>
31#include <asm/pgtable.h>
32#include <asm/tlb.h>
33
34#include "asm-offsets.h"
35#include "vcpu.h"
36
37/*
38 * Special notes:
39 * - Index by it/dt/rt sequence
40 * - Only existing mode transitions are allowed in this table
41 * - RSE is placed at lazy mode when emulating guest partial mode
42 * - If gva happens to be rr0 and rr4, only allowed case is identity
43 * mapping (gva=gpa), or panic! (How?)
44 */
45int mm_switch_table[8][8] = {
46 /* 2004/09/12(Kevin): Allow switch to self */
47 /*
48 * (it,dt,rt): (0,0,0) -> (1,1,1)
49 * This kind of transition usually occurs in the very early
50 * stage of Linux boot up procedure. Another case is in efi
51 * and pal calls. (see "arch/ia64/kernel/head.S")
52 *
53 * (it,dt,rt): (0,0,0) -> (0,1,1)
54 * This kind of transition is found when OSYa exits efi boot
55 * service. Due to gva = gpa in this case (Same region),
56 * data access can be satisfied though itlb entry for physical
57 * emulation is hit.
58 */
59 {SW_SELF, 0, 0, SW_NOP, 0, 0, 0, SW_P2V},
60 {0, 0, 0, 0, 0, 0, 0, 0},
61 {0, 0, 0, 0, 0, 0, 0, 0},
62 /*
63 * (it,dt,rt): (0,1,1) -> (1,1,1)
64 * This kind of transition is found in OSYa.
65 *
66 * (it,dt,rt): (0,1,1) -> (0,0,0)
67 * This kind of transition is found in OSYa
68 */
69 {SW_NOP, 0, 0, SW_SELF, 0, 0, 0, SW_P2V},
70 /* (1,0,0)->(1,1,1) */
71 {0, 0, 0, 0, 0, 0, 0, SW_P2V},
72 /*
73 * (it,dt,rt): (1,0,1) -> (1,1,1)
74 * This kind of transition usually occurs when Linux returns
75 * from the low level TLB miss handlers.
76 * (see "arch/ia64/kernel/ivt.S")
77 */
78 {0, 0, 0, 0, 0, SW_SELF, 0, SW_P2V},
79 {0, 0, 0, 0, 0, 0, 0, 0},
80 /*
81 * (it,dt,rt): (1,1,1) -> (1,0,1)
82 * This kind of transition usually occurs in Linux low level
83 * TLB miss handler. (see "arch/ia64/kernel/ivt.S")
84 *
85 * (it,dt,rt): (1,1,1) -> (0,0,0)
86 * This kind of transition usually occurs in pal and efi calls,
87 * which requires running in physical mode.
88 * (see "arch/ia64/kernel/head.S")
89 * (1,1,1)->(1,0,0)
90 */
91
92 {SW_V2P, 0, 0, 0, SW_V2P, SW_V2P, 0, SW_SELF},
93};
94
95void physical_mode_init(struct kvm_vcpu *vcpu)
96{
97 vcpu->arch.mode_flags = GUEST_IN_PHY;
98}
99
100void switch_to_physical_rid(struct kvm_vcpu *vcpu)
101{
102 unsigned long psr;
103
104 /* Save original virtual mode rr[0] and rr[4] */
105 psr = ia64_clear_ic();
106 ia64_set_rr(VRN0<<VRN_SHIFT, vcpu->arch.metaphysical_rr0);
107 ia64_srlz_d();
108 ia64_set_rr(VRN4<<VRN_SHIFT, vcpu->arch.metaphysical_rr4);
109 ia64_srlz_d();
110
111 ia64_set_psr(psr);
112 return;
113}
114
115
116void switch_to_virtual_rid(struct kvm_vcpu *vcpu)
117{
118 unsigned long psr;
119
120 psr = ia64_clear_ic();
121 ia64_set_rr(VRN0 << VRN_SHIFT, vcpu->arch.metaphysical_saved_rr0);
122 ia64_srlz_d();
123 ia64_set_rr(VRN4 << VRN_SHIFT, vcpu->arch.metaphysical_saved_rr4);
124 ia64_srlz_d();
125 ia64_set_psr(psr);
126 return;
127}
128
129static int mm_switch_action(struct ia64_psr opsr, struct ia64_psr npsr)
130{
131 return mm_switch_table[MODE_IND(opsr)][MODE_IND(npsr)];
132}
133
134void switch_mm_mode(struct kvm_vcpu *vcpu, struct ia64_psr old_psr,
135 struct ia64_psr new_psr)
136{
137 int act;
138 act = mm_switch_action(old_psr, new_psr);
139 switch (act) {
140 case SW_V2P:
141 /*printk("V -> P mode transition: (0x%lx -> 0x%lx)\n",
142 old_psr.val, new_psr.val);*/
143 switch_to_physical_rid(vcpu);
144 /*
145 * Set rse to enforced lazy, to prevent active rse
146 *save/restor when guest physical mode.
147 */
148 vcpu->arch.mode_flags |= GUEST_IN_PHY;
149 break;
150 case SW_P2V:
151 switch_to_virtual_rid(vcpu);
152 /*
153 * recover old mode which is saved when entering
154 * guest physical mode
155 */
156 vcpu->arch.mode_flags &= ~GUEST_IN_PHY;
157 break;
158 case SW_SELF:
159 break;
160 case SW_NOP:
161 break;
162 default:
163 /* Sanity check */
164 break;
165 }
166 return;
167}
168
169
170
171/*
172 * In physical mode, insert tc/tr for region 0 and 4 uses
173 * RID[0] and RID[4] which is for physical mode emulation.
174 * However what those inserted tc/tr wants is rid for
175 * virtual mode. So original virtual rid needs to be restored
176 * before insert.
177 *
178 * Operations which required such switch include:
179 * - insertions (itc.*, itr.*)
180 * - purges (ptc.* and ptr.*)
181 * - tpa
182 * - tak
183 * - thash?, ttag?
184 * All above needs actual virtual rid for destination entry.
185 */
186
187void check_mm_mode_switch(struct kvm_vcpu *vcpu, struct ia64_psr old_psr,
188 struct ia64_psr new_psr)
189{
190
191 if ((old_psr.dt != new_psr.dt)
192 || (old_psr.it != new_psr.it)
193 || (old_psr.rt != new_psr.rt))
194 switch_mm_mode(vcpu, old_psr, new_psr);
195
196 return;
197}
198
199
200/*
201 * In physical mode, insert tc/tr for region 0 and 4 uses
202 * RID[0] and RID[4] which is for physical mode emulation.
203 * However what those inserted tc/tr wants is rid for
204 * virtual mode. So original virtual rid needs to be restored
205 * before insert.
206 *
207 * Operations which required such switch include:
208 * - insertions (itc.*, itr.*)
209 * - purges (ptc.* and ptr.*)
210 * - tpa
211 * - tak
212 * - thash?, ttag?
213 * All above needs actual virtual rid for destination entry.
214 */
215
216void prepare_if_physical_mode(struct kvm_vcpu *vcpu)
217{
218 if (is_physical_mode(vcpu)) {
219 vcpu->arch.mode_flags |= GUEST_PHY_EMUL;
220 switch_to_virtual_rid(vcpu);
221 }
222 return;
223}
224
225/* Recover always follows prepare */
226void recover_if_physical_mode(struct kvm_vcpu *vcpu)
227{
228 if (is_physical_mode(vcpu))
229 switch_to_physical_rid(vcpu);
230 vcpu->arch.mode_flags &= ~GUEST_PHY_EMUL;
231 return;
232}
233
234#define RPT(x) ((u16) &((struct kvm_pt_regs *)0)->x)
235
236static u16 gr_info[32] = {
237 0, /* r0 is read-only : WE SHOULD NEVER GET THIS */
238 RPT(r1), RPT(r2), RPT(r3),
239 RPT(r4), RPT(r5), RPT(r6), RPT(r7),
240 RPT(r8), RPT(r9), RPT(r10), RPT(r11),
241 RPT(r12), RPT(r13), RPT(r14), RPT(r15),
242 RPT(r16), RPT(r17), RPT(r18), RPT(r19),
243 RPT(r20), RPT(r21), RPT(r22), RPT(r23),
244 RPT(r24), RPT(r25), RPT(r26), RPT(r27),
245 RPT(r28), RPT(r29), RPT(r30), RPT(r31)
246};
247
248#define IA64_FIRST_STACKED_GR 32
249#define IA64_FIRST_ROTATING_FR 32
250
251static inline unsigned long
252rotate_reg(unsigned long sor, unsigned long rrb, unsigned long reg)
253{
254 reg += rrb;
255 if (reg >= sor)
256 reg -= sor;
257 return reg;
258}
259
260/*
261 * Return the (rotated) index for floating point register
262 * be in the REGNUM (REGNUM must range from 32-127,
263 * result is in the range from 0-95.
264 */
265static inline unsigned long fph_index(struct kvm_pt_regs *regs,
266 long regnum)
267{
268 unsigned long rrb_fr = (regs->cr_ifs >> 25) & 0x7f;
269 return rotate_reg(96, rrb_fr, (regnum - IA64_FIRST_ROTATING_FR));
270}
271
272
273/*
274 * The inverse of the above: given bspstore and the number of
275 * registers, calculate ar.bsp.
276 */
277static inline unsigned long *kvm_rse_skip_regs(unsigned long *addr,
278 long num_regs)
279{
280 long delta = ia64_rse_slot_num(addr) + num_regs;
281 int i = 0;
282
283 if (num_regs < 0)
284 delta -= 0x3e;
285 if (delta < 0) {
286 while (delta <= -0x3f) {
287 i--;
288 delta += 0x3f;
289 }
290 } else {
291 while (delta >= 0x3f) {
292 i++;
293 delta -= 0x3f;
294 }
295 }
296
297 return addr + num_regs + i;
298}
299
300static void get_rse_reg(struct kvm_pt_regs *regs, unsigned long r1,
301 unsigned long *val, int *nat)
302{
303 unsigned long *bsp, *addr, *rnat_addr, *bspstore;
304 unsigned long *kbs = (void *) current_vcpu + VMM_RBS_OFFSET;
305 unsigned long nat_mask;
306 unsigned long old_rsc, new_rsc;
307 long sof = (regs->cr_ifs) & 0x7f;
308 long sor = (((regs->cr_ifs >> 14) & 0xf) << 3);
309 long rrb_gr = (regs->cr_ifs >> 18) & 0x7f;
310 long ridx = r1 - 32;
311
312 if (ridx < sor)
313 ridx = rotate_reg(sor, rrb_gr, ridx);
314
315 old_rsc = ia64_getreg(_IA64_REG_AR_RSC);
316 new_rsc = old_rsc&(~(0x3));
317 ia64_setreg(_IA64_REG_AR_RSC, new_rsc);
318
319 bspstore = (unsigned long *)ia64_getreg(_IA64_REG_AR_BSPSTORE);
320 bsp = kbs + (regs->loadrs >> 19);
321
322 addr = kvm_rse_skip_regs(bsp, -sof + ridx);
323 nat_mask = 1UL << ia64_rse_slot_num(addr);
324 rnat_addr = ia64_rse_rnat_addr(addr);
325
326 if (addr >= bspstore) {
327 ia64_flushrs();
328 ia64_mf();
329 bspstore = (unsigned long *)ia64_getreg(_IA64_REG_AR_BSPSTORE);
330 }
331 *val = *addr;
332 if (nat) {
333 if (bspstore < rnat_addr)
334 *nat = (int)!!(ia64_getreg(_IA64_REG_AR_RNAT)
335 & nat_mask);
336 else
337 *nat = (int)!!((*rnat_addr) & nat_mask);
338 ia64_setreg(_IA64_REG_AR_RSC, old_rsc);
339 }
340}
341
342void set_rse_reg(struct kvm_pt_regs *regs, unsigned long r1,
343 unsigned long val, unsigned long nat)
344{
345 unsigned long *bsp, *bspstore, *addr, *rnat_addr;
346 unsigned long *kbs = (void *) current_vcpu + VMM_RBS_OFFSET;
347 unsigned long nat_mask;
348 unsigned long old_rsc, new_rsc, psr;
349 unsigned long rnat;
350 long sof = (regs->cr_ifs) & 0x7f;
351 long sor = (((regs->cr_ifs >> 14) & 0xf) << 3);
352 long rrb_gr = (regs->cr_ifs >> 18) & 0x7f;
353 long ridx = r1 - 32;
354
355 if (ridx < sor)
356 ridx = rotate_reg(sor, rrb_gr, ridx);
357
358 old_rsc = ia64_getreg(_IA64_REG_AR_RSC);
359 /* put RSC to lazy mode, and set loadrs 0 */
360 new_rsc = old_rsc & (~0x3fff0003);
361 ia64_setreg(_IA64_REG_AR_RSC, new_rsc);
362 bsp = kbs + (regs->loadrs >> 19); /* 16 + 3 */
363
364 addr = kvm_rse_skip_regs(bsp, -sof + ridx);
365 nat_mask = 1UL << ia64_rse_slot_num(addr);
366 rnat_addr = ia64_rse_rnat_addr(addr);
367
368 local_irq_save(psr);
369 bspstore = (unsigned long *)ia64_getreg(_IA64_REG_AR_BSPSTORE);
370 if (addr >= bspstore) {
371
372 ia64_flushrs();
373 ia64_mf();
374 *addr = val;
375 bspstore = (unsigned long *)ia64_getreg(_IA64_REG_AR_BSPSTORE);
376 rnat = ia64_getreg(_IA64_REG_AR_RNAT);
377 if (bspstore < rnat_addr)
378 rnat = rnat & (~nat_mask);
379 else
380 *rnat_addr = (*rnat_addr)&(~nat_mask);
381
382 ia64_mf();
383 ia64_loadrs();
384 ia64_setreg(_IA64_REG_AR_RNAT, rnat);
385 } else {
386 rnat = ia64_getreg(_IA64_REG_AR_RNAT);
387 *addr = val;
388 if (bspstore < rnat_addr)
389 rnat = rnat&(~nat_mask);
390 else
391 *rnat_addr = (*rnat_addr) & (~nat_mask);
392
Isaku Yamahata71205692009-03-27 15:11:57 +0900393 ia64_setreg(_IA64_REG_AR_BSPSTORE, (unsigned long)bspstore);
Xiantao Zhang60a07bb2008-04-01 16:14:28 +0800394 ia64_setreg(_IA64_REG_AR_RNAT, rnat);
395 }
396 local_irq_restore(psr);
397 ia64_setreg(_IA64_REG_AR_RSC, old_rsc);
398}
399
400void getreg(unsigned long regnum, unsigned long *val,
401 int *nat, struct kvm_pt_regs *regs)
402{
403 unsigned long addr, *unat;
404 if (regnum >= IA64_FIRST_STACKED_GR) {
405 get_rse_reg(regs, regnum, val, nat);
406 return;
407 }
408
409 /*
410 * Now look at registers in [0-31] range and init correct UNAT
411 */
412 addr = (unsigned long)regs;
413 unat = &regs->eml_unat;;
414
415 addr += gr_info[regnum];
416
417 *val = *(unsigned long *)addr;
418 /*
419 * do it only when requested
420 */
421 if (nat)
422 *nat = (*unat >> ((addr >> 3) & 0x3f)) & 0x1UL;
423}
424
425void setreg(unsigned long regnum, unsigned long val,
426 int nat, struct kvm_pt_regs *regs)
427{
428 unsigned long addr;
429 unsigned long bitmask;
430 unsigned long *unat;
431
432 /*
433 * First takes care of stacked registers
434 */
435 if (regnum >= IA64_FIRST_STACKED_GR) {
436 set_rse_reg(regs, regnum, val, nat);
437 return;
438 }
439
440 /*
441 * Now look at registers in [0-31] range and init correct UNAT
442 */
443 addr = (unsigned long)regs;
444 unat = &regs->eml_unat;
445 /*
446 * add offset from base of struct
447 * and do it !
448 */
449 addr += gr_info[regnum];
450
451 *(unsigned long *)addr = val;
452
453 /*
454 * We need to clear the corresponding UNAT bit to fully emulate the load
455 * UNAT bit_pos = GR[r3]{8:3} form EAS-2.4
456 */
457 bitmask = 1UL << ((addr >> 3) & 0x3f);
458 if (nat)
459 *unat |= bitmask;
460 else
461 *unat &= ~bitmask;
462
463}
464
465u64 vcpu_get_gr(struct kvm_vcpu *vcpu, unsigned long reg)
466{
467 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
468 u64 val;
469
470 if (!reg)
471 return 0;
472 getreg(reg, &val, 0, regs);
473 return val;
474}
475
476void vcpu_set_gr(struct kvm_vcpu *vcpu, u64 reg, u64 value, int nat)
477{
478 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
479 long sof = (regs->cr_ifs) & 0x7f;
480
481 if (!reg)
482 return;
483 if (reg >= sof + 32)
484 return;
485 setreg(reg, value, nat, regs); /* FIXME: handle NATs later*/
486}
487
488void getfpreg(unsigned long regnum, struct ia64_fpreg *fpval,
489 struct kvm_pt_regs *regs)
490{
491 /* Take floating register rotation into consideration*/
492 if (regnum >= IA64_FIRST_ROTATING_FR)
493 regnum = IA64_FIRST_ROTATING_FR + fph_index(regs, regnum);
494#define CASE_FIXED_FP(reg) \
495 case (reg) : \
496 ia64_stf_spill(fpval, reg); \
497 break
498
499 switch (regnum) {
500 CASE_FIXED_FP(0);
501 CASE_FIXED_FP(1);
502 CASE_FIXED_FP(2);
503 CASE_FIXED_FP(3);
504 CASE_FIXED_FP(4);
505 CASE_FIXED_FP(5);
506
507 CASE_FIXED_FP(6);
508 CASE_FIXED_FP(7);
509 CASE_FIXED_FP(8);
510 CASE_FIXED_FP(9);
511 CASE_FIXED_FP(10);
512 CASE_FIXED_FP(11);
513
514 CASE_FIXED_FP(12);
515 CASE_FIXED_FP(13);
516 CASE_FIXED_FP(14);
517 CASE_FIXED_FP(15);
518 CASE_FIXED_FP(16);
519 CASE_FIXED_FP(17);
520 CASE_FIXED_FP(18);
521 CASE_FIXED_FP(19);
522 CASE_FIXED_FP(20);
523 CASE_FIXED_FP(21);
524 CASE_FIXED_FP(22);
525 CASE_FIXED_FP(23);
526 CASE_FIXED_FP(24);
527 CASE_FIXED_FP(25);
528 CASE_FIXED_FP(26);
529 CASE_FIXED_FP(27);
530 CASE_FIXED_FP(28);
531 CASE_FIXED_FP(29);
532 CASE_FIXED_FP(30);
533 CASE_FIXED_FP(31);
534 CASE_FIXED_FP(32);
535 CASE_FIXED_FP(33);
536 CASE_FIXED_FP(34);
537 CASE_FIXED_FP(35);
538 CASE_FIXED_FP(36);
539 CASE_FIXED_FP(37);
540 CASE_FIXED_FP(38);
541 CASE_FIXED_FP(39);
542 CASE_FIXED_FP(40);
543 CASE_FIXED_FP(41);
544 CASE_FIXED_FP(42);
545 CASE_FIXED_FP(43);
546 CASE_FIXED_FP(44);
547 CASE_FIXED_FP(45);
548 CASE_FIXED_FP(46);
549 CASE_FIXED_FP(47);
550 CASE_FIXED_FP(48);
551 CASE_FIXED_FP(49);
552 CASE_FIXED_FP(50);
553 CASE_FIXED_FP(51);
554 CASE_FIXED_FP(52);
555 CASE_FIXED_FP(53);
556 CASE_FIXED_FP(54);
557 CASE_FIXED_FP(55);
558 CASE_FIXED_FP(56);
559 CASE_FIXED_FP(57);
560 CASE_FIXED_FP(58);
561 CASE_FIXED_FP(59);
562 CASE_FIXED_FP(60);
563 CASE_FIXED_FP(61);
564 CASE_FIXED_FP(62);
565 CASE_FIXED_FP(63);
566 CASE_FIXED_FP(64);
567 CASE_FIXED_FP(65);
568 CASE_FIXED_FP(66);
569 CASE_FIXED_FP(67);
570 CASE_FIXED_FP(68);
571 CASE_FIXED_FP(69);
572 CASE_FIXED_FP(70);
573 CASE_FIXED_FP(71);
574 CASE_FIXED_FP(72);
575 CASE_FIXED_FP(73);
576 CASE_FIXED_FP(74);
577 CASE_FIXED_FP(75);
578 CASE_FIXED_FP(76);
579 CASE_FIXED_FP(77);
580 CASE_FIXED_FP(78);
581 CASE_FIXED_FP(79);
582 CASE_FIXED_FP(80);
583 CASE_FIXED_FP(81);
584 CASE_FIXED_FP(82);
585 CASE_FIXED_FP(83);
586 CASE_FIXED_FP(84);
587 CASE_FIXED_FP(85);
588 CASE_FIXED_FP(86);
589 CASE_FIXED_FP(87);
590 CASE_FIXED_FP(88);
591 CASE_FIXED_FP(89);
592 CASE_FIXED_FP(90);
593 CASE_FIXED_FP(91);
594 CASE_FIXED_FP(92);
595 CASE_FIXED_FP(93);
596 CASE_FIXED_FP(94);
597 CASE_FIXED_FP(95);
598 CASE_FIXED_FP(96);
599 CASE_FIXED_FP(97);
600 CASE_FIXED_FP(98);
601 CASE_FIXED_FP(99);
602 CASE_FIXED_FP(100);
603 CASE_FIXED_FP(101);
604 CASE_FIXED_FP(102);
605 CASE_FIXED_FP(103);
606 CASE_FIXED_FP(104);
607 CASE_FIXED_FP(105);
608 CASE_FIXED_FP(106);
609 CASE_FIXED_FP(107);
610 CASE_FIXED_FP(108);
611 CASE_FIXED_FP(109);
612 CASE_FIXED_FP(110);
613 CASE_FIXED_FP(111);
614 CASE_FIXED_FP(112);
615 CASE_FIXED_FP(113);
616 CASE_FIXED_FP(114);
617 CASE_FIXED_FP(115);
618 CASE_FIXED_FP(116);
619 CASE_FIXED_FP(117);
620 CASE_FIXED_FP(118);
621 CASE_FIXED_FP(119);
622 CASE_FIXED_FP(120);
623 CASE_FIXED_FP(121);
624 CASE_FIXED_FP(122);
625 CASE_FIXED_FP(123);
626 CASE_FIXED_FP(124);
627 CASE_FIXED_FP(125);
628 CASE_FIXED_FP(126);
629 CASE_FIXED_FP(127);
630 }
631#undef CASE_FIXED_FP
632}
633
634void setfpreg(unsigned long regnum, struct ia64_fpreg *fpval,
635 struct kvm_pt_regs *regs)
636{
637 /* Take floating register rotation into consideration*/
638 if (regnum >= IA64_FIRST_ROTATING_FR)
639 regnum = IA64_FIRST_ROTATING_FR + fph_index(regs, regnum);
640
641#define CASE_FIXED_FP(reg) \
642 case (reg) : \
643 ia64_ldf_fill(reg, fpval); \
644 break
645
646 switch (regnum) {
647 CASE_FIXED_FP(2);
648 CASE_FIXED_FP(3);
649 CASE_FIXED_FP(4);
650 CASE_FIXED_FP(5);
651
652 CASE_FIXED_FP(6);
653 CASE_FIXED_FP(7);
654 CASE_FIXED_FP(8);
655 CASE_FIXED_FP(9);
656 CASE_FIXED_FP(10);
657 CASE_FIXED_FP(11);
658
659 CASE_FIXED_FP(12);
660 CASE_FIXED_FP(13);
661 CASE_FIXED_FP(14);
662 CASE_FIXED_FP(15);
663 CASE_FIXED_FP(16);
664 CASE_FIXED_FP(17);
665 CASE_FIXED_FP(18);
666 CASE_FIXED_FP(19);
667 CASE_FIXED_FP(20);
668 CASE_FIXED_FP(21);
669 CASE_FIXED_FP(22);
670 CASE_FIXED_FP(23);
671 CASE_FIXED_FP(24);
672 CASE_FIXED_FP(25);
673 CASE_FIXED_FP(26);
674 CASE_FIXED_FP(27);
675 CASE_FIXED_FP(28);
676 CASE_FIXED_FP(29);
677 CASE_FIXED_FP(30);
678 CASE_FIXED_FP(31);
679 CASE_FIXED_FP(32);
680 CASE_FIXED_FP(33);
681 CASE_FIXED_FP(34);
682 CASE_FIXED_FP(35);
683 CASE_FIXED_FP(36);
684 CASE_FIXED_FP(37);
685 CASE_FIXED_FP(38);
686 CASE_FIXED_FP(39);
687 CASE_FIXED_FP(40);
688 CASE_FIXED_FP(41);
689 CASE_FIXED_FP(42);
690 CASE_FIXED_FP(43);
691 CASE_FIXED_FP(44);
692 CASE_FIXED_FP(45);
693 CASE_FIXED_FP(46);
694 CASE_FIXED_FP(47);
695 CASE_FIXED_FP(48);
696 CASE_FIXED_FP(49);
697 CASE_FIXED_FP(50);
698 CASE_FIXED_FP(51);
699 CASE_FIXED_FP(52);
700 CASE_FIXED_FP(53);
701 CASE_FIXED_FP(54);
702 CASE_FIXED_FP(55);
703 CASE_FIXED_FP(56);
704 CASE_FIXED_FP(57);
705 CASE_FIXED_FP(58);
706 CASE_FIXED_FP(59);
707 CASE_FIXED_FP(60);
708 CASE_FIXED_FP(61);
709 CASE_FIXED_FP(62);
710 CASE_FIXED_FP(63);
711 CASE_FIXED_FP(64);
712 CASE_FIXED_FP(65);
713 CASE_FIXED_FP(66);
714 CASE_FIXED_FP(67);
715 CASE_FIXED_FP(68);
716 CASE_FIXED_FP(69);
717 CASE_FIXED_FP(70);
718 CASE_FIXED_FP(71);
719 CASE_FIXED_FP(72);
720 CASE_FIXED_FP(73);
721 CASE_FIXED_FP(74);
722 CASE_FIXED_FP(75);
723 CASE_FIXED_FP(76);
724 CASE_FIXED_FP(77);
725 CASE_FIXED_FP(78);
726 CASE_FIXED_FP(79);
727 CASE_FIXED_FP(80);
728 CASE_FIXED_FP(81);
729 CASE_FIXED_FP(82);
730 CASE_FIXED_FP(83);
731 CASE_FIXED_FP(84);
732 CASE_FIXED_FP(85);
733 CASE_FIXED_FP(86);
734 CASE_FIXED_FP(87);
735 CASE_FIXED_FP(88);
736 CASE_FIXED_FP(89);
737 CASE_FIXED_FP(90);
738 CASE_FIXED_FP(91);
739 CASE_FIXED_FP(92);
740 CASE_FIXED_FP(93);
741 CASE_FIXED_FP(94);
742 CASE_FIXED_FP(95);
743 CASE_FIXED_FP(96);
744 CASE_FIXED_FP(97);
745 CASE_FIXED_FP(98);
746 CASE_FIXED_FP(99);
747 CASE_FIXED_FP(100);
748 CASE_FIXED_FP(101);
749 CASE_FIXED_FP(102);
750 CASE_FIXED_FP(103);
751 CASE_FIXED_FP(104);
752 CASE_FIXED_FP(105);
753 CASE_FIXED_FP(106);
754 CASE_FIXED_FP(107);
755 CASE_FIXED_FP(108);
756 CASE_FIXED_FP(109);
757 CASE_FIXED_FP(110);
758 CASE_FIXED_FP(111);
759 CASE_FIXED_FP(112);
760 CASE_FIXED_FP(113);
761 CASE_FIXED_FP(114);
762 CASE_FIXED_FP(115);
763 CASE_FIXED_FP(116);
764 CASE_FIXED_FP(117);
765 CASE_FIXED_FP(118);
766 CASE_FIXED_FP(119);
767 CASE_FIXED_FP(120);
768 CASE_FIXED_FP(121);
769 CASE_FIXED_FP(122);
770 CASE_FIXED_FP(123);
771 CASE_FIXED_FP(124);
772 CASE_FIXED_FP(125);
773 CASE_FIXED_FP(126);
774 CASE_FIXED_FP(127);
775 }
776}
777
778void vcpu_get_fpreg(struct kvm_vcpu *vcpu, unsigned long reg,
779 struct ia64_fpreg *val)
780{
781 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
782
783 getfpreg(reg, val, regs); /* FIXME: handle NATs later*/
784}
785
786void vcpu_set_fpreg(struct kvm_vcpu *vcpu, unsigned long reg,
787 struct ia64_fpreg *val)
788{
789 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
790
791 if (reg > 1)
792 setfpreg(reg, val, regs); /* FIXME: handle NATs later*/
793}
794
795/************************************************************************
796 * lsapic timer
797 ***********************************************************************/
798u64 vcpu_get_itc(struct kvm_vcpu *vcpu)
799{
800 unsigned long guest_itc;
801 guest_itc = VMX(vcpu, itc_offset) + ia64_getreg(_IA64_REG_AR_ITC);
802
803 if (guest_itc >= VMX(vcpu, last_itc)) {
804 VMX(vcpu, last_itc) = guest_itc;
805 return guest_itc;
806 } else
807 return VMX(vcpu, last_itc);
808}
809
810static inline void vcpu_set_itm(struct kvm_vcpu *vcpu, u64 val);
811static void vcpu_set_itc(struct kvm_vcpu *vcpu, u64 val)
812{
813 struct kvm_vcpu *v;
814 int i;
815 long itc_offset = val - ia64_getreg(_IA64_REG_AR_ITC);
816 unsigned long vitv = VCPU(vcpu, itv);
817
818 if (vcpu->vcpu_id == 0) {
Xiantao Zhanga917f7a2008-10-23 14:56:44 +0800819 for (i = 0; i < KVM_MAX_VCPUS; i++) {
820 v = (struct kvm_vcpu *)((char *)vcpu +
821 sizeof(struct kvm_vcpu_data) * i);
Xiantao Zhang60a07bb2008-04-01 16:14:28 +0800822 VMX(v, itc_offset) = itc_offset;
823 VMX(v, last_itc) = 0;
824 }
825 }
826 VMX(vcpu, last_itc) = 0;
827 if (VCPU(vcpu, itm) <= val) {
828 VMX(vcpu, itc_check) = 0;
829 vcpu_unpend_interrupt(vcpu, vitv);
830 } else {
831 VMX(vcpu, itc_check) = 1;
832 vcpu_set_itm(vcpu, VCPU(vcpu, itm));
833 }
834
835}
836
837static inline u64 vcpu_get_itm(struct kvm_vcpu *vcpu)
838{
839 return ((u64)VCPU(vcpu, itm));
840}
841
842static inline void vcpu_set_itm(struct kvm_vcpu *vcpu, u64 val)
843{
844 unsigned long vitv = VCPU(vcpu, itv);
845 VCPU(vcpu, itm) = val;
846
847 if (val > vcpu_get_itc(vcpu)) {
848 VMX(vcpu, itc_check) = 1;
849 vcpu_unpend_interrupt(vcpu, vitv);
850 VMX(vcpu, timer_pending) = 0;
851 } else
852 VMX(vcpu, itc_check) = 0;
853}
854
855#define ITV_VECTOR(itv) (itv&0xff)
856#define ITV_IRQ_MASK(itv) (itv&(1<<16))
857
858static inline void vcpu_set_itv(struct kvm_vcpu *vcpu, u64 val)
859{
860 VCPU(vcpu, itv) = val;
861 if (!ITV_IRQ_MASK(val) && vcpu->arch.timer_pending) {
862 vcpu_pend_interrupt(vcpu, ITV_VECTOR(val));
863 vcpu->arch.timer_pending = 0;
864 }
865}
866
867static inline void vcpu_set_eoi(struct kvm_vcpu *vcpu, u64 val)
868{
869 int vec;
870
871 vec = highest_inservice_irq(vcpu);
872 if (vec == NULL_VECTOR)
873 return;
874 VMX(vcpu, insvc[vec >> 6]) &= ~(1UL << (vec & 63));
875 VCPU(vcpu, eoi) = 0;
876 vcpu->arch.irq_new_pending = 1;
877
878}
879
880/* See Table 5-8 in SDM vol2 for the definition */
881int irq_masked(struct kvm_vcpu *vcpu, int h_pending, int h_inservice)
882{
883 union ia64_tpr vtpr;
884
885 vtpr.val = VCPU(vcpu, tpr);
886
887 if (h_inservice == NMI_VECTOR)
888 return IRQ_MASKED_BY_INSVC;
889
890 if (h_pending == NMI_VECTOR) {
891 /* Non Maskable Interrupt */
892 return IRQ_NO_MASKED;
893 }
894
895 if (h_inservice == ExtINT_VECTOR)
896 return IRQ_MASKED_BY_INSVC;
897
898 if (h_pending == ExtINT_VECTOR) {
899 if (vtpr.mmi) {
900 /* mask all external IRQ */
901 return IRQ_MASKED_BY_VTPR;
902 } else
903 return IRQ_NO_MASKED;
904 }
905
906 if (is_higher_irq(h_pending, h_inservice)) {
907 if (is_higher_class(h_pending, vtpr.mic + (vtpr.mmi << 4)))
908 return IRQ_NO_MASKED;
909 else
910 return IRQ_MASKED_BY_VTPR;
911 } else {
912 return IRQ_MASKED_BY_INSVC;
913 }
914}
915
916void vcpu_pend_interrupt(struct kvm_vcpu *vcpu, u8 vec)
917{
918 long spsr;
919 int ret;
920
921 local_irq_save(spsr);
922 ret = test_and_set_bit(vec, &VCPU(vcpu, irr[0]));
923 local_irq_restore(spsr);
924
925 vcpu->arch.irq_new_pending = 1;
926}
927
928void vcpu_unpend_interrupt(struct kvm_vcpu *vcpu, u8 vec)
929{
930 long spsr;
931 int ret;
932
933 local_irq_save(spsr);
934 ret = test_and_clear_bit(vec, &VCPU(vcpu, irr[0]));
935 local_irq_restore(spsr);
936 if (ret) {
937 vcpu->arch.irq_new_pending = 1;
938 wmb();
939 }
940}
941
942void update_vhpi(struct kvm_vcpu *vcpu, int vec)
943{
944 u64 vhpi;
945
946 if (vec == NULL_VECTOR)
947 vhpi = 0;
948 else if (vec == NMI_VECTOR)
949 vhpi = 32;
950 else if (vec == ExtINT_VECTOR)
951 vhpi = 16;
952 else
953 vhpi = vec >> 4;
954
955 VCPU(vcpu, vhpi) = vhpi;
956 if (VCPU(vcpu, vac).a_int)
957 ia64_call_vsa(PAL_VPS_SET_PENDING_INTERRUPT,
958 (u64)vcpu->arch.vpd, 0, 0, 0, 0, 0, 0);
959}
960
961u64 vcpu_get_ivr(struct kvm_vcpu *vcpu)
962{
963 int vec, h_inservice, mask;
964
965 vec = highest_pending_irq(vcpu);
966 h_inservice = highest_inservice_irq(vcpu);
967 mask = irq_masked(vcpu, vec, h_inservice);
968 if (vec == NULL_VECTOR || mask == IRQ_MASKED_BY_INSVC) {
969 if (VCPU(vcpu, vhpi))
970 update_vhpi(vcpu, NULL_VECTOR);
971 return IA64_SPURIOUS_INT_VECTOR;
972 }
973 if (mask == IRQ_MASKED_BY_VTPR) {
974 update_vhpi(vcpu, vec);
975 return IA64_SPURIOUS_INT_VECTOR;
976 }
977 VMX(vcpu, insvc[vec >> 6]) |= (1UL << (vec & 63));
978 vcpu_unpend_interrupt(vcpu, vec);
979 return (u64)vec;
980}
981
982/**************************************************************************
983 Privileged operation emulation routines
984 **************************************************************************/
985u64 vcpu_thash(struct kvm_vcpu *vcpu, u64 vadr)
986{
987 union ia64_pta vpta;
988 union ia64_rr vrr;
989 u64 pval;
990 u64 vhpt_offset;
991
992 vpta.val = vcpu_get_pta(vcpu);
993 vrr.val = vcpu_get_rr(vcpu, vadr);
994 vhpt_offset = ((vadr >> vrr.ps) << 3) & ((1UL << (vpta.size)) - 1);
995 if (vpta.vf) {
996 pval = ia64_call_vsa(PAL_VPS_THASH, vadr, vrr.val,
997 vpta.val, 0, 0, 0, 0);
998 } else {
999 pval = (vadr & VRN_MASK) | vhpt_offset |
1000 (vpta.val << 3 >> (vpta.size + 3) << (vpta.size));
1001 }
1002 return pval;
1003}
1004
1005u64 vcpu_ttag(struct kvm_vcpu *vcpu, u64 vadr)
1006{
1007 union ia64_rr vrr;
1008 union ia64_pta vpta;
1009 u64 pval;
1010
1011 vpta.val = vcpu_get_pta(vcpu);
1012 vrr.val = vcpu_get_rr(vcpu, vadr);
1013 if (vpta.vf) {
1014 pval = ia64_call_vsa(PAL_VPS_TTAG, vadr, vrr.val,
1015 0, 0, 0, 0, 0);
1016 } else
1017 pval = 1;
1018
1019 return pval;
1020}
1021
1022u64 vcpu_tak(struct kvm_vcpu *vcpu, u64 vadr)
1023{
1024 struct thash_data *data;
1025 union ia64_pta vpta;
1026 u64 key;
1027
1028 vpta.val = vcpu_get_pta(vcpu);
1029 if (vpta.vf == 0) {
1030 key = 1;
1031 return key;
1032 }
1033 data = vtlb_lookup(vcpu, vadr, D_TLB);
1034 if (!data || !data->p)
1035 key = 1;
1036 else
1037 key = data->key;
1038
1039 return key;
1040}
1041
1042
1043
1044void kvm_thash(struct kvm_vcpu *vcpu, INST64 inst)
1045{
1046 unsigned long thash, vadr;
1047
1048 vadr = vcpu_get_gr(vcpu, inst.M46.r3);
1049 thash = vcpu_thash(vcpu, vadr);
1050 vcpu_set_gr(vcpu, inst.M46.r1, thash, 0);
1051}
1052
1053
1054void kvm_ttag(struct kvm_vcpu *vcpu, INST64 inst)
1055{
1056 unsigned long tag, vadr;
1057
1058 vadr = vcpu_get_gr(vcpu, inst.M46.r3);
1059 tag = vcpu_ttag(vcpu, vadr);
1060 vcpu_set_gr(vcpu, inst.M46.r1, tag, 0);
1061}
1062
1063int vcpu_tpa(struct kvm_vcpu *vcpu, u64 vadr, u64 *padr)
1064{
1065 struct thash_data *data;
1066 union ia64_isr visr, pt_isr;
1067 struct kvm_pt_regs *regs;
1068 struct ia64_psr vpsr;
1069
1070 regs = vcpu_regs(vcpu);
1071 pt_isr.val = VMX(vcpu, cr_isr);
1072 visr.val = 0;
1073 visr.ei = pt_isr.ei;
1074 visr.ir = pt_isr.ir;
1075 vpsr = *(struct ia64_psr *)&VCPU(vcpu, vpsr);
1076 visr.na = 1;
1077
1078 data = vhpt_lookup(vadr);
1079 if (data) {
1080 if (data->p == 0) {
1081 vcpu_set_isr(vcpu, visr.val);
1082 data_page_not_present(vcpu, vadr);
1083 return IA64_FAULT;
1084 } else if (data->ma == VA_MATTR_NATPAGE) {
1085 vcpu_set_isr(vcpu, visr.val);
1086 dnat_page_consumption(vcpu, vadr);
1087 return IA64_FAULT;
1088 } else {
1089 *padr = (data->gpaddr >> data->ps << data->ps) |
1090 (vadr & (PSIZE(data->ps) - 1));
1091 return IA64_NO_FAULT;
1092 }
1093 }
1094
1095 data = vtlb_lookup(vcpu, vadr, D_TLB);
1096 if (data) {
1097 if (data->p == 0) {
1098 vcpu_set_isr(vcpu, visr.val);
1099 data_page_not_present(vcpu, vadr);
1100 return IA64_FAULT;
1101 } else if (data->ma == VA_MATTR_NATPAGE) {
1102 vcpu_set_isr(vcpu, visr.val);
1103 dnat_page_consumption(vcpu, vadr);
1104 return IA64_FAULT;
1105 } else{
1106 *padr = ((data->ppn >> (data->ps - 12)) << data->ps)
1107 | (vadr & (PSIZE(data->ps) - 1));
1108 return IA64_NO_FAULT;
1109 }
1110 }
1111 if (!vhpt_enabled(vcpu, vadr, NA_REF)) {
1112 if (vpsr.ic) {
1113 vcpu_set_isr(vcpu, visr.val);
1114 alt_dtlb(vcpu, vadr);
1115 return IA64_FAULT;
1116 } else {
1117 nested_dtlb(vcpu);
1118 return IA64_FAULT;
1119 }
1120 } else {
1121 if (vpsr.ic) {
1122 vcpu_set_isr(vcpu, visr.val);
1123 dvhpt_fault(vcpu, vadr);
1124 return IA64_FAULT;
1125 } else{
1126 nested_dtlb(vcpu);
1127 return IA64_FAULT;
1128 }
1129 }
1130
1131 return IA64_NO_FAULT;
1132}
1133
1134
1135int kvm_tpa(struct kvm_vcpu *vcpu, INST64 inst)
1136{
1137 unsigned long r1, r3;
1138
1139 r3 = vcpu_get_gr(vcpu, inst.M46.r3);
1140
1141 if (vcpu_tpa(vcpu, r3, &r1))
1142 return IA64_FAULT;
1143
1144 vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
1145 return(IA64_NO_FAULT);
1146}
1147
1148void kvm_tak(struct kvm_vcpu *vcpu, INST64 inst)
1149{
1150 unsigned long r1, r3;
1151
1152 r3 = vcpu_get_gr(vcpu, inst.M46.r3);
1153 r1 = vcpu_tak(vcpu, r3);
1154 vcpu_set_gr(vcpu, inst.M46.r1, r1, 0);
1155}
1156
1157
1158/************************************
1159 * Insert/Purge translation register/cache
1160 ************************************/
1161void vcpu_itc_i(struct kvm_vcpu *vcpu, u64 pte, u64 itir, u64 ifa)
1162{
1163 thash_purge_and_insert(vcpu, pte, itir, ifa, I_TLB);
1164}
1165
1166void vcpu_itc_d(struct kvm_vcpu *vcpu, u64 pte, u64 itir, u64 ifa)
1167{
1168 thash_purge_and_insert(vcpu, pte, itir, ifa, D_TLB);
1169}
1170
1171void vcpu_itr_i(struct kvm_vcpu *vcpu, u64 slot, u64 pte, u64 itir, u64 ifa)
1172{
1173 u64 ps, va, rid;
1174 struct thash_data *p_itr;
1175
1176 ps = itir_ps(itir);
1177 va = PAGEALIGN(ifa, ps);
1178 pte &= ~PAGE_FLAGS_RV_MASK;
1179 rid = vcpu_get_rr(vcpu, ifa);
1180 rid = rid & RR_RID_MASK;
1181 p_itr = (struct thash_data *)&vcpu->arch.itrs[slot];
1182 vcpu_set_tr(p_itr, pte, itir, va, rid);
1183 vcpu_quick_region_set(VMX(vcpu, itr_regions), va);
1184}
1185
1186
1187void vcpu_itr_d(struct kvm_vcpu *vcpu, u64 slot, u64 pte, u64 itir, u64 ifa)
1188{
1189 u64 gpfn;
1190 u64 ps, va, rid;
1191 struct thash_data *p_dtr;
1192
1193 ps = itir_ps(itir);
1194 va = PAGEALIGN(ifa, ps);
1195 pte &= ~PAGE_FLAGS_RV_MASK;
1196
1197 if (ps != _PAGE_SIZE_16M)
1198 thash_purge_entries(vcpu, va, ps);
1199 gpfn = (pte & _PAGE_PPN_MASK) >> PAGE_SHIFT;
1200 if (__gpfn_is_io(gpfn))
1201 pte |= VTLB_PTE_IO;
1202 rid = vcpu_get_rr(vcpu, va);
1203 rid = rid & RR_RID_MASK;
1204 p_dtr = (struct thash_data *)&vcpu->arch.dtrs[slot];
1205 vcpu_set_tr((struct thash_data *)&vcpu->arch.dtrs[slot],
1206 pte, itir, va, rid);
1207 vcpu_quick_region_set(VMX(vcpu, dtr_regions), va);
1208}
1209
1210void vcpu_ptr_d(struct kvm_vcpu *vcpu, u64 ifa, u64 ps)
1211{
1212 int index;
1213 u64 va;
1214
1215 va = PAGEALIGN(ifa, ps);
1216 while ((index = vtr_find_overlap(vcpu, va, ps, D_TLB)) >= 0)
1217 vcpu->arch.dtrs[index].page_flags = 0;
1218
1219 thash_purge_entries(vcpu, va, ps);
1220}
1221
1222void vcpu_ptr_i(struct kvm_vcpu *vcpu, u64 ifa, u64 ps)
1223{
1224 int index;
1225 u64 va;
1226
1227 va = PAGEALIGN(ifa, ps);
1228 while ((index = vtr_find_overlap(vcpu, va, ps, I_TLB)) >= 0)
1229 vcpu->arch.itrs[index].page_flags = 0;
1230
1231 thash_purge_entries(vcpu, va, ps);
1232}
1233
1234void vcpu_ptc_l(struct kvm_vcpu *vcpu, u64 va, u64 ps)
1235{
1236 va = PAGEALIGN(va, ps);
1237 thash_purge_entries(vcpu, va, ps);
1238}
1239
1240void vcpu_ptc_e(struct kvm_vcpu *vcpu, u64 va)
1241{
1242 thash_purge_all(vcpu);
1243}
1244
1245void vcpu_ptc_ga(struct kvm_vcpu *vcpu, u64 va, u64 ps)
1246{
1247 struct exit_ctl_data *p = &vcpu->arch.exit_data;
1248 long psr;
1249 local_irq_save(psr);
1250 p->exit_reason = EXIT_REASON_PTC_G;
1251
1252 p->u.ptc_g_data.rr = vcpu_get_rr(vcpu, va);
1253 p->u.ptc_g_data.vaddr = va;
1254 p->u.ptc_g_data.ps = ps;
1255 vmm_transition(vcpu);
1256 /* Do Local Purge Here*/
1257 vcpu_ptc_l(vcpu, va, ps);
1258 local_irq_restore(psr);
1259}
1260
1261
1262void vcpu_ptc_g(struct kvm_vcpu *vcpu, u64 va, u64 ps)
1263{
1264 vcpu_ptc_ga(vcpu, va, ps);
1265}
1266
1267void kvm_ptc_e(struct kvm_vcpu *vcpu, INST64 inst)
1268{
1269 unsigned long ifa;
1270
1271 ifa = vcpu_get_gr(vcpu, inst.M45.r3);
1272 vcpu_ptc_e(vcpu, ifa);
1273}
1274
1275void kvm_ptc_g(struct kvm_vcpu *vcpu, INST64 inst)
1276{
1277 unsigned long ifa, itir;
1278
1279 ifa = vcpu_get_gr(vcpu, inst.M45.r3);
1280 itir = vcpu_get_gr(vcpu, inst.M45.r2);
1281 vcpu_ptc_g(vcpu, ifa, itir_ps(itir));
1282}
1283
1284void kvm_ptc_ga(struct kvm_vcpu *vcpu, INST64 inst)
1285{
1286 unsigned long ifa, itir;
1287
1288 ifa = vcpu_get_gr(vcpu, inst.M45.r3);
1289 itir = vcpu_get_gr(vcpu, inst.M45.r2);
1290 vcpu_ptc_ga(vcpu, ifa, itir_ps(itir));
1291}
1292
1293void kvm_ptc_l(struct kvm_vcpu *vcpu, INST64 inst)
1294{
1295 unsigned long ifa, itir;
1296
1297 ifa = vcpu_get_gr(vcpu, inst.M45.r3);
1298 itir = vcpu_get_gr(vcpu, inst.M45.r2);
1299 vcpu_ptc_l(vcpu, ifa, itir_ps(itir));
1300}
1301
1302void kvm_ptr_d(struct kvm_vcpu *vcpu, INST64 inst)
1303{
1304 unsigned long ifa, itir;
1305
1306 ifa = vcpu_get_gr(vcpu, inst.M45.r3);
1307 itir = vcpu_get_gr(vcpu, inst.M45.r2);
1308 vcpu_ptr_d(vcpu, ifa, itir_ps(itir));
1309}
1310
1311void kvm_ptr_i(struct kvm_vcpu *vcpu, INST64 inst)
1312{
1313 unsigned long ifa, itir;
1314
1315 ifa = vcpu_get_gr(vcpu, inst.M45.r3);
1316 itir = vcpu_get_gr(vcpu, inst.M45.r2);
1317 vcpu_ptr_i(vcpu, ifa, itir_ps(itir));
1318}
1319
1320void kvm_itr_d(struct kvm_vcpu *vcpu, INST64 inst)
1321{
1322 unsigned long itir, ifa, pte, slot;
1323
1324 slot = vcpu_get_gr(vcpu, inst.M45.r3);
1325 pte = vcpu_get_gr(vcpu, inst.M45.r2);
1326 itir = vcpu_get_itir(vcpu);
1327 ifa = vcpu_get_ifa(vcpu);
1328 vcpu_itr_d(vcpu, slot, pte, itir, ifa);
1329}
1330
1331
1332
1333void kvm_itr_i(struct kvm_vcpu *vcpu, INST64 inst)
1334{
1335 unsigned long itir, ifa, pte, slot;
1336
1337 slot = vcpu_get_gr(vcpu, inst.M45.r3);
1338 pte = vcpu_get_gr(vcpu, inst.M45.r2);
1339 itir = vcpu_get_itir(vcpu);
1340 ifa = vcpu_get_ifa(vcpu);
1341 vcpu_itr_i(vcpu, slot, pte, itir, ifa);
1342}
1343
1344void kvm_itc_d(struct kvm_vcpu *vcpu, INST64 inst)
1345{
1346 unsigned long itir, ifa, pte;
1347
1348 itir = vcpu_get_itir(vcpu);
1349 ifa = vcpu_get_ifa(vcpu);
1350 pte = vcpu_get_gr(vcpu, inst.M45.r2);
1351 vcpu_itc_d(vcpu, pte, itir, ifa);
1352}
1353
1354void kvm_itc_i(struct kvm_vcpu *vcpu, INST64 inst)
1355{
1356 unsigned long itir, ifa, pte;
1357
1358 itir = vcpu_get_itir(vcpu);
1359 ifa = vcpu_get_ifa(vcpu);
1360 pte = vcpu_get_gr(vcpu, inst.M45.r2);
1361 vcpu_itc_i(vcpu, pte, itir, ifa);
1362}
1363
1364/*************************************
1365 * Moves to semi-privileged registers
1366 *************************************/
1367
1368void kvm_mov_to_ar_imm(struct kvm_vcpu *vcpu, INST64 inst)
1369{
1370 unsigned long imm;
1371
1372 if (inst.M30.s)
1373 imm = -inst.M30.imm;
1374 else
1375 imm = inst.M30.imm;
1376
1377 vcpu_set_itc(vcpu, imm);
1378}
1379
1380void kvm_mov_to_ar_reg(struct kvm_vcpu *vcpu, INST64 inst)
1381{
1382 unsigned long r2;
1383
1384 r2 = vcpu_get_gr(vcpu, inst.M29.r2);
1385 vcpu_set_itc(vcpu, r2);
1386}
1387
1388
1389void kvm_mov_from_ar_reg(struct kvm_vcpu *vcpu, INST64 inst)
1390{
1391 unsigned long r1;
1392
1393 r1 = vcpu_get_itc(vcpu);
1394 vcpu_set_gr(vcpu, inst.M31.r1, r1, 0);
1395}
1396/**************************************************************************
1397 struct kvm_vcpu*protection key register access routines
1398 **************************************************************************/
1399
1400unsigned long vcpu_get_pkr(struct kvm_vcpu *vcpu, unsigned long reg)
1401{
1402 return ((unsigned long)ia64_get_pkr(reg));
1403}
1404
1405void vcpu_set_pkr(struct kvm_vcpu *vcpu, unsigned long reg, unsigned long val)
1406{
1407 ia64_set_pkr(reg, val);
1408}
1409
1410
1411unsigned long vcpu_get_itir_on_fault(struct kvm_vcpu *vcpu, unsigned long ifa)
1412{
1413 union ia64_rr rr, rr1;
1414
1415 rr.val = vcpu_get_rr(vcpu, ifa);
1416 rr1.val = 0;
1417 rr1.ps = rr.ps;
1418 rr1.rid = rr.rid;
1419 return (rr1.val);
1420}
1421
1422
1423
1424/********************************
1425 * Moves to privileged registers
1426 ********************************/
1427unsigned long vcpu_set_rr(struct kvm_vcpu *vcpu, unsigned long reg,
1428 unsigned long val)
1429{
1430 union ia64_rr oldrr, newrr;
1431 unsigned long rrval;
1432 struct exit_ctl_data *p = &vcpu->arch.exit_data;
1433 unsigned long psr;
1434
1435 oldrr.val = vcpu_get_rr(vcpu, reg);
1436 newrr.val = val;
1437 vcpu->arch.vrr[reg >> VRN_SHIFT] = val;
1438
1439 switch ((unsigned long)(reg >> VRN_SHIFT)) {
1440 case VRN6:
1441 vcpu->arch.vmm_rr = vrrtomrr(val);
1442 local_irq_save(psr);
1443 p->exit_reason = EXIT_REASON_SWITCH_RR6;
1444 vmm_transition(vcpu);
1445 local_irq_restore(psr);
1446 break;
1447 case VRN4:
1448 rrval = vrrtomrr(val);
1449 vcpu->arch.metaphysical_saved_rr4 = rrval;
1450 if (!is_physical_mode(vcpu))
1451 ia64_set_rr(reg, rrval);
1452 break;
1453 case VRN0:
1454 rrval = vrrtomrr(val);
1455 vcpu->arch.metaphysical_saved_rr0 = rrval;
1456 if (!is_physical_mode(vcpu))
1457 ia64_set_rr(reg, rrval);
1458 break;
1459 default:
1460 ia64_set_rr(reg, vrrtomrr(val));
1461 break;
1462 }
1463
1464 return (IA64_NO_FAULT);
1465}
1466
1467
1468
1469void kvm_mov_to_rr(struct kvm_vcpu *vcpu, INST64 inst)
1470{
1471 unsigned long r3, r2;
1472
1473 r3 = vcpu_get_gr(vcpu, inst.M42.r3);
1474 r2 = vcpu_get_gr(vcpu, inst.M42.r2);
1475 vcpu_set_rr(vcpu, r3, r2);
1476}
1477
1478void kvm_mov_to_dbr(struct kvm_vcpu *vcpu, INST64 inst)
1479{
1480}
1481
1482void kvm_mov_to_ibr(struct kvm_vcpu *vcpu, INST64 inst)
1483{
1484}
1485
1486void kvm_mov_to_pmc(struct kvm_vcpu *vcpu, INST64 inst)
1487{
1488 unsigned long r3, r2;
1489
1490 r3 = vcpu_get_gr(vcpu, inst.M42.r3);
1491 r2 = vcpu_get_gr(vcpu, inst.M42.r2);
1492 vcpu_set_pmc(vcpu, r3, r2);
1493}
1494
1495void kvm_mov_to_pmd(struct kvm_vcpu *vcpu, INST64 inst)
1496{
1497 unsigned long r3, r2;
1498
1499 r3 = vcpu_get_gr(vcpu, inst.M42.r3);
1500 r2 = vcpu_get_gr(vcpu, inst.M42.r2);
1501 vcpu_set_pmd(vcpu, r3, r2);
1502}
1503
1504void kvm_mov_to_pkr(struct kvm_vcpu *vcpu, INST64 inst)
1505{
1506 u64 r3, r2;
1507
1508 r3 = vcpu_get_gr(vcpu, inst.M42.r3);
1509 r2 = vcpu_get_gr(vcpu, inst.M42.r2);
1510 vcpu_set_pkr(vcpu, r3, r2);
1511}
1512
1513
1514
1515void kvm_mov_from_rr(struct kvm_vcpu *vcpu, INST64 inst)
1516{
1517 unsigned long r3, r1;
1518
1519 r3 = vcpu_get_gr(vcpu, inst.M43.r3);
1520 r1 = vcpu_get_rr(vcpu, r3);
1521 vcpu_set_gr(vcpu, inst.M43.r1, r1, 0);
1522}
1523
1524void kvm_mov_from_pkr(struct kvm_vcpu *vcpu, INST64 inst)
1525{
1526 unsigned long r3, r1;
1527
1528 r3 = vcpu_get_gr(vcpu, inst.M43.r3);
1529 r1 = vcpu_get_pkr(vcpu, r3);
1530 vcpu_set_gr(vcpu, inst.M43.r1, r1, 0);
1531}
1532
1533void kvm_mov_from_dbr(struct kvm_vcpu *vcpu, INST64 inst)
1534{
1535 unsigned long r3, r1;
1536
1537 r3 = vcpu_get_gr(vcpu, inst.M43.r3);
1538 r1 = vcpu_get_dbr(vcpu, r3);
1539 vcpu_set_gr(vcpu, inst.M43.r1, r1, 0);
1540}
1541
1542void kvm_mov_from_ibr(struct kvm_vcpu *vcpu, INST64 inst)
1543{
1544 unsigned long r3, r1;
1545
1546 r3 = vcpu_get_gr(vcpu, inst.M43.r3);
1547 r1 = vcpu_get_ibr(vcpu, r3);
1548 vcpu_set_gr(vcpu, inst.M43.r1, r1, 0);
1549}
1550
1551void kvm_mov_from_pmc(struct kvm_vcpu *vcpu, INST64 inst)
1552{
1553 unsigned long r3, r1;
1554
1555 r3 = vcpu_get_gr(vcpu, inst.M43.r3);
1556 r1 = vcpu_get_pmc(vcpu, r3);
1557 vcpu_set_gr(vcpu, inst.M43.r1, r1, 0);
1558}
1559
1560
1561unsigned long vcpu_get_cpuid(struct kvm_vcpu *vcpu, unsigned long reg)
1562{
1563 /* FIXME: This could get called as a result of a rsvd-reg fault */
1564 if (reg > (ia64_get_cpuid(3) & 0xff))
1565 return 0;
1566 else
1567 return ia64_get_cpuid(reg);
1568}
1569
1570void kvm_mov_from_cpuid(struct kvm_vcpu *vcpu, INST64 inst)
1571{
1572 unsigned long r3, r1;
1573
1574 r3 = vcpu_get_gr(vcpu, inst.M43.r3);
1575 r1 = vcpu_get_cpuid(vcpu, r3);
1576 vcpu_set_gr(vcpu, inst.M43.r1, r1, 0);
1577}
1578
1579void vcpu_set_tpr(struct kvm_vcpu *vcpu, unsigned long val)
1580{
1581 VCPU(vcpu, tpr) = val;
1582 vcpu->arch.irq_check = 1;
1583}
1584
1585unsigned long kvm_mov_to_cr(struct kvm_vcpu *vcpu, INST64 inst)
1586{
1587 unsigned long r2;
1588
1589 r2 = vcpu_get_gr(vcpu, inst.M32.r2);
1590 VCPU(vcpu, vcr[inst.M32.cr3]) = r2;
1591
1592 switch (inst.M32.cr3) {
1593 case 0:
1594 vcpu_set_dcr(vcpu, r2);
1595 break;
1596 case 1:
1597 vcpu_set_itm(vcpu, r2);
1598 break;
1599 case 66:
1600 vcpu_set_tpr(vcpu, r2);
1601 break;
1602 case 67:
1603 vcpu_set_eoi(vcpu, r2);
1604 break;
1605 default:
1606 break;
1607 }
1608
1609 return 0;
1610}
1611
1612
1613unsigned long kvm_mov_from_cr(struct kvm_vcpu *vcpu, INST64 inst)
1614{
1615 unsigned long tgt = inst.M33.r1;
1616 unsigned long val;
1617
1618 switch (inst.M33.cr3) {
1619 case 65:
1620 val = vcpu_get_ivr(vcpu);
1621 vcpu_set_gr(vcpu, tgt, val, 0);
1622 break;
1623
1624 case 67:
1625 vcpu_set_gr(vcpu, tgt, 0L, 0);
1626 break;
1627 default:
1628 val = VCPU(vcpu, vcr[inst.M33.cr3]);
1629 vcpu_set_gr(vcpu, tgt, val, 0);
1630 break;
1631 }
1632
1633 return 0;
1634}
1635
1636
1637
1638void vcpu_set_psr(struct kvm_vcpu *vcpu, unsigned long val)
1639{
1640
1641 unsigned long mask;
1642 struct kvm_pt_regs *regs;
1643 struct ia64_psr old_psr, new_psr;
1644
1645 old_psr = *(struct ia64_psr *)&VCPU(vcpu, vpsr);
1646
1647 regs = vcpu_regs(vcpu);
1648 /* We only support guest as:
1649 * vpsr.pk = 0
1650 * vpsr.is = 0
1651 * Otherwise panic
1652 */
1653 if (val & (IA64_PSR_PK | IA64_PSR_IS | IA64_PSR_VM))
Xiantao Zhang5e2be192008-11-21 10:46:12 +08001654 panic_vm(vcpu, "Only support guests with vpsr.pk =0 \
1655 & vpsr.is=0\n");
Xiantao Zhang60a07bb2008-04-01 16:14:28 +08001656
1657 /*
1658 * For those IA64_PSR bits: id/da/dd/ss/ed/ia
1659 * Since these bits will become 0, after success execution of each
1660 * instruction, we will change set them to mIA64_PSR
1661 */
1662 VCPU(vcpu, vpsr) = val
1663 & (~(IA64_PSR_ID | IA64_PSR_DA | IA64_PSR_DD |
1664 IA64_PSR_SS | IA64_PSR_ED | IA64_PSR_IA));
1665
1666 if (!old_psr.i && (val & IA64_PSR_I)) {
1667 /* vpsr.i 0->1 */
1668 vcpu->arch.irq_check = 1;
1669 }
1670 new_psr = *(struct ia64_psr *)&VCPU(vcpu, vpsr);
1671
1672 /*
1673 * All vIA64_PSR bits shall go to mPSR (v->tf->tf_special.psr)
1674 * , except for the following bits:
1675 * ic/i/dt/si/rt/mc/it/bn/vm
1676 */
1677 mask = IA64_PSR_IC + IA64_PSR_I + IA64_PSR_DT + IA64_PSR_SI +
1678 IA64_PSR_RT + IA64_PSR_MC + IA64_PSR_IT + IA64_PSR_BN +
1679 IA64_PSR_VM;
1680
1681 regs->cr_ipsr = (regs->cr_ipsr & mask) | (val & (~mask));
1682
1683 check_mm_mode_switch(vcpu, old_psr, new_psr);
1684
1685 return ;
1686}
1687
1688unsigned long vcpu_cover(struct kvm_vcpu *vcpu)
1689{
1690 struct ia64_psr vpsr;
1691
1692 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
1693 vpsr = *(struct ia64_psr *)&VCPU(vcpu, vpsr);
1694
1695 if (!vpsr.ic)
1696 VCPU(vcpu, ifs) = regs->cr_ifs;
1697 regs->cr_ifs = IA64_IFS_V;
1698 return (IA64_NO_FAULT);
1699}
1700
1701
1702
1703/**************************************************************************
1704 VCPU banked general register access routines
1705 **************************************************************************/
1706#define vcpu_bsw0_unat(i, b0unat, b1unat, runat, VMM_PT_REGS_R16_SLOT) \
1707 do { \
1708 __asm__ __volatile__ ( \
1709 ";;extr.u %0 = %3,%6,16;;\n" \
1710 "dep %1 = %0, %1, 0, 16;;\n" \
1711 "st8 [%4] = %1\n" \
1712 "extr.u %0 = %2, 16, 16;;\n" \
1713 "dep %3 = %0, %3, %6, 16;;\n" \
1714 "st8 [%5] = %3\n" \
1715 ::"r"(i), "r"(*b1unat), "r"(*b0unat), \
1716 "r"(*runat), "r"(b1unat), "r"(runat), \
1717 "i"(VMM_PT_REGS_R16_SLOT) : "memory"); \
1718 } while (0)
1719
1720void vcpu_bsw0(struct kvm_vcpu *vcpu)
1721{
1722 unsigned long i;
1723
1724 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
1725 unsigned long *r = &regs->r16;
1726 unsigned long *b0 = &VCPU(vcpu, vbgr[0]);
1727 unsigned long *b1 = &VCPU(vcpu, vgr[0]);
1728 unsigned long *runat = &regs->eml_unat;
1729 unsigned long *b0unat = &VCPU(vcpu, vbnat);
1730 unsigned long *b1unat = &VCPU(vcpu, vnat);
1731
1732
1733 if (VCPU(vcpu, vpsr) & IA64_PSR_BN) {
1734 for (i = 0; i < 16; i++) {
1735 *b1++ = *r;
1736 *r++ = *b0++;
1737 }
1738 vcpu_bsw0_unat(i, b0unat, b1unat, runat,
1739 VMM_PT_REGS_R16_SLOT);
1740 VCPU(vcpu, vpsr) &= ~IA64_PSR_BN;
1741 }
1742}
1743
1744#define vcpu_bsw1_unat(i, b0unat, b1unat, runat, VMM_PT_REGS_R16_SLOT) \
1745 do { \
1746 __asm__ __volatile__ (";;extr.u %0 = %3, %6, 16;;\n" \
1747 "dep %1 = %0, %1, 16, 16;;\n" \
1748 "st8 [%4] = %1\n" \
1749 "extr.u %0 = %2, 0, 16;;\n" \
1750 "dep %3 = %0, %3, %6, 16;;\n" \
1751 "st8 [%5] = %3\n" \
1752 ::"r"(i), "r"(*b0unat), "r"(*b1unat), \
1753 "r"(*runat), "r"(b0unat), "r"(runat), \
1754 "i"(VMM_PT_REGS_R16_SLOT) : "memory"); \
1755 } while (0)
1756
1757void vcpu_bsw1(struct kvm_vcpu *vcpu)
1758{
1759 unsigned long i;
1760 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
1761 unsigned long *r = &regs->r16;
1762 unsigned long *b0 = &VCPU(vcpu, vbgr[0]);
1763 unsigned long *b1 = &VCPU(vcpu, vgr[0]);
1764 unsigned long *runat = &regs->eml_unat;
1765 unsigned long *b0unat = &VCPU(vcpu, vbnat);
1766 unsigned long *b1unat = &VCPU(vcpu, vnat);
1767
1768 if (!(VCPU(vcpu, vpsr) & IA64_PSR_BN)) {
1769 for (i = 0; i < 16; i++) {
1770 *b0++ = *r;
1771 *r++ = *b1++;
1772 }
1773 vcpu_bsw1_unat(i, b0unat, b1unat, runat,
1774 VMM_PT_REGS_R16_SLOT);
1775 VCPU(vcpu, vpsr) |= IA64_PSR_BN;
1776 }
1777}
1778
1779
1780
1781
1782void vcpu_rfi(struct kvm_vcpu *vcpu)
1783{
1784 unsigned long ifs, psr;
1785 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
1786
1787 psr = VCPU(vcpu, ipsr);
1788 if (psr & IA64_PSR_BN)
1789 vcpu_bsw1(vcpu);
1790 else
1791 vcpu_bsw0(vcpu);
1792 vcpu_set_psr(vcpu, psr);
1793 ifs = VCPU(vcpu, ifs);
1794 if (ifs >> 63)
1795 regs->cr_ifs = ifs;
1796 regs->cr_iip = VCPU(vcpu, iip);
1797}
1798
1799
1800/*
1801 VPSR can't keep track of below bits of guest PSR
1802 This function gets guest PSR
1803 */
1804
1805unsigned long vcpu_get_psr(struct kvm_vcpu *vcpu)
1806{
1807 unsigned long mask;
1808 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
1809
1810 mask = IA64_PSR_BE | IA64_PSR_UP | IA64_PSR_AC | IA64_PSR_MFL |
1811 IA64_PSR_MFH | IA64_PSR_CPL | IA64_PSR_RI;
1812 return (VCPU(vcpu, vpsr) & ~mask) | (regs->cr_ipsr & mask);
1813}
1814
1815void kvm_rsm(struct kvm_vcpu *vcpu, INST64 inst)
1816{
1817 unsigned long vpsr;
1818 unsigned long imm24 = (inst.M44.i<<23) | (inst.M44.i2<<21)
1819 | inst.M44.imm;
1820
1821 vpsr = vcpu_get_psr(vcpu);
1822 vpsr &= (~imm24);
1823 vcpu_set_psr(vcpu, vpsr);
1824}
1825
1826void kvm_ssm(struct kvm_vcpu *vcpu, INST64 inst)
1827{
1828 unsigned long vpsr;
1829 unsigned long imm24 = (inst.M44.i << 23) | (inst.M44.i2 << 21)
1830 | inst.M44.imm;
1831
1832 vpsr = vcpu_get_psr(vcpu);
1833 vpsr |= imm24;
1834 vcpu_set_psr(vcpu, vpsr);
1835}
1836
1837/* Generate Mask
1838 * Parameter:
1839 * bit -- starting bit
1840 * len -- how many bits
1841 */
1842#define MASK(bit,len) \
1843({ \
1844 __u64 ret; \
1845 \
1846 __asm __volatile("dep %0=-1, r0, %1, %2"\
1847 : "=r" (ret): \
1848 "M" (bit), \
1849 "M" (len)); \
1850 ret; \
1851})
1852
1853void vcpu_set_psr_l(struct kvm_vcpu *vcpu, unsigned long val)
1854{
1855 val = (val & MASK(0, 32)) | (vcpu_get_psr(vcpu) & MASK(32, 32));
1856 vcpu_set_psr(vcpu, val);
1857}
1858
1859void kvm_mov_to_psr(struct kvm_vcpu *vcpu, INST64 inst)
1860{
1861 unsigned long val;
1862
1863 val = vcpu_get_gr(vcpu, inst.M35.r2);
1864 vcpu_set_psr_l(vcpu, val);
1865}
1866
1867void kvm_mov_from_psr(struct kvm_vcpu *vcpu, INST64 inst)
1868{
1869 unsigned long val;
1870
1871 val = vcpu_get_psr(vcpu);
1872 val = (val & MASK(0, 32)) | (val & MASK(35, 2));
1873 vcpu_set_gr(vcpu, inst.M33.r1, val, 0);
1874}
1875
1876void vcpu_increment_iip(struct kvm_vcpu *vcpu)
1877{
1878 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
1879 struct ia64_psr *ipsr = (struct ia64_psr *)&regs->cr_ipsr;
1880 if (ipsr->ri == 2) {
1881 ipsr->ri = 0;
1882 regs->cr_iip += 16;
1883 } else
1884 ipsr->ri++;
1885}
1886
1887void vcpu_decrement_iip(struct kvm_vcpu *vcpu)
1888{
1889 struct kvm_pt_regs *regs = vcpu_regs(vcpu);
1890 struct ia64_psr *ipsr = (struct ia64_psr *)&regs->cr_ipsr;
1891
1892 if (ipsr->ri == 0) {
1893 ipsr->ri = 2;
1894 regs->cr_iip -= 16;
1895 } else
1896 ipsr->ri--;
1897}
1898
1899/** Emulate a privileged operation.
1900 *
1901 *
1902 * @param vcpu virtual cpu
1903 * @cause the reason cause virtualization fault
1904 * @opcode the instruction code which cause virtualization fault
1905 */
1906
1907void kvm_emulate(struct kvm_vcpu *vcpu, struct kvm_pt_regs *regs)
1908{
1909 unsigned long status, cause, opcode ;
1910 INST64 inst;
1911
1912 status = IA64_NO_FAULT;
1913 cause = VMX(vcpu, cause);
1914 opcode = VMX(vcpu, opcode);
1915 inst.inst = opcode;
1916 /*
1917 * Switch to actual virtual rid in rr0 and rr4,
1918 * which is required by some tlb related instructions.
1919 */
1920 prepare_if_physical_mode(vcpu);
1921
1922 switch (cause) {
1923 case EVENT_RSM:
1924 kvm_rsm(vcpu, inst);
1925 break;
1926 case EVENT_SSM:
1927 kvm_ssm(vcpu, inst);
1928 break;
1929 case EVENT_MOV_TO_PSR:
1930 kvm_mov_to_psr(vcpu, inst);
1931 break;
1932 case EVENT_MOV_FROM_PSR:
1933 kvm_mov_from_psr(vcpu, inst);
1934 break;
1935 case EVENT_MOV_FROM_CR:
1936 kvm_mov_from_cr(vcpu, inst);
1937 break;
1938 case EVENT_MOV_TO_CR:
1939 kvm_mov_to_cr(vcpu, inst);
1940 break;
1941 case EVENT_BSW_0:
1942 vcpu_bsw0(vcpu);
1943 break;
1944 case EVENT_BSW_1:
1945 vcpu_bsw1(vcpu);
1946 break;
1947 case EVENT_COVER:
1948 vcpu_cover(vcpu);
1949 break;
1950 case EVENT_RFI:
1951 vcpu_rfi(vcpu);
1952 break;
1953 case EVENT_ITR_D:
1954 kvm_itr_d(vcpu, inst);
1955 break;
1956 case EVENT_ITR_I:
1957 kvm_itr_i(vcpu, inst);
1958 break;
1959 case EVENT_PTR_D:
1960 kvm_ptr_d(vcpu, inst);
1961 break;
1962 case EVENT_PTR_I:
1963 kvm_ptr_i(vcpu, inst);
1964 break;
1965 case EVENT_ITC_D:
1966 kvm_itc_d(vcpu, inst);
1967 break;
1968 case EVENT_ITC_I:
1969 kvm_itc_i(vcpu, inst);
1970 break;
1971 case EVENT_PTC_L:
1972 kvm_ptc_l(vcpu, inst);
1973 break;
1974 case EVENT_PTC_G:
1975 kvm_ptc_g(vcpu, inst);
1976 break;
1977 case EVENT_PTC_GA:
1978 kvm_ptc_ga(vcpu, inst);
1979 break;
1980 case EVENT_PTC_E:
1981 kvm_ptc_e(vcpu, inst);
1982 break;
1983 case EVENT_MOV_TO_RR:
1984 kvm_mov_to_rr(vcpu, inst);
1985 break;
1986 case EVENT_MOV_FROM_RR:
1987 kvm_mov_from_rr(vcpu, inst);
1988 break;
1989 case EVENT_THASH:
1990 kvm_thash(vcpu, inst);
1991 break;
1992 case EVENT_TTAG:
1993 kvm_ttag(vcpu, inst);
1994 break;
1995 case EVENT_TPA:
1996 status = kvm_tpa(vcpu, inst);
1997 break;
1998 case EVENT_TAK:
1999 kvm_tak(vcpu, inst);
2000 break;
2001 case EVENT_MOV_TO_AR_IMM:
2002 kvm_mov_to_ar_imm(vcpu, inst);
2003 break;
2004 case EVENT_MOV_TO_AR:
2005 kvm_mov_to_ar_reg(vcpu, inst);
2006 break;
2007 case EVENT_MOV_FROM_AR:
2008 kvm_mov_from_ar_reg(vcpu, inst);
2009 break;
2010 case EVENT_MOV_TO_DBR:
2011 kvm_mov_to_dbr(vcpu, inst);
2012 break;
2013 case EVENT_MOV_TO_IBR:
2014 kvm_mov_to_ibr(vcpu, inst);
2015 break;
2016 case EVENT_MOV_TO_PMC:
2017 kvm_mov_to_pmc(vcpu, inst);
2018 break;
2019 case EVENT_MOV_TO_PMD:
2020 kvm_mov_to_pmd(vcpu, inst);
2021 break;
2022 case EVENT_MOV_TO_PKR:
2023 kvm_mov_to_pkr(vcpu, inst);
2024 break;
2025 case EVENT_MOV_FROM_DBR:
2026 kvm_mov_from_dbr(vcpu, inst);
2027 break;
2028 case EVENT_MOV_FROM_IBR:
2029 kvm_mov_from_ibr(vcpu, inst);
2030 break;
2031 case EVENT_MOV_FROM_PMC:
2032 kvm_mov_from_pmc(vcpu, inst);
2033 break;
2034 case EVENT_MOV_FROM_PKR:
2035 kvm_mov_from_pkr(vcpu, inst);
2036 break;
2037 case EVENT_MOV_FROM_CPUID:
2038 kvm_mov_from_cpuid(vcpu, inst);
2039 break;
2040 case EVENT_VMSW:
2041 status = IA64_FAULT;
2042 break;
2043 default:
2044 break;
2045 };
2046 /*Assume all status is NO_FAULT ?*/
2047 if (status == IA64_NO_FAULT && cause != EVENT_RFI)
2048 vcpu_increment_iip(vcpu);
2049
2050 recover_if_physical_mode(vcpu);
2051}
2052
2053void init_vcpu(struct kvm_vcpu *vcpu)
2054{
2055 int i;
2056
2057 vcpu->arch.mode_flags = GUEST_IN_PHY;
2058 VMX(vcpu, vrr[0]) = 0x38;
2059 VMX(vcpu, vrr[1]) = 0x38;
2060 VMX(vcpu, vrr[2]) = 0x38;
2061 VMX(vcpu, vrr[3]) = 0x38;
2062 VMX(vcpu, vrr[4]) = 0x38;
2063 VMX(vcpu, vrr[5]) = 0x38;
2064 VMX(vcpu, vrr[6]) = 0x38;
2065 VMX(vcpu, vrr[7]) = 0x38;
2066 VCPU(vcpu, vpsr) = IA64_PSR_BN;
2067 VCPU(vcpu, dcr) = 0;
2068 /* pta.size must not be 0. The minimum is 15 (32k) */
2069 VCPU(vcpu, pta) = 15 << 2;
2070 VCPU(vcpu, itv) = 0x10000;
2071 VCPU(vcpu, itm) = 0;
2072 VMX(vcpu, last_itc) = 0;
2073
2074 VCPU(vcpu, lid) = VCPU_LID(vcpu);
2075 VCPU(vcpu, ivr) = 0;
2076 VCPU(vcpu, tpr) = 0x10000;
2077 VCPU(vcpu, eoi) = 0;
2078 VCPU(vcpu, irr[0]) = 0;
2079 VCPU(vcpu, irr[1]) = 0;
2080 VCPU(vcpu, irr[2]) = 0;
2081 VCPU(vcpu, irr[3]) = 0;
2082 VCPU(vcpu, pmv) = 0x10000;
2083 VCPU(vcpu, cmcv) = 0x10000;
2084 VCPU(vcpu, lrr0) = 0x10000; /* default reset value? */
2085 VCPU(vcpu, lrr1) = 0x10000; /* default reset value? */
2086 update_vhpi(vcpu, NULL_VECTOR);
2087 VLSAPIC_XTP(vcpu) = 0x80; /* disabled */
2088
2089 for (i = 0; i < 4; i++)
2090 VLSAPIC_INSVC(vcpu, i) = 0;
2091}
2092
2093void kvm_init_all_rr(struct kvm_vcpu *vcpu)
2094{
2095 unsigned long psr;
2096
2097 local_irq_save(psr);
2098
2099 /* WARNING: not allow co-exist of both virtual mode and physical
2100 * mode in same region
2101 */
2102
2103 vcpu->arch.metaphysical_saved_rr0 = vrrtomrr(VMX(vcpu, vrr[VRN0]));
2104 vcpu->arch.metaphysical_saved_rr4 = vrrtomrr(VMX(vcpu, vrr[VRN4]));
2105
2106 if (is_physical_mode(vcpu)) {
2107 if (vcpu->arch.mode_flags & GUEST_PHY_EMUL)
Xiantao Zhang5e2be192008-11-21 10:46:12 +08002108 panic_vm(vcpu, "Machine Status conflicts!\n");
Xiantao Zhang60a07bb2008-04-01 16:14:28 +08002109
2110 ia64_set_rr((VRN0 << VRN_SHIFT), vcpu->arch.metaphysical_rr0);
2111 ia64_dv_serialize_data();
2112 ia64_set_rr((VRN4 << VRN_SHIFT), vcpu->arch.metaphysical_rr4);
2113 ia64_dv_serialize_data();
2114 } else {
2115 ia64_set_rr((VRN0 << VRN_SHIFT),
2116 vcpu->arch.metaphysical_saved_rr0);
2117 ia64_dv_serialize_data();
2118 ia64_set_rr((VRN4 << VRN_SHIFT),
2119 vcpu->arch.metaphysical_saved_rr4);
2120 ia64_dv_serialize_data();
2121 }
2122 ia64_set_rr((VRN1 << VRN_SHIFT),
2123 vrrtomrr(VMX(vcpu, vrr[VRN1])));
2124 ia64_dv_serialize_data();
2125 ia64_set_rr((VRN2 << VRN_SHIFT),
2126 vrrtomrr(VMX(vcpu, vrr[VRN2])));
2127 ia64_dv_serialize_data();
2128 ia64_set_rr((VRN3 << VRN_SHIFT),
2129 vrrtomrr(VMX(vcpu, vrr[VRN3])));
2130 ia64_dv_serialize_data();
2131 ia64_set_rr((VRN5 << VRN_SHIFT),
2132 vrrtomrr(VMX(vcpu, vrr[VRN5])));
2133 ia64_dv_serialize_data();
2134 ia64_set_rr((VRN7 << VRN_SHIFT),
2135 vrrtomrr(VMX(vcpu, vrr[VRN7])));
2136 ia64_dv_serialize_data();
2137 ia64_srlz_d();
2138 ia64_set_psr(psr);
2139}
2140
2141int vmm_entry(void)
2142{
2143 struct kvm_vcpu *v;
2144 v = current_vcpu;
2145
2146 ia64_call_vsa(PAL_VPS_RESTORE, (unsigned long)v->arch.vpd,
2147 0, 0, 0, 0, 0, 0);
2148 kvm_init_vtlb(v);
2149 kvm_init_vhpt(v);
2150 init_vcpu(v);
2151 kvm_init_all_rr(v);
2152 vmm_reset_entry();
2153
2154 return 0;
2155}
2156
Xiantao Zhang5e2be192008-11-21 10:46:12 +08002157static void kvm_show_registers(struct kvm_pt_regs *regs)
Xiantao Zhang60a07bb2008-04-01 16:14:28 +08002158{
Xiantao Zhang5e2be192008-11-21 10:46:12 +08002159 unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;
Xiantao Zhang60a07bb2008-04-01 16:14:28 +08002160
Xiantao Zhang5e2be192008-11-21 10:46:12 +08002161 struct kvm_vcpu *vcpu = current_vcpu;
2162 if (vcpu != NULL)
2163 printk("vcpu 0x%p vcpu %d\n",
2164 vcpu, vcpu->vcpu_id);
2165
2166 printk("psr : %016lx ifs : %016lx ip : [<%016lx>]\n",
2167 regs->cr_ipsr, regs->cr_ifs, ip);
2168
2169 printk("unat: %016lx pfs : %016lx rsc : %016lx\n",
2170 regs->ar_unat, regs->ar_pfs, regs->ar_rsc);
2171 printk("rnat: %016lx bspstore: %016lx pr : %016lx\n",
2172 regs->ar_rnat, regs->ar_bspstore, regs->pr);
2173 printk("ldrs: %016lx ccv : %016lx fpsr: %016lx\n",
2174 regs->loadrs, regs->ar_ccv, regs->ar_fpsr);
2175 printk("csd : %016lx ssd : %016lx\n", regs->ar_csd, regs->ar_ssd);
2176 printk("b0 : %016lx b6 : %016lx b7 : %016lx\n", regs->b0,
2177 regs->b6, regs->b7);
2178 printk("f6 : %05lx%016lx f7 : %05lx%016lx\n",
2179 regs->f6.u.bits[1], regs->f6.u.bits[0],
2180 regs->f7.u.bits[1], regs->f7.u.bits[0]);
2181 printk("f8 : %05lx%016lx f9 : %05lx%016lx\n",
2182 regs->f8.u.bits[1], regs->f8.u.bits[0],
2183 regs->f9.u.bits[1], regs->f9.u.bits[0]);
2184 printk("f10 : %05lx%016lx f11 : %05lx%016lx\n",
2185 regs->f10.u.bits[1], regs->f10.u.bits[0],
2186 regs->f11.u.bits[1], regs->f11.u.bits[0]);
2187
2188 printk("r1 : %016lx r2 : %016lx r3 : %016lx\n", regs->r1,
2189 regs->r2, regs->r3);
2190 printk("r8 : %016lx r9 : %016lx r10 : %016lx\n", regs->r8,
2191 regs->r9, regs->r10);
2192 printk("r11 : %016lx r12 : %016lx r13 : %016lx\n", regs->r11,
2193 regs->r12, regs->r13);
2194 printk("r14 : %016lx r15 : %016lx r16 : %016lx\n", regs->r14,
2195 regs->r15, regs->r16);
2196 printk("r17 : %016lx r18 : %016lx r19 : %016lx\n", regs->r17,
2197 regs->r18, regs->r19);
2198 printk("r20 : %016lx r21 : %016lx r22 : %016lx\n", regs->r20,
2199 regs->r21, regs->r22);
2200 printk("r23 : %016lx r24 : %016lx r25 : %016lx\n", regs->r23,
2201 regs->r24, regs->r25);
2202 printk("r26 : %016lx r27 : %016lx r28 : %016lx\n", regs->r26,
2203 regs->r27, regs->r28);
2204 printk("r29 : %016lx r30 : %016lx r31 : %016lx\n", regs->r29,
2205 regs->r30, regs->r31);
2206
2207}
2208
2209void panic_vm(struct kvm_vcpu *v, const char *fmt, ...)
2210{
2211 va_list args;
2212 char buf[256];
2213
2214 struct kvm_pt_regs *regs = vcpu_regs(v);
2215 struct exit_ctl_data *p = &v->arch.exit_data;
2216 va_start(args, fmt);
2217 vsnprintf(buf, sizeof(buf), fmt, args);
2218 va_end(args);
2219 printk(buf);
2220 kvm_show_registers(regs);
Xiantao Zhang60a07bb2008-04-01 16:14:28 +08002221 p->exit_reason = EXIT_REASON_VM_PANIC;
2222 vmm_transition(v);
2223 /*Never to return*/
2224 while (1);
2225}