linux/arch/ia64/kernel/paravirt.c
<<
>>
Prefs
   1/******************************************************************************
   2 * arch/ia64/kernel/paravirt.c
   3 *
   4 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
   5 *                    VA Linux Systems Japan K.K.
   6 *     Yaozu (Eddie) Dong <eddie.dong@intel.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  21 *
  22 */
  23
  24#include <linux/init.h>
  25
  26#include <linux/compiler.h>
  27#include <linux/io.h>
  28#include <linux/irq.h>
  29#include <linux/module.h>
  30#include <linux/types.h>
  31
  32#include <asm/iosapic.h>
  33#include <asm/paravirt.h>
  34
  35/***************************************************************************
  36 * general info
  37 */
  38struct pv_info pv_info = {
  39        .kernel_rpl = 0,
  40        .paravirt_enabled = 0,
  41        .name = "bare hardware"
  42};
  43
  44/***************************************************************************
  45 * pv_init_ops
  46 * initialization hooks.
  47 */
  48
  49static void __init
  50ia64_native_patch_branch(unsigned long tag, unsigned long type);
  51
  52struct pv_init_ops pv_init_ops =
  53{
  54#ifdef ASM_SUPPORTED
  55        .patch_bundle = ia64_native_patch_bundle,
  56#endif
  57        .patch_branch = ia64_native_patch_branch,
  58};
  59
  60/***************************************************************************
  61 * pv_cpu_ops
  62 * intrinsics hooks.
  63 */
  64
  65#ifndef ASM_SUPPORTED
  66/* ia64_native_xxx are macros so that we have to make them real functions */
  67
  68#define DEFINE_VOID_FUNC1(name)                                 \
  69        static void                                             \
  70        ia64_native_ ## name ## _func(unsigned long arg)        \
  71        {                                                       \
  72                ia64_native_ ## name(arg);                      \
  73        }
  74
  75#define DEFINE_VOID_FUNC1_VOID(name)                            \
  76        static void                                             \
  77        ia64_native_ ## name ## _func(void *arg)                \
  78        {                                                       \
  79                ia64_native_ ## name(arg);                      \
  80        }
  81
  82#define DEFINE_VOID_FUNC2(name)                                 \
  83        static void                                             \
  84        ia64_native_ ## name ## _func(unsigned long arg0,       \
  85                                      unsigned long arg1)       \
  86        {                                                       \
  87                ia64_native_ ## name(arg0, arg1);               \
  88        }
  89
  90#define DEFINE_FUNC0(name)                      \
  91        static unsigned long                    \
  92        ia64_native_ ## name ## _func(void)     \
  93        {                                       \
  94                return ia64_native_ ## name();  \
  95        }
  96
  97#define DEFINE_FUNC1(name, type)                        \
  98        static unsigned long                            \
  99        ia64_native_ ## name ## _func(type arg)         \
 100        {                                               \
 101                return ia64_native_ ## name(arg);       \
 102        }                                               \
 103
 104DEFINE_VOID_FUNC1_VOID(fc);
 105DEFINE_VOID_FUNC1(intrin_local_irq_restore);
 106
 107DEFINE_VOID_FUNC2(ptcga);
 108DEFINE_VOID_FUNC2(set_rr);
 109
 110DEFINE_FUNC0(get_psr_i);
 111
 112DEFINE_FUNC1(thash, unsigned long);
 113DEFINE_FUNC1(get_cpuid, int);
 114DEFINE_FUNC1(get_pmd, int);
 115DEFINE_FUNC1(get_rr, unsigned long);
 116
 117static void
 118ia64_native_ssm_i_func(void)
 119{
 120        ia64_native_ssm(IA64_PSR_I);
 121}
 122
 123static void
 124ia64_native_rsm_i_func(void)
 125{
 126        ia64_native_rsm(IA64_PSR_I);
 127}
 128
 129static void
 130ia64_native_set_rr0_to_rr4_func(unsigned long val0, unsigned long val1,
 131                                unsigned long val2, unsigned long val3,
 132                                unsigned long val4)
 133{
 134        ia64_native_set_rr0_to_rr4(val0, val1, val2, val3, val4);
 135}
 136
 137#define CASE_GET_REG(id)                                \
 138        case _IA64_REG_ ## id:                          \
 139        res = ia64_native_getreg(_IA64_REG_ ## id);     \
 140        break;
 141#define CASE_GET_AR(id) CASE_GET_REG(AR_ ## id)
 142#define CASE_GET_CR(id) CASE_GET_REG(CR_ ## id)
 143
 144unsigned long
 145ia64_native_getreg_func(int regnum)
 146{
 147        unsigned long res = -1;
 148        switch (regnum) {
 149        CASE_GET_REG(GP);
 150        /*CASE_GET_REG(IP);*/ /* returned ip value shouldn't be constant */
 151        CASE_GET_REG(PSR);
 152        CASE_GET_REG(TP);
 153        CASE_GET_REG(SP);
 154
 155        CASE_GET_AR(KR0);
 156        CASE_GET_AR(KR1);
 157        CASE_GET_AR(KR2);
 158        CASE_GET_AR(KR3);
 159        CASE_GET_AR(KR4);
 160        CASE_GET_AR(KR5);
 161        CASE_GET_AR(KR6);
 162        CASE_GET_AR(KR7);
 163        CASE_GET_AR(RSC);
 164        CASE_GET_AR(BSP);
 165        CASE_GET_AR(BSPSTORE);
 166        CASE_GET_AR(RNAT);
 167        CASE_GET_AR(FCR);
 168        CASE_GET_AR(EFLAG);
 169        CASE_GET_AR(CSD);
 170        CASE_GET_AR(SSD);
 171        CASE_GET_AR(CFLAG);
 172        CASE_GET_AR(FSR);
 173        CASE_GET_AR(FIR);
 174        CASE_GET_AR(FDR);
 175        CASE_GET_AR(CCV);
 176        CASE_GET_AR(UNAT);
 177        CASE_GET_AR(FPSR);
 178        CASE_GET_AR(ITC);
 179        CASE_GET_AR(PFS);
 180        CASE_GET_AR(LC);
 181        CASE_GET_AR(EC);
 182
 183        CASE_GET_CR(DCR);
 184        CASE_GET_CR(ITM);
 185        CASE_GET_CR(IVA);
 186        CASE_GET_CR(PTA);
 187        CASE_GET_CR(IPSR);
 188        CASE_GET_CR(ISR);
 189        CASE_GET_CR(IIP);
 190        CASE_GET_CR(IFA);
 191        CASE_GET_CR(ITIR);
 192        CASE_GET_CR(IIPA);
 193        CASE_GET_CR(IFS);
 194        CASE_GET_CR(IIM);
 195        CASE_GET_CR(IHA);
 196        CASE_GET_CR(LID);
 197        CASE_GET_CR(IVR);
 198        CASE_GET_CR(TPR);
 199        CASE_GET_CR(EOI);
 200        CASE_GET_CR(IRR0);
 201        CASE_GET_CR(IRR1);
 202        CASE_GET_CR(IRR2);
 203        CASE_GET_CR(IRR3);
 204        CASE_GET_CR(ITV);
 205        CASE_GET_CR(PMV);
 206        CASE_GET_CR(CMCV);
 207        CASE_GET_CR(LRR0);
 208        CASE_GET_CR(LRR1);
 209
 210        default:
 211                printk(KERN_CRIT "wrong_getreg %d\n", regnum);
 212                break;
 213        }
 214        return res;
 215}
 216
 217#define CASE_SET_REG(id)                                \
 218        case _IA64_REG_ ## id:                          \
 219        ia64_native_setreg(_IA64_REG_ ## id, val);      \
 220        break;
 221#define CASE_SET_AR(id) CASE_SET_REG(AR_ ## id)
 222#define CASE_SET_CR(id) CASE_SET_REG(CR_ ## id)
 223
 224void
 225ia64_native_setreg_func(int regnum, unsigned long val)
 226{
 227        switch (regnum) {
 228        case _IA64_REG_PSR_L:
 229                ia64_native_setreg(_IA64_REG_PSR_L, val);
 230                ia64_dv_serialize_data();
 231                break;
 232        CASE_SET_REG(SP);
 233        CASE_SET_REG(GP);
 234
 235        CASE_SET_AR(KR0);
 236        CASE_SET_AR(KR1);
 237        CASE_SET_AR(KR2);
 238        CASE_SET_AR(KR3);
 239        CASE_SET_AR(KR4);
 240        CASE_SET_AR(KR5);
 241        CASE_SET_AR(KR6);
 242        CASE_SET_AR(KR7);
 243        CASE_SET_AR(RSC);
 244        CASE_SET_AR(BSP);
 245        CASE_SET_AR(BSPSTORE);
 246        CASE_SET_AR(RNAT);
 247        CASE_SET_AR(FCR);
 248        CASE_SET_AR(EFLAG);
 249        CASE_SET_AR(CSD);
 250        CASE_SET_AR(SSD);
 251        CASE_SET_AR(CFLAG);
 252        CASE_SET_AR(FSR);
 253        CASE_SET_AR(FIR);
 254        CASE_SET_AR(FDR);
 255        CASE_SET_AR(CCV);
 256        CASE_SET_AR(UNAT);
 257        CASE_SET_AR(FPSR);
 258        CASE_SET_AR(ITC);
 259        CASE_SET_AR(PFS);
 260        CASE_SET_AR(LC);
 261        CASE_SET_AR(EC);
 262
 263        CASE_SET_CR(DCR);
 264        CASE_SET_CR(ITM);
 265        CASE_SET_CR(IVA);
 266        CASE_SET_CR(PTA);
 267        CASE_SET_CR(IPSR);
 268        CASE_SET_CR(ISR);
 269        CASE_SET_CR(IIP);
 270        CASE_SET_CR(IFA);
 271        CASE_SET_CR(ITIR);
 272        CASE_SET_CR(IIPA);
 273        CASE_SET_CR(IFS);
 274        CASE_SET_CR(IIM);
 275        CASE_SET_CR(IHA);
 276        CASE_SET_CR(LID);
 277        CASE_SET_CR(IVR);
 278        CASE_SET_CR(TPR);
 279        CASE_SET_CR(EOI);
 280        CASE_SET_CR(IRR0);
 281        CASE_SET_CR(IRR1);
 282        CASE_SET_CR(IRR2);
 283        CASE_SET_CR(IRR3);
 284        CASE_SET_CR(ITV);
 285        CASE_SET_CR(PMV);
 286        CASE_SET_CR(CMCV);
 287        CASE_SET_CR(LRR0);
 288        CASE_SET_CR(LRR1);
 289        default:
 290                printk(KERN_CRIT "wrong setreg %d\n", regnum);
 291                break;
 292        }
 293}
 294#else
 295
 296#define __DEFINE_FUNC(name, code)                                       \
 297        extern const char ia64_native_ ## name ## _direct_start[];      \
 298        extern const char ia64_native_ ## name ## _direct_end[];        \
 299        asm (".align 32\n"                                              \
 300             ".proc ia64_native_" #name "_func\n"                       \
 301             "ia64_native_" #name "_func:\n"                            \
 302             "ia64_native_" #name "_direct_start:\n"                    \
 303             code                                                       \
 304             "ia64_native_" #name "_direct_end:\n"                      \
 305             "br.cond.sptk.many b6\n"                                   \
 306             ".endp ia64_native_" #name "_func\n")
 307
 308#define DEFINE_VOID_FUNC0(name, code)                           \
 309        extern void                                             \
 310        ia64_native_ ## name ## _func(void);                    \
 311        __DEFINE_FUNC(name, code)
 312
 313#define DEFINE_VOID_FUNC1(name, code)                           \
 314        extern void                                             \
 315        ia64_native_ ## name ## _func(unsigned long arg);       \
 316        __DEFINE_FUNC(name, code)
 317
 318#define DEFINE_VOID_FUNC1_VOID(name, code)                      \
 319        extern void                                             \
 320        ia64_native_ ## name ## _func(void *arg);               \
 321        __DEFINE_FUNC(name, code)
 322
 323#define DEFINE_VOID_FUNC2(name, code)                           \
 324        extern void                                             \
 325        ia64_native_ ## name ## _func(unsigned long arg0,       \
 326                                      unsigned long arg1);      \
 327        __DEFINE_FUNC(name, code)
 328
 329#define DEFINE_FUNC0(name, code)                \
 330        extern unsigned long                    \
 331        ia64_native_ ## name ## _func(void);    \
 332        __DEFINE_FUNC(name, code)
 333
 334#define DEFINE_FUNC1(name, type, code)                  \
 335        extern unsigned long                            \
 336        ia64_native_ ## name ## _func(type arg);        \
 337        __DEFINE_FUNC(name, code)
 338
 339DEFINE_VOID_FUNC1_VOID(fc,
 340                       "fc r8\n");
 341DEFINE_VOID_FUNC1(intrin_local_irq_restore,
 342                  ";;\n"
 343                  "     cmp.ne p6, p7 = r8, r0\n"
 344                  ";;\n"
 345                  "(p6) ssm psr.i\n"
 346                  "(p7) rsm psr.i\n"
 347                  ";;\n"
 348                  "(p6) srlz.d\n");
 349
 350DEFINE_VOID_FUNC2(ptcga,
 351                  "ptc.ga r8, r9\n");
 352DEFINE_VOID_FUNC2(set_rr,
 353                  "mov rr[r8] = r9\n");
 354
 355/* ia64_native_getreg(_IA64_REG_PSR) & IA64_PSR_I */
 356DEFINE_FUNC0(get_psr_i,
 357             "mov r2 = " __stringify(1 << IA64_PSR_I_BIT) "\n"
 358             "mov r8 = psr\n"
 359             ";;\n"
 360             "and r8 = r2, r8\n");
 361
 362DEFINE_FUNC1(thash, unsigned long,
 363             "thash r8 = r8\n");
 364DEFINE_FUNC1(get_cpuid, int,
 365             "mov r8 = cpuid[r8]\n");
 366DEFINE_FUNC1(get_pmd, int,
 367             "mov r8 = pmd[r8]\n");
 368DEFINE_FUNC1(get_rr, unsigned long,
 369             "mov r8 = rr[r8]\n");
 370
 371DEFINE_VOID_FUNC0(ssm_i,
 372                  "ssm psr.i\n");
 373DEFINE_VOID_FUNC0(rsm_i,
 374                  "rsm psr.i\n");
 375
 376extern void
 377ia64_native_set_rr0_to_rr4_func(unsigned long val0, unsigned long val1,
 378                                unsigned long val2, unsigned long val3,
 379                                unsigned long val4);
 380__DEFINE_FUNC(set_rr0_to_rr4,
 381              "mov rr[r0] = r8\n"
 382              "movl r2 = 0x2000000000000000\n"
 383              ";;\n"
 384              "mov rr[r2] = r9\n"
 385              "shl r3 = r2, 1\n"        /* movl r3 = 0x4000000000000000 */
 386              ";;\n"
 387              "add r2 = r2, r3\n"       /* movl r2 = 0x6000000000000000 */
 388              "mov rr[r3] = r10\n"
 389              ";;\n"
 390              "mov rr[r2] = r11\n"
 391              "shl r3 = r3, 1\n"        /* movl r3 = 0x8000000000000000 */
 392              ";;\n"
 393              "mov rr[r3] = r14\n");
 394
 395extern unsigned long ia64_native_getreg_func(int regnum);
 396asm(".global ia64_native_getreg_func\n");
 397#define __DEFINE_GET_REG(id, reg)                       \
 398        "mov r2 = " __stringify(_IA64_REG_ ## id) "\n"  \
 399        ";;\n"                                          \
 400        "cmp.eq p6, p0 = r2, r8\n"                      \
 401        ";;\n"                                          \
 402        "(p6) mov r8 = " #reg "\n"                      \
 403        "(p6) br.cond.sptk.many b6\n"                   \
 404        ";;\n"
 405#define __DEFINE_GET_AR(id, reg)        __DEFINE_GET_REG(AR_ ## id, ar.reg)
 406#define __DEFINE_GET_CR(id, reg)        __DEFINE_GET_REG(CR_ ## id, cr.reg)
 407
 408__DEFINE_FUNC(getreg,
 409              __DEFINE_GET_REG(GP, gp)
 410              /*__DEFINE_GET_REG(IP, ip)*/ /* returned ip value shouldn't be constant */
 411              __DEFINE_GET_REG(PSR, psr)
 412              __DEFINE_GET_REG(TP, tp)
 413              __DEFINE_GET_REG(SP, sp)
 414
 415              __DEFINE_GET_REG(AR_KR0, ar0)
 416              __DEFINE_GET_REG(AR_KR1, ar1)
 417              __DEFINE_GET_REG(AR_KR2, ar2)
 418              __DEFINE_GET_REG(AR_KR3, ar3)
 419              __DEFINE_GET_REG(AR_KR4, ar4)
 420              __DEFINE_GET_REG(AR_KR5, ar5)
 421              __DEFINE_GET_REG(AR_KR6, ar6)
 422              __DEFINE_GET_REG(AR_KR7, ar7)
 423              __DEFINE_GET_AR(RSC, rsc)
 424              __DEFINE_GET_AR(BSP, bsp)
 425              __DEFINE_GET_AR(BSPSTORE, bspstore)
 426              __DEFINE_GET_AR(RNAT, rnat)
 427              __DEFINE_GET_AR(FCR, fcr)
 428              __DEFINE_GET_AR(EFLAG, eflag)
 429              __DEFINE_GET_AR(CSD, csd)
 430              __DEFINE_GET_AR(SSD, ssd)
 431              __DEFINE_GET_REG(AR_CFLAG, ar27)
 432              __DEFINE_GET_AR(FSR, fsr)
 433              __DEFINE_GET_AR(FIR, fir)
 434              __DEFINE_GET_AR(FDR, fdr)
 435              __DEFINE_GET_AR(CCV, ccv)
 436              __DEFINE_GET_AR(UNAT, unat)
 437              __DEFINE_GET_AR(FPSR, fpsr)
 438              __DEFINE_GET_AR(ITC, itc)
 439              __DEFINE_GET_AR(PFS, pfs)
 440              __DEFINE_GET_AR(LC, lc)
 441              __DEFINE_GET_AR(EC, ec)
 442
 443              __DEFINE_GET_CR(DCR, dcr)
 444              __DEFINE_GET_CR(ITM, itm)
 445              __DEFINE_GET_CR(IVA, iva)
 446              __DEFINE_GET_CR(PTA, pta)
 447              __DEFINE_GET_CR(IPSR, ipsr)
 448              __DEFINE_GET_CR(ISR, isr)
 449              __DEFINE_GET_CR(IIP, iip)
 450              __DEFINE_GET_CR(IFA, ifa)
 451              __DEFINE_GET_CR(ITIR, itir)
 452              __DEFINE_GET_CR(IIPA, iipa)
 453              __DEFINE_GET_CR(IFS, ifs)
 454              __DEFINE_GET_CR(IIM, iim)
 455              __DEFINE_GET_CR(IHA, iha)
 456              __DEFINE_GET_CR(LID, lid)
 457              __DEFINE_GET_CR(IVR, ivr)
 458              __DEFINE_GET_CR(TPR, tpr)
 459              __DEFINE_GET_CR(EOI, eoi)
 460              __DEFINE_GET_CR(IRR0, irr0)
 461              __DEFINE_GET_CR(IRR1, irr1)
 462              __DEFINE_GET_CR(IRR2, irr2)
 463              __DEFINE_GET_CR(IRR3, irr3)
 464              __DEFINE_GET_CR(ITV, itv)
 465              __DEFINE_GET_CR(PMV, pmv)
 466              __DEFINE_GET_CR(CMCV, cmcv)
 467              __DEFINE_GET_CR(LRR0, lrr0)
 468              __DEFINE_GET_CR(LRR1, lrr1)
 469
 470              "mov r8 = -1\n"   /* unsupported case */
 471        );
 472
 473extern void ia64_native_setreg_func(int regnum, unsigned long val);
 474asm(".global ia64_native_setreg_func\n");
 475#define __DEFINE_SET_REG(id, reg)                       \
 476        "mov r2 = " __stringify(_IA64_REG_ ## id) "\n"  \
 477        ";;\n"                                          \
 478        "cmp.eq p6, p0 = r2, r9\n"                      \
 479        ";;\n"                                          \
 480        "(p6) mov " #reg " = r8\n"                      \
 481        "(p6) br.cond.sptk.many b6\n"                   \
 482        ";;\n"
 483#define __DEFINE_SET_AR(id, reg)        __DEFINE_SET_REG(AR_ ## id, ar.reg)
 484#define __DEFINE_SET_CR(id, reg)        __DEFINE_SET_REG(CR_ ## id, cr.reg)
 485__DEFINE_FUNC(setreg,
 486              "mov r2 = " __stringify(_IA64_REG_PSR_L) "\n"
 487              ";;\n"
 488              "cmp.eq p6, p0 = r2, r9\n"
 489              ";;\n"
 490              "(p6) mov psr.l = r8\n"
 491#ifdef HAVE_SERIALIZE_DIRECTIVE
 492              ".serialize.data\n"
 493#endif
 494              "(p6) br.cond.sptk.many b6\n"
 495              __DEFINE_SET_REG(GP, gp)
 496              __DEFINE_SET_REG(SP, sp)
 497
 498              __DEFINE_SET_REG(AR_KR0, ar0)
 499              __DEFINE_SET_REG(AR_KR1, ar1)
 500              __DEFINE_SET_REG(AR_KR2, ar2)
 501              __DEFINE_SET_REG(AR_KR3, ar3)
 502              __DEFINE_SET_REG(AR_KR4, ar4)
 503              __DEFINE_SET_REG(AR_KR5, ar5)
 504              __DEFINE_SET_REG(AR_KR6, ar6)
 505              __DEFINE_SET_REG(AR_KR7, ar7)
 506              __DEFINE_SET_AR(RSC, rsc)
 507              __DEFINE_SET_AR(BSP, bsp)
 508              __DEFINE_SET_AR(BSPSTORE, bspstore)
 509              __DEFINE_SET_AR(RNAT, rnat)
 510              __DEFINE_SET_AR(FCR, fcr)
 511              __DEFINE_SET_AR(EFLAG, eflag)
 512              __DEFINE_SET_AR(CSD, csd)
 513              __DEFINE_SET_AR(SSD, ssd)
 514              __DEFINE_SET_REG(AR_CFLAG, ar27)
 515              __DEFINE_SET_AR(FSR, fsr)
 516              __DEFINE_SET_AR(FIR, fir)
 517              __DEFINE_SET_AR(FDR, fdr)
 518              __DEFINE_SET_AR(CCV, ccv)
 519              __DEFINE_SET_AR(UNAT, unat)
 520              __DEFINE_SET_AR(FPSR, fpsr)
 521              __DEFINE_SET_AR(ITC, itc)
 522              __DEFINE_SET_AR(PFS, pfs)
 523              __DEFINE_SET_AR(LC, lc)
 524              __DEFINE_SET_AR(EC, ec)
 525
 526              __DEFINE_SET_CR(DCR, dcr)
 527              __DEFINE_SET_CR(ITM, itm)
 528              __DEFINE_SET_CR(IVA, iva)
 529              __DEFINE_SET_CR(PTA, pta)
 530              __DEFINE_SET_CR(IPSR, ipsr)
 531              __DEFINE_SET_CR(ISR, isr)
 532              __DEFINE_SET_CR(IIP, iip)
 533              __DEFINE_SET_CR(IFA, ifa)
 534              __DEFINE_SET_CR(ITIR, itir)
 535              __DEFINE_SET_CR(IIPA, iipa)
 536              __DEFINE_SET_CR(IFS, ifs)
 537              __DEFINE_SET_CR(IIM, iim)
 538              __DEFINE_SET_CR(IHA, iha)
 539              __DEFINE_SET_CR(LID, lid)
 540              __DEFINE_SET_CR(IVR, ivr)
 541              __DEFINE_SET_CR(TPR, tpr)
 542              __DEFINE_SET_CR(EOI, eoi)
 543              __DEFINE_SET_CR(IRR0, irr0)
 544              __DEFINE_SET_CR(IRR1, irr1)
 545              __DEFINE_SET_CR(IRR2, irr2)
 546              __DEFINE_SET_CR(IRR3, irr3)
 547              __DEFINE_SET_CR(ITV, itv)
 548              __DEFINE_SET_CR(PMV, pmv)
 549              __DEFINE_SET_CR(CMCV, cmcv)
 550              __DEFINE_SET_CR(LRR0, lrr0)
 551              __DEFINE_SET_CR(LRR1, lrr1)
 552        );
 553#endif
 554
 555struct pv_cpu_ops pv_cpu_ops = {
 556        .fc             = ia64_native_fc_func,
 557        .thash          = ia64_native_thash_func,
 558        .get_cpuid      = ia64_native_get_cpuid_func,
 559        .get_pmd        = ia64_native_get_pmd_func,
 560        .ptcga          = ia64_native_ptcga_func,
 561        .get_rr         = ia64_native_get_rr_func,
 562        .set_rr         = ia64_native_set_rr_func,
 563        .set_rr0_to_rr4 = ia64_native_set_rr0_to_rr4_func,
 564        .ssm_i          = ia64_native_ssm_i_func,
 565        .getreg         = ia64_native_getreg_func,
 566        .setreg         = ia64_native_setreg_func,
 567        .rsm_i          = ia64_native_rsm_i_func,
 568        .get_psr_i      = ia64_native_get_psr_i_func,
 569        .intrin_local_irq_restore
 570                        = ia64_native_intrin_local_irq_restore_func,
 571};
 572EXPORT_SYMBOL(pv_cpu_ops);
 573
 574/******************************************************************************
 575 * replacement of hand written assembly codes.
 576 */
 577
 578void
 579paravirt_cpu_asm_init(const struct pv_cpu_asm_switch *cpu_asm_switch)
 580{
 581        extern unsigned long paravirt_switch_to_targ;
 582        extern unsigned long paravirt_leave_syscall_targ;
 583        extern unsigned long paravirt_work_processed_syscall_targ;
 584        extern unsigned long paravirt_leave_kernel_targ;
 585
 586        paravirt_switch_to_targ = cpu_asm_switch->switch_to;
 587        paravirt_leave_syscall_targ = cpu_asm_switch->leave_syscall;
 588        paravirt_work_processed_syscall_targ =
 589                cpu_asm_switch->work_processed_syscall;
 590        paravirt_leave_kernel_targ = cpu_asm_switch->leave_kernel;
 591}
 592
 593/***************************************************************************
 594 * pv_iosapic_ops
 595 * iosapic read/write hooks.
 596 */
 597
 598static unsigned int
 599ia64_native_iosapic_read(char __iomem *iosapic, unsigned int reg)
 600{
 601        return __ia64_native_iosapic_read(iosapic, reg);
 602}
 603
 604static void
 605ia64_native_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
 606{
 607        __ia64_native_iosapic_write(iosapic, reg, val);
 608}
 609
 610struct pv_iosapic_ops pv_iosapic_ops = {
 611        .pcat_compat_init = ia64_native_iosapic_pcat_compat_init,
 612        .__get_irq_chip = ia64_native_iosapic_get_irq_chip,
 613
 614        .__read = ia64_native_iosapic_read,
 615        .__write = ia64_native_iosapic_write,
 616};
 617
 618/***************************************************************************
 619 * pv_irq_ops
 620 * irq operations
 621 */
 622
 623struct pv_irq_ops pv_irq_ops = {
 624        .register_ipi = ia64_native_register_ipi,
 625
 626        .assign_irq_vector = ia64_native_assign_irq_vector,
 627        .free_irq_vector = ia64_native_free_irq_vector,
 628        .register_percpu_irq = ia64_native_register_percpu_irq,
 629
 630        .resend_irq = ia64_native_resend_irq,
 631};
 632
 633/***************************************************************************
 634 * pv_time_ops
 635 * time operations
 636 */
 637struct static_key paravirt_steal_enabled;
 638struct static_key paravirt_steal_rq_enabled;
 639
 640static int
 641ia64_native_do_steal_accounting(unsigned long *new_itm)
 642{
 643        return 0;
 644}
 645
 646struct pv_time_ops pv_time_ops = {
 647        .do_steal_accounting = ia64_native_do_steal_accounting,
 648        .sched_clock = ia64_native_sched_clock,
 649};
 650
 651/***************************************************************************
 652 * binary pacthing
 653 * pv_init_ops.patch_bundle
 654 */
 655
 656#ifdef ASM_SUPPORTED
 657#define IA64_NATIVE_PATCH_DEFINE_GET_REG(name, reg)     \
 658        __DEFINE_FUNC(get_ ## name,                     \
 659                      ";;\n"                            \
 660                      "mov r8 = " #reg "\n"             \
 661                      ";;\n")
 662
 663#define IA64_NATIVE_PATCH_DEFINE_SET_REG(name, reg)     \
 664        __DEFINE_FUNC(set_ ## name,                     \
 665                      ";;\n"                            \
 666                      "mov " #reg " = r8\n"             \
 667                      ";;\n")
 668
 669#define IA64_NATIVE_PATCH_DEFINE_REG(name, reg)         \
 670        IA64_NATIVE_PATCH_DEFINE_GET_REG(name, reg);    \
 671        IA64_NATIVE_PATCH_DEFINE_SET_REG(name, reg)     \
 672
 673#define IA64_NATIVE_PATCH_DEFINE_AR(name, reg)                  \
 674        IA64_NATIVE_PATCH_DEFINE_REG(ar_ ## name, ar.reg)
 675
 676#define IA64_NATIVE_PATCH_DEFINE_CR(name, reg)                  \
 677        IA64_NATIVE_PATCH_DEFINE_REG(cr_ ## name, cr.reg)
 678
 679
 680IA64_NATIVE_PATCH_DEFINE_GET_REG(psr, psr);
 681IA64_NATIVE_PATCH_DEFINE_GET_REG(tp, tp);
 682
 683/* IA64_NATIVE_PATCH_DEFINE_SET_REG(psr_l, psr.l); */
 684__DEFINE_FUNC(set_psr_l,
 685              ";;\n"
 686              "mov psr.l = r8\n"
 687#ifdef HAVE_SERIALIZE_DIRECTIVE
 688              ".serialize.data\n"
 689#endif
 690              ";;\n");
 691
 692IA64_NATIVE_PATCH_DEFINE_REG(gp, gp);
 693IA64_NATIVE_PATCH_DEFINE_REG(sp, sp);
 694
 695IA64_NATIVE_PATCH_DEFINE_REG(kr0, ar0);
 696IA64_NATIVE_PATCH_DEFINE_REG(kr1, ar1);
 697IA64_NATIVE_PATCH_DEFINE_REG(kr2, ar2);
 698IA64_NATIVE_PATCH_DEFINE_REG(kr3, ar3);
 699IA64_NATIVE_PATCH_DEFINE_REG(kr4, ar4);
 700IA64_NATIVE_PATCH_DEFINE_REG(kr5, ar5);
 701IA64_NATIVE_PATCH_DEFINE_REG(kr6, ar6);
 702IA64_NATIVE_PATCH_DEFINE_REG(kr7, ar7);
 703
 704IA64_NATIVE_PATCH_DEFINE_AR(rsc, rsc);
 705IA64_NATIVE_PATCH_DEFINE_AR(bsp, bsp);
 706IA64_NATIVE_PATCH_DEFINE_AR(bspstore, bspstore);
 707IA64_NATIVE_PATCH_DEFINE_AR(rnat, rnat);
 708IA64_NATIVE_PATCH_DEFINE_AR(fcr, fcr);
 709IA64_NATIVE_PATCH_DEFINE_AR(eflag, eflag);
 710IA64_NATIVE_PATCH_DEFINE_AR(csd, csd);
 711IA64_NATIVE_PATCH_DEFINE_AR(ssd, ssd);
 712IA64_NATIVE_PATCH_DEFINE_REG(ar27, ar27);
 713IA64_NATIVE_PATCH_DEFINE_AR(fsr, fsr);
 714IA64_NATIVE_PATCH_DEFINE_AR(fir, fir);
 715IA64_NATIVE_PATCH_DEFINE_AR(fdr, fdr);
 716IA64_NATIVE_PATCH_DEFINE_AR(ccv, ccv);
 717IA64_NATIVE_PATCH_DEFINE_AR(unat, unat);
 718IA64_NATIVE_PATCH_DEFINE_AR(fpsr, fpsr);
 719IA64_NATIVE_PATCH_DEFINE_AR(itc, itc);
 720IA64_NATIVE_PATCH_DEFINE_AR(pfs, pfs);
 721IA64_NATIVE_PATCH_DEFINE_AR(lc, lc);
 722IA64_NATIVE_PATCH_DEFINE_AR(ec, ec);
 723
 724IA64_NATIVE_PATCH_DEFINE_CR(dcr, dcr);
 725IA64_NATIVE_PATCH_DEFINE_CR(itm, itm);
 726IA64_NATIVE_PATCH_DEFINE_CR(iva, iva);
 727IA64_NATIVE_PATCH_DEFINE_CR(pta, pta);
 728IA64_NATIVE_PATCH_DEFINE_CR(ipsr, ipsr);
 729IA64_NATIVE_PATCH_DEFINE_CR(isr, isr);
 730IA64_NATIVE_PATCH_DEFINE_CR(iip, iip);
 731IA64_NATIVE_PATCH_DEFINE_CR(ifa, ifa);
 732IA64_NATIVE_PATCH_DEFINE_CR(itir, itir);
 733IA64_NATIVE_PATCH_DEFINE_CR(iipa, iipa);
 734IA64_NATIVE_PATCH_DEFINE_CR(ifs, ifs);
 735IA64_NATIVE_PATCH_DEFINE_CR(iim, iim);
 736IA64_NATIVE_PATCH_DEFINE_CR(iha, iha);
 737IA64_NATIVE_PATCH_DEFINE_CR(lid, lid);
 738IA64_NATIVE_PATCH_DEFINE_CR(ivr, ivr);
 739IA64_NATIVE_PATCH_DEFINE_CR(tpr, tpr);
 740IA64_NATIVE_PATCH_DEFINE_CR(eoi, eoi);
 741IA64_NATIVE_PATCH_DEFINE_CR(irr0, irr0);
 742IA64_NATIVE_PATCH_DEFINE_CR(irr1, irr1);
 743IA64_NATIVE_PATCH_DEFINE_CR(irr2, irr2);
 744IA64_NATIVE_PATCH_DEFINE_CR(irr3, irr3);
 745IA64_NATIVE_PATCH_DEFINE_CR(itv, itv);
 746IA64_NATIVE_PATCH_DEFINE_CR(pmv, pmv);
 747IA64_NATIVE_PATCH_DEFINE_CR(cmcv, cmcv);
 748IA64_NATIVE_PATCH_DEFINE_CR(lrr0, lrr0);
 749IA64_NATIVE_PATCH_DEFINE_CR(lrr1, lrr1);
 750
 751static const struct paravirt_patch_bundle_elem ia64_native_patch_bundle_elems[]
 752__initdata_or_module =
 753{
 754#define IA64_NATIVE_PATCH_BUNDLE_ELEM(name, type)               \
 755        {                                                       \
 756                (void*)ia64_native_ ## name ## _direct_start,   \
 757                (void*)ia64_native_ ## name ## _direct_end,     \
 758                PARAVIRT_PATCH_TYPE_ ## type,                   \
 759        }
 760
 761        IA64_NATIVE_PATCH_BUNDLE_ELEM(fc, FC),
 762        IA64_NATIVE_PATCH_BUNDLE_ELEM(thash, THASH),
 763        IA64_NATIVE_PATCH_BUNDLE_ELEM(get_cpuid, GET_CPUID),
 764        IA64_NATIVE_PATCH_BUNDLE_ELEM(get_pmd, GET_PMD),
 765        IA64_NATIVE_PATCH_BUNDLE_ELEM(ptcga, PTCGA),
 766        IA64_NATIVE_PATCH_BUNDLE_ELEM(get_rr, GET_RR),
 767        IA64_NATIVE_PATCH_BUNDLE_ELEM(set_rr, SET_RR),
 768        IA64_NATIVE_PATCH_BUNDLE_ELEM(set_rr0_to_rr4, SET_RR0_TO_RR4),
 769        IA64_NATIVE_PATCH_BUNDLE_ELEM(ssm_i, SSM_I),
 770        IA64_NATIVE_PATCH_BUNDLE_ELEM(rsm_i, RSM_I),
 771        IA64_NATIVE_PATCH_BUNDLE_ELEM(get_psr_i, GET_PSR_I),
 772        IA64_NATIVE_PATCH_BUNDLE_ELEM(intrin_local_irq_restore,
 773                                      INTRIN_LOCAL_IRQ_RESTORE),
 774
 775#define IA64_NATIVE_PATCH_BUNDLE_ELEM_GETREG(name, reg)                 \
 776        {                                                               \
 777                (void*)ia64_native_get_ ## name ## _direct_start,       \
 778                (void*)ia64_native_get_ ## name ## _direct_end,         \
 779                PARAVIRT_PATCH_TYPE_GETREG + _IA64_REG_ ## reg,         \
 780        }
 781
 782#define IA64_NATIVE_PATCH_BUNDLE_ELEM_SETREG(name, reg)                 \
 783        {                                                               \
 784                (void*)ia64_native_set_ ## name ## _direct_start,       \
 785                (void*)ia64_native_set_ ## name ## _direct_end,         \
 786                PARAVIRT_PATCH_TYPE_SETREG + _IA64_REG_ ## reg,         \
 787        }
 788
 789#define IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(name, reg)            \
 790        IA64_NATIVE_PATCH_BUNDLE_ELEM_GETREG(name, reg),        \
 791        IA64_NATIVE_PATCH_BUNDLE_ELEM_SETREG(name, reg)         \
 792
 793#define IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(name, reg)             \
 794        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(ar_ ## name, AR_ ## reg)
 795
 796#define IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(name, reg)             \
 797        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(cr_ ## name, CR_ ## reg)
 798
 799        IA64_NATIVE_PATCH_BUNDLE_ELEM_GETREG(psr, PSR),
 800        IA64_NATIVE_PATCH_BUNDLE_ELEM_GETREG(tp, TP),
 801
 802        IA64_NATIVE_PATCH_BUNDLE_ELEM_SETREG(psr_l, PSR_L),
 803
 804        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(gp, GP),
 805        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(sp, SP),
 806
 807        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr0, AR_KR0),
 808        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr1, AR_KR1),
 809        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr2, AR_KR2),
 810        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr3, AR_KR3),
 811        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr4, AR_KR4),
 812        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr5, AR_KR5),
 813        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr6, AR_KR6),
 814        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(kr7, AR_KR7),
 815
 816        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(rsc, RSC),
 817        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(bsp, BSP),
 818        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(bspstore, BSPSTORE),
 819        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(rnat, RNAT),
 820        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(fcr, FCR),
 821        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(eflag, EFLAG),
 822        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(csd, CSD),
 823        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(ssd, SSD),
 824        IA64_NATIVE_PATCH_BUNDLE_ELEM_REG(ar27, AR_CFLAG),
 825        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(fsr, FSR),
 826        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(fir, FIR),
 827        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(fdr, FDR),
 828        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(ccv, CCV),
 829        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(unat, UNAT),
 830        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(fpsr, FPSR),
 831        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(itc, ITC),
 832        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(pfs, PFS),
 833        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(lc, LC),
 834        IA64_NATIVE_PATCH_BUNDLE_ELEM_AR(ec, EC),
 835
 836        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(dcr, DCR),
 837        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(itm, ITM),
 838        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(iva, IVA),
 839        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(pta, PTA),
 840        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(ipsr, IPSR),
 841        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(isr, ISR),
 842        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(iip, IIP),
 843        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(ifa, IFA),
 844        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(itir, ITIR),
 845        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(iipa, IIPA),
 846        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(ifs, IFS),
 847        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(iim, IIM),
 848        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(iha, IHA),
 849        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(lid, LID),
 850        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(ivr, IVR),
 851        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(tpr, TPR),
 852        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(eoi, EOI),
 853        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(irr0, IRR0),
 854        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(irr1, IRR1),
 855        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(irr2, IRR2),
 856        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(irr3, IRR3),
 857        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(itv, ITV),
 858        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(pmv, PMV),
 859        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(cmcv, CMCV),
 860        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(lrr0, LRR0),
 861        IA64_NATIVE_PATCH_BUNDLE_ELEM_CR(lrr1, LRR1),
 862};
 863
 864unsigned long __init_or_module
 865ia64_native_patch_bundle(void *sbundle, void *ebundle, unsigned long type)
 866{
 867        const unsigned long nelems = sizeof(ia64_native_patch_bundle_elems) /
 868                sizeof(ia64_native_patch_bundle_elems[0]);
 869
 870        return __paravirt_patch_apply_bundle(sbundle, ebundle, type,
 871                                              ia64_native_patch_bundle_elems,
 872                                              nelems, NULL);
 873}
 874#endif /* ASM_SUPPOTED */
 875
 876extern const char ia64_native_switch_to[];
 877extern const char ia64_native_leave_syscall[];
 878extern const char ia64_native_work_processed_syscall[];
 879extern const char ia64_native_leave_kernel[];
 880
 881const struct paravirt_patch_branch_target ia64_native_branch_target[]
 882__initconst = {
 883#define PARAVIRT_BR_TARGET(name, type)                  \
 884        {                                               \
 885                ia64_native_ ## name,                   \
 886                PARAVIRT_PATCH_TYPE_BR_ ## type,        \
 887        }
 888        PARAVIRT_BR_TARGET(switch_to, SWITCH_TO),
 889        PARAVIRT_BR_TARGET(leave_syscall, LEAVE_SYSCALL),
 890        PARAVIRT_BR_TARGET(work_processed_syscall, WORK_PROCESSED_SYSCALL),
 891        PARAVIRT_BR_TARGET(leave_kernel, LEAVE_KERNEL),
 892};
 893
 894static void __init
 895ia64_native_patch_branch(unsigned long tag, unsigned long type)
 896{
 897        const unsigned long nelem =
 898                sizeof(ia64_native_branch_target) /
 899                sizeof(ia64_native_branch_target[0]);
 900        __paravirt_patch_apply_branch(tag, type,
 901                                      ia64_native_branch_target, nelem);
 902}
 903