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