Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
Note: File does not exist in v5.9.
   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 */
  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
 115void 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
 128static 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
 133void 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
 184void 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
 213void 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 */
 223void 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
 233static 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
 248static inline unsigned long
 249rotate_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 */
 262static 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 */
 273static 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
 296static 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
 338void 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
 396void 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
 421void 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
 461u64 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
 472void 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
 484void 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
 630void 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
 774void 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
 782void 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))
 795static 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 ***********************************************************************/
 810u64 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
 822static inline void vcpu_set_itm(struct kvm_vcpu *vcpu, u64 val);
 823static 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
 852static inline u64 vcpu_get_itm(struct kvm_vcpu *vcpu)
 853{
 854	return ((u64)VCPU(vcpu, itm));
 855}
 856
 857static 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
 873static 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
 882static 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 */
 896int 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
 931void 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
 943void 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
 957void 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
 976u64 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 **************************************************************************/
1000u64 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
1020u64 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
1037u64 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
1057void 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
1066void 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
1075int 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
1146int 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
1159void 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 ************************************/
1171void 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
1176void 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
1181void 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
1197void 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
1220void 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
1232void 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
1244void 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
1250void vcpu_ptc_e(struct kvm_vcpu *vcpu, u64 va)
1251{
1252	thash_purge_all(vcpu);
1253}
1254
1255void 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
1272void vcpu_ptc_g(struct kvm_vcpu *vcpu, u64 va, u64 ps)
1273{
1274	vcpu_ptc_ga(vcpu, va, ps);
1275}
1276
1277void 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
1285void 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
1294void 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
1303void 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
1312void 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
1321void 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
1330void 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
1343void 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
1354void 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
1364void 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
1378void 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
1390void 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
1398void 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
1410unsigned long vcpu_get_pkr(struct kvm_vcpu *vcpu, unsigned long reg)
1411{
1412	return ((unsigned long)ia64_get_pkr(reg));
1413}
1414
1415void 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 ********************************/
1423unsigned 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
1463void 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
1472void kvm_mov_to_dbr(struct kvm_vcpu *vcpu, INST64 inst)
1473{
1474}
1475
1476void kvm_mov_to_ibr(struct kvm_vcpu *vcpu, INST64 inst)
1477{
1478}
1479
1480void 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
1489void 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
1498void 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
1507void 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
1516void 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
1525void 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
1534void 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
1543void 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
1552unsigned 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
1561void 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
1570void vcpu_set_tpr(struct kvm_vcpu *vcpu, unsigned long val)
1571{
1572	VCPU(vcpu, tpr) = val;
1573	vcpu->arch.irq_check = 1;
1574}
1575
1576unsigned 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
1603unsigned 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
1626void 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
1676unsigned 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
1708void 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
1745void 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
1767void 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
1789unsigned 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
1799void 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
1810void 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
1837void 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
1843void 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
1851void 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
1860void 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
1871void 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
1891void 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
2037void 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
2077void 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
2125int 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
2141static 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
2193void 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}