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