root/arch/powerpc/kernel/kvm.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. kvm_patch_ins
  2. kvm_patch_ins_ll
  3. kvm_patch_ins_ld
  4. kvm_patch_ins_lwz
  5. kvm_patch_ins_std
  6. kvm_patch_ins_stw
  7. kvm_patch_ins_nop
  8. kvm_patch_ins_b
  9. kvm_alloc
  10. kvm_patch_ins_mtmsrd
  11. kvm_patch_ins_mtmsr
  12. kvm_patch_ins_wrtee
  13. kvm_patch_ins_wrteei_0
  14. kvm_patch_ins_mtsrin
  15. kvm_map_magic_page
  16. kvm_check_ins
  17. kvm_use_magic_page
  18. kvm_guest_init

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Copyright (C) 2010 SUSE Linux Products GmbH. All rights reserved.
   4  * Copyright 2010-2011 Freescale Semiconductor, Inc.
   5  *
   6  * Authors:
   7  *     Alexander Graf <agraf@suse.de>
   8  */
   9 
  10 #include <linux/kvm_host.h>
  11 #include <linux/init.h>
  12 #include <linux/export.h>
  13 #include <linux/kmemleak.h>
  14 #include <linux/kvm_para.h>
  15 #include <linux/slab.h>
  16 #include <linux/of.h>
  17 #include <linux/pagemap.h>
  18 
  19 #include <asm/reg.h>
  20 #include <asm/sections.h>
  21 #include <asm/cacheflush.h>
  22 #include <asm/disassemble.h>
  23 #include <asm/ppc-opcode.h>
  24 #include <asm/epapr_hcalls.h>
  25 
  26 #define KVM_MAGIC_PAGE          (-4096L)
  27 #define magic_var(x) KVM_MAGIC_PAGE + offsetof(struct kvm_vcpu_arch_shared, x)
  28 
  29 #define KVM_INST_LWZ            0x80000000
  30 #define KVM_INST_STW            0x90000000
  31 #define KVM_INST_LD             0xe8000000
  32 #define KVM_INST_STD            0xf8000000
  33 #define KVM_INST_NOP            0x60000000
  34 #define KVM_INST_B              0x48000000
  35 #define KVM_INST_B_MASK         0x03ffffff
  36 #define KVM_INST_B_MAX          0x01ffffff
  37 #define KVM_INST_LI             0x38000000
  38 
  39 #define KVM_MASK_RT             0x03e00000
  40 #define KVM_RT_30               0x03c00000
  41 #define KVM_MASK_RB             0x0000f800
  42 #define KVM_INST_MFMSR          0x7c0000a6
  43 
  44 #define SPR_FROM                0
  45 #define SPR_TO                  0x100
  46 
  47 #define KVM_INST_SPR(sprn, moveto) (0x7c0002a6 | \
  48                                     (((sprn) & 0x1f) << 16) | \
  49                                     (((sprn) & 0x3e0) << 6) | \
  50                                     (moveto))
  51 
  52 #define KVM_INST_MFSPR(sprn)    KVM_INST_SPR(sprn, SPR_FROM)
  53 #define KVM_INST_MTSPR(sprn)    KVM_INST_SPR(sprn, SPR_TO)
  54 
  55 #define KVM_INST_TLBSYNC        0x7c00046c
  56 #define KVM_INST_MTMSRD_L0      0x7c000164
  57 #define KVM_INST_MTMSRD_L1      0x7c010164
  58 #define KVM_INST_MTMSR          0x7c000124
  59 
  60 #define KVM_INST_WRTEE          0x7c000106
  61 #define KVM_INST_WRTEEI_0       0x7c000146
  62 #define KVM_INST_WRTEEI_1       0x7c008146
  63 
  64 #define KVM_INST_MTSRIN         0x7c0001e4
  65 
  66 static bool kvm_patching_worked = true;
  67 extern char kvm_tmp[];
  68 extern char kvm_tmp_end[];
  69 static int kvm_tmp_index;
  70 
  71 static void __init kvm_patch_ins(u32 *inst, u32 new_inst)
  72 {
  73         *inst = new_inst;
  74         flush_icache_range((ulong)inst, (ulong)inst + 4);
  75 }
  76 
  77 static void __init kvm_patch_ins_ll(u32 *inst, long addr, u32 rt)
  78 {
  79 #ifdef CONFIG_64BIT
  80         kvm_patch_ins(inst, KVM_INST_LD | rt | (addr & 0x0000fffc));
  81 #else
  82         kvm_patch_ins(inst, KVM_INST_LWZ | rt | (addr & 0x0000fffc));
  83 #endif
  84 }
  85 
  86 static void __init kvm_patch_ins_ld(u32 *inst, long addr, u32 rt)
  87 {
  88 #ifdef CONFIG_64BIT
  89         kvm_patch_ins(inst, KVM_INST_LD | rt | (addr & 0x0000fffc));
  90 #else
  91         kvm_patch_ins(inst, KVM_INST_LWZ | rt | ((addr + 4) & 0x0000fffc));
  92 #endif
  93 }
  94 
  95 static void __init kvm_patch_ins_lwz(u32 *inst, long addr, u32 rt)
  96 {
  97         kvm_patch_ins(inst, KVM_INST_LWZ | rt | (addr & 0x0000ffff));
  98 }
  99 
 100 static void __init kvm_patch_ins_std(u32 *inst, long addr, u32 rt)
 101 {
 102 #ifdef CONFIG_64BIT
 103         kvm_patch_ins(inst, KVM_INST_STD | rt | (addr & 0x0000fffc));
 104 #else
 105         kvm_patch_ins(inst, KVM_INST_STW | rt | ((addr + 4) & 0x0000fffc));
 106 #endif
 107 }
 108 
 109 static void __init kvm_patch_ins_stw(u32 *inst, long addr, u32 rt)
 110 {
 111         kvm_patch_ins(inst, KVM_INST_STW | rt | (addr & 0x0000fffc));
 112 }
 113 
 114 static void __init kvm_patch_ins_nop(u32 *inst)
 115 {
 116         kvm_patch_ins(inst, KVM_INST_NOP);
 117 }
 118 
 119 static void __init kvm_patch_ins_b(u32 *inst, int addr)
 120 {
 121 #if defined(CONFIG_RELOCATABLE) && defined(CONFIG_PPC_BOOK3S)
 122         /* On relocatable kernels interrupts handlers and our code
 123            can be in different regions, so we don't patch them */
 124 
 125         if ((ulong)inst < (ulong)&__end_interrupts)
 126                 return;
 127 #endif
 128 
 129         kvm_patch_ins(inst, KVM_INST_B | (addr & KVM_INST_B_MASK));
 130 }
 131 
 132 static u32 * __init kvm_alloc(int len)
 133 {
 134         u32 *p;
 135 
 136         if ((kvm_tmp_index + len) > (kvm_tmp_end - kvm_tmp)) {
 137                 printk(KERN_ERR "KVM: No more space (%d + %d)\n",
 138                                 kvm_tmp_index, len);
 139                 kvm_patching_worked = false;
 140                 return NULL;
 141         }
 142 
 143         p = (void*)&kvm_tmp[kvm_tmp_index];
 144         kvm_tmp_index += len;
 145 
 146         return p;
 147 }
 148 
 149 extern u32 kvm_emulate_mtmsrd_branch_offs;
 150 extern u32 kvm_emulate_mtmsrd_reg_offs;
 151 extern u32 kvm_emulate_mtmsrd_orig_ins_offs;
 152 extern u32 kvm_emulate_mtmsrd_len;
 153 extern u32 kvm_emulate_mtmsrd[];
 154 
 155 static void __init kvm_patch_ins_mtmsrd(u32 *inst, u32 rt)
 156 {
 157         u32 *p;
 158         int distance_start;
 159         int distance_end;
 160         ulong next_inst;
 161 
 162         p = kvm_alloc(kvm_emulate_mtmsrd_len * 4);
 163         if (!p)
 164                 return;
 165 
 166         /* Find out where we are and put everything there */
 167         distance_start = (ulong)p - (ulong)inst;
 168         next_inst = ((ulong)inst + 4);
 169         distance_end = next_inst - (ulong)&p[kvm_emulate_mtmsrd_branch_offs];
 170 
 171         /* Make sure we only write valid b instructions */
 172         if (distance_start > KVM_INST_B_MAX) {
 173                 kvm_patching_worked = false;
 174                 return;
 175         }
 176 
 177         /* Modify the chunk to fit the invocation */
 178         memcpy(p, kvm_emulate_mtmsrd, kvm_emulate_mtmsrd_len * 4);
 179         p[kvm_emulate_mtmsrd_branch_offs] |= distance_end & KVM_INST_B_MASK;
 180         switch (get_rt(rt)) {
 181         case 30:
 182                 kvm_patch_ins_ll(&p[kvm_emulate_mtmsrd_reg_offs],
 183                                  magic_var(scratch2), KVM_RT_30);
 184                 break;
 185         case 31:
 186                 kvm_patch_ins_ll(&p[kvm_emulate_mtmsrd_reg_offs],
 187                                  magic_var(scratch1), KVM_RT_30);
 188                 break;
 189         default:
 190                 p[kvm_emulate_mtmsrd_reg_offs] |= rt;
 191                 break;
 192         }
 193 
 194         p[kvm_emulate_mtmsrd_orig_ins_offs] = *inst;
 195         flush_icache_range((ulong)p, (ulong)p + kvm_emulate_mtmsrd_len * 4);
 196 
 197         /* Patch the invocation */
 198         kvm_patch_ins_b(inst, distance_start);
 199 }
 200 
 201 extern u32 kvm_emulate_mtmsr_branch_offs;
 202 extern u32 kvm_emulate_mtmsr_reg1_offs;
 203 extern u32 kvm_emulate_mtmsr_reg2_offs;
 204 extern u32 kvm_emulate_mtmsr_orig_ins_offs;
 205 extern u32 kvm_emulate_mtmsr_len;
 206 extern u32 kvm_emulate_mtmsr[];
 207 
 208 static void __init kvm_patch_ins_mtmsr(u32 *inst, u32 rt)
 209 {
 210         u32 *p;
 211         int distance_start;
 212         int distance_end;
 213         ulong next_inst;
 214 
 215         p = kvm_alloc(kvm_emulate_mtmsr_len * 4);
 216         if (!p)
 217                 return;
 218 
 219         /* Find out where we are and put everything there */
 220         distance_start = (ulong)p - (ulong)inst;
 221         next_inst = ((ulong)inst + 4);
 222         distance_end = next_inst - (ulong)&p[kvm_emulate_mtmsr_branch_offs];
 223 
 224         /* Make sure we only write valid b instructions */
 225         if (distance_start > KVM_INST_B_MAX) {
 226                 kvm_patching_worked = false;
 227                 return;
 228         }
 229 
 230         /* Modify the chunk to fit the invocation */
 231         memcpy(p, kvm_emulate_mtmsr, kvm_emulate_mtmsr_len * 4);
 232         p[kvm_emulate_mtmsr_branch_offs] |= distance_end & KVM_INST_B_MASK;
 233 
 234         /* Make clobbered registers work too */
 235         switch (get_rt(rt)) {
 236         case 30:
 237                 kvm_patch_ins_ll(&p[kvm_emulate_mtmsr_reg1_offs],
 238                                  magic_var(scratch2), KVM_RT_30);
 239                 kvm_patch_ins_ll(&p[kvm_emulate_mtmsr_reg2_offs],
 240                                  magic_var(scratch2), KVM_RT_30);
 241                 break;
 242         case 31:
 243                 kvm_patch_ins_ll(&p[kvm_emulate_mtmsr_reg1_offs],
 244                                  magic_var(scratch1), KVM_RT_30);
 245                 kvm_patch_ins_ll(&p[kvm_emulate_mtmsr_reg2_offs],
 246                                  magic_var(scratch1), KVM_RT_30);
 247                 break;
 248         default:
 249                 p[kvm_emulate_mtmsr_reg1_offs] |= rt;
 250                 p[kvm_emulate_mtmsr_reg2_offs] |= rt;
 251                 break;
 252         }
 253 
 254         p[kvm_emulate_mtmsr_orig_ins_offs] = *inst;
 255         flush_icache_range((ulong)p, (ulong)p + kvm_emulate_mtmsr_len * 4);
 256 
 257         /* Patch the invocation */
 258         kvm_patch_ins_b(inst, distance_start);
 259 }
 260 
 261 #ifdef CONFIG_BOOKE
 262 
 263 extern u32 kvm_emulate_wrtee_branch_offs;
 264 extern u32 kvm_emulate_wrtee_reg_offs;
 265 extern u32 kvm_emulate_wrtee_orig_ins_offs;
 266 extern u32 kvm_emulate_wrtee_len;
 267 extern u32 kvm_emulate_wrtee[];
 268 
 269 static void __init kvm_patch_ins_wrtee(u32 *inst, u32 rt, int imm_one)
 270 {
 271         u32 *p;
 272         int distance_start;
 273         int distance_end;
 274         ulong next_inst;
 275 
 276         p = kvm_alloc(kvm_emulate_wrtee_len * 4);
 277         if (!p)
 278                 return;
 279 
 280         /* Find out where we are and put everything there */
 281         distance_start = (ulong)p - (ulong)inst;
 282         next_inst = ((ulong)inst + 4);
 283         distance_end = next_inst - (ulong)&p[kvm_emulate_wrtee_branch_offs];
 284 
 285         /* Make sure we only write valid b instructions */
 286         if (distance_start > KVM_INST_B_MAX) {
 287                 kvm_patching_worked = false;
 288                 return;
 289         }
 290 
 291         /* Modify the chunk to fit the invocation */
 292         memcpy(p, kvm_emulate_wrtee, kvm_emulate_wrtee_len * 4);
 293         p[kvm_emulate_wrtee_branch_offs] |= distance_end & KVM_INST_B_MASK;
 294 
 295         if (imm_one) {
 296                 p[kvm_emulate_wrtee_reg_offs] =
 297                         KVM_INST_LI | __PPC_RT(R30) | MSR_EE;
 298         } else {
 299                 /* Make clobbered registers work too */
 300                 switch (get_rt(rt)) {
 301                 case 30:
 302                         kvm_patch_ins_ll(&p[kvm_emulate_wrtee_reg_offs],
 303                                          magic_var(scratch2), KVM_RT_30);
 304                         break;
 305                 case 31:
 306                         kvm_patch_ins_ll(&p[kvm_emulate_wrtee_reg_offs],
 307                                          magic_var(scratch1), KVM_RT_30);
 308                         break;
 309                 default:
 310                         p[kvm_emulate_wrtee_reg_offs] |= rt;
 311                         break;
 312                 }
 313         }
 314 
 315         p[kvm_emulate_wrtee_orig_ins_offs] = *inst;
 316         flush_icache_range((ulong)p, (ulong)p + kvm_emulate_wrtee_len * 4);
 317 
 318         /* Patch the invocation */
 319         kvm_patch_ins_b(inst, distance_start);
 320 }
 321 
 322 extern u32 kvm_emulate_wrteei_0_branch_offs;
 323 extern u32 kvm_emulate_wrteei_0_len;
 324 extern u32 kvm_emulate_wrteei_0[];
 325 
 326 static void __init kvm_patch_ins_wrteei_0(u32 *inst)
 327 {
 328         u32 *p;
 329         int distance_start;
 330         int distance_end;
 331         ulong next_inst;
 332 
 333         p = kvm_alloc(kvm_emulate_wrteei_0_len * 4);
 334         if (!p)
 335                 return;
 336 
 337         /* Find out where we are and put everything there */
 338         distance_start = (ulong)p - (ulong)inst;
 339         next_inst = ((ulong)inst + 4);
 340         distance_end = next_inst - (ulong)&p[kvm_emulate_wrteei_0_branch_offs];
 341 
 342         /* Make sure we only write valid b instructions */
 343         if (distance_start > KVM_INST_B_MAX) {
 344                 kvm_patching_worked = false;
 345                 return;
 346         }
 347 
 348         memcpy(p, kvm_emulate_wrteei_0, kvm_emulate_wrteei_0_len * 4);
 349         p[kvm_emulate_wrteei_0_branch_offs] |= distance_end & KVM_INST_B_MASK;
 350         flush_icache_range((ulong)p, (ulong)p + kvm_emulate_wrteei_0_len * 4);
 351 
 352         /* Patch the invocation */
 353         kvm_patch_ins_b(inst, distance_start);
 354 }
 355 
 356 #endif
 357 
 358 #ifdef CONFIG_PPC_BOOK3S_32
 359 
 360 extern u32 kvm_emulate_mtsrin_branch_offs;
 361 extern u32 kvm_emulate_mtsrin_reg1_offs;
 362 extern u32 kvm_emulate_mtsrin_reg2_offs;
 363 extern u32 kvm_emulate_mtsrin_orig_ins_offs;
 364 extern u32 kvm_emulate_mtsrin_len;
 365 extern u32 kvm_emulate_mtsrin[];
 366 
 367 static void __init kvm_patch_ins_mtsrin(u32 *inst, u32 rt, u32 rb)
 368 {
 369         u32 *p;
 370         int distance_start;
 371         int distance_end;
 372         ulong next_inst;
 373 
 374         p = kvm_alloc(kvm_emulate_mtsrin_len * 4);
 375         if (!p)
 376                 return;
 377 
 378         /* Find out where we are and put everything there */
 379         distance_start = (ulong)p - (ulong)inst;
 380         next_inst = ((ulong)inst + 4);
 381         distance_end = next_inst - (ulong)&p[kvm_emulate_mtsrin_branch_offs];
 382 
 383         /* Make sure we only write valid b instructions */
 384         if (distance_start > KVM_INST_B_MAX) {
 385                 kvm_patching_worked = false;
 386                 return;
 387         }
 388 
 389         /* Modify the chunk to fit the invocation */
 390         memcpy(p, kvm_emulate_mtsrin, kvm_emulate_mtsrin_len * 4);
 391         p[kvm_emulate_mtsrin_branch_offs] |= distance_end & KVM_INST_B_MASK;
 392         p[kvm_emulate_mtsrin_reg1_offs] |= (rb << 10);
 393         p[kvm_emulate_mtsrin_reg2_offs] |= rt;
 394         p[kvm_emulate_mtsrin_orig_ins_offs] = *inst;
 395         flush_icache_range((ulong)p, (ulong)p + kvm_emulate_mtsrin_len * 4);
 396 
 397         /* Patch the invocation */
 398         kvm_patch_ins_b(inst, distance_start);
 399 }
 400 
 401 #endif
 402 
 403 static void __init kvm_map_magic_page(void *data)
 404 {
 405         u32 *features = data;
 406 
 407         ulong in[8] = {0};
 408         ulong out[8];
 409 
 410         in[0] = KVM_MAGIC_PAGE;
 411         in[1] = KVM_MAGIC_PAGE | MAGIC_PAGE_FLAG_NOT_MAPPED_NX;
 412 
 413         epapr_hypercall(in, out, KVM_HCALL_TOKEN(KVM_HC_PPC_MAP_MAGIC_PAGE));
 414 
 415         *features = out[0];
 416 }
 417 
 418 static void __init kvm_check_ins(u32 *inst, u32 features)
 419 {
 420         u32 _inst = *inst;
 421         u32 inst_no_rt = _inst & ~KVM_MASK_RT;
 422         u32 inst_rt = _inst & KVM_MASK_RT;
 423 
 424         switch (inst_no_rt) {
 425         /* Loads */
 426         case KVM_INST_MFMSR:
 427                 kvm_patch_ins_ld(inst, magic_var(msr), inst_rt);
 428                 break;
 429         case KVM_INST_MFSPR(SPRN_SPRG0):
 430                 kvm_patch_ins_ld(inst, magic_var(sprg0), inst_rt);
 431                 break;
 432         case KVM_INST_MFSPR(SPRN_SPRG1):
 433                 kvm_patch_ins_ld(inst, magic_var(sprg1), inst_rt);
 434                 break;
 435         case KVM_INST_MFSPR(SPRN_SPRG2):
 436                 kvm_patch_ins_ld(inst, magic_var(sprg2), inst_rt);
 437                 break;
 438         case KVM_INST_MFSPR(SPRN_SPRG3):
 439                 kvm_patch_ins_ld(inst, magic_var(sprg3), inst_rt);
 440                 break;
 441         case KVM_INST_MFSPR(SPRN_SRR0):
 442                 kvm_patch_ins_ld(inst, magic_var(srr0), inst_rt);
 443                 break;
 444         case KVM_INST_MFSPR(SPRN_SRR1):
 445                 kvm_patch_ins_ld(inst, magic_var(srr1), inst_rt);
 446                 break;
 447 #ifdef CONFIG_BOOKE
 448         case KVM_INST_MFSPR(SPRN_DEAR):
 449 #else
 450         case KVM_INST_MFSPR(SPRN_DAR):
 451 #endif
 452                 kvm_patch_ins_ld(inst, magic_var(dar), inst_rt);
 453                 break;
 454         case KVM_INST_MFSPR(SPRN_DSISR):
 455                 kvm_patch_ins_lwz(inst, magic_var(dsisr), inst_rt);
 456                 break;
 457 
 458 #ifdef CONFIG_PPC_BOOK3E_MMU
 459         case KVM_INST_MFSPR(SPRN_MAS0):
 460                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 461                         kvm_patch_ins_lwz(inst, magic_var(mas0), inst_rt);
 462                 break;
 463         case KVM_INST_MFSPR(SPRN_MAS1):
 464                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 465                         kvm_patch_ins_lwz(inst, magic_var(mas1), inst_rt);
 466                 break;
 467         case KVM_INST_MFSPR(SPRN_MAS2):
 468                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 469                         kvm_patch_ins_ld(inst, magic_var(mas2), inst_rt);
 470                 break;
 471         case KVM_INST_MFSPR(SPRN_MAS3):
 472                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 473                         kvm_patch_ins_lwz(inst, magic_var(mas7_3) + 4, inst_rt);
 474                 break;
 475         case KVM_INST_MFSPR(SPRN_MAS4):
 476                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 477                         kvm_patch_ins_lwz(inst, magic_var(mas4), inst_rt);
 478                 break;
 479         case KVM_INST_MFSPR(SPRN_MAS6):
 480                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 481                         kvm_patch_ins_lwz(inst, magic_var(mas6), inst_rt);
 482                 break;
 483         case KVM_INST_MFSPR(SPRN_MAS7):
 484                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 485                         kvm_patch_ins_lwz(inst, magic_var(mas7_3), inst_rt);
 486                 break;
 487 #endif /* CONFIG_PPC_BOOK3E_MMU */
 488 
 489         case KVM_INST_MFSPR(SPRN_SPRG4):
 490 #ifdef CONFIG_BOOKE
 491         case KVM_INST_MFSPR(SPRN_SPRG4R):
 492 #endif
 493                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 494                         kvm_patch_ins_ld(inst, magic_var(sprg4), inst_rt);
 495                 break;
 496         case KVM_INST_MFSPR(SPRN_SPRG5):
 497 #ifdef CONFIG_BOOKE
 498         case KVM_INST_MFSPR(SPRN_SPRG5R):
 499 #endif
 500                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 501                         kvm_patch_ins_ld(inst, magic_var(sprg5), inst_rt);
 502                 break;
 503         case KVM_INST_MFSPR(SPRN_SPRG6):
 504 #ifdef CONFIG_BOOKE
 505         case KVM_INST_MFSPR(SPRN_SPRG6R):
 506 #endif
 507                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 508                         kvm_patch_ins_ld(inst, magic_var(sprg6), inst_rt);
 509                 break;
 510         case KVM_INST_MFSPR(SPRN_SPRG7):
 511 #ifdef CONFIG_BOOKE
 512         case KVM_INST_MFSPR(SPRN_SPRG7R):
 513 #endif
 514                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 515                         kvm_patch_ins_ld(inst, magic_var(sprg7), inst_rt);
 516                 break;
 517 
 518 #ifdef CONFIG_BOOKE
 519         case KVM_INST_MFSPR(SPRN_ESR):
 520                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 521                         kvm_patch_ins_lwz(inst, magic_var(esr), inst_rt);
 522                 break;
 523 #endif
 524 
 525         case KVM_INST_MFSPR(SPRN_PIR):
 526                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 527                         kvm_patch_ins_lwz(inst, magic_var(pir), inst_rt);
 528                 break;
 529 
 530 
 531         /* Stores */
 532         case KVM_INST_MTSPR(SPRN_SPRG0):
 533                 kvm_patch_ins_std(inst, magic_var(sprg0), inst_rt);
 534                 break;
 535         case KVM_INST_MTSPR(SPRN_SPRG1):
 536                 kvm_patch_ins_std(inst, magic_var(sprg1), inst_rt);
 537                 break;
 538         case KVM_INST_MTSPR(SPRN_SPRG2):
 539                 kvm_patch_ins_std(inst, magic_var(sprg2), inst_rt);
 540                 break;
 541         case KVM_INST_MTSPR(SPRN_SPRG3):
 542                 kvm_patch_ins_std(inst, magic_var(sprg3), inst_rt);
 543                 break;
 544         case KVM_INST_MTSPR(SPRN_SRR0):
 545                 kvm_patch_ins_std(inst, magic_var(srr0), inst_rt);
 546                 break;
 547         case KVM_INST_MTSPR(SPRN_SRR1):
 548                 kvm_patch_ins_std(inst, magic_var(srr1), inst_rt);
 549                 break;
 550 #ifdef CONFIG_BOOKE
 551         case KVM_INST_MTSPR(SPRN_DEAR):
 552 #else
 553         case KVM_INST_MTSPR(SPRN_DAR):
 554 #endif
 555                 kvm_patch_ins_std(inst, magic_var(dar), inst_rt);
 556                 break;
 557         case KVM_INST_MTSPR(SPRN_DSISR):
 558                 kvm_patch_ins_stw(inst, magic_var(dsisr), inst_rt);
 559                 break;
 560 #ifdef CONFIG_PPC_BOOK3E_MMU
 561         case KVM_INST_MTSPR(SPRN_MAS0):
 562                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 563                         kvm_patch_ins_stw(inst, magic_var(mas0), inst_rt);
 564                 break;
 565         case KVM_INST_MTSPR(SPRN_MAS1):
 566                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 567                         kvm_patch_ins_stw(inst, magic_var(mas1), inst_rt);
 568                 break;
 569         case KVM_INST_MTSPR(SPRN_MAS2):
 570                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 571                         kvm_patch_ins_std(inst, magic_var(mas2), inst_rt);
 572                 break;
 573         case KVM_INST_MTSPR(SPRN_MAS3):
 574                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 575                         kvm_patch_ins_stw(inst, magic_var(mas7_3) + 4, inst_rt);
 576                 break;
 577         case KVM_INST_MTSPR(SPRN_MAS4):
 578                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 579                         kvm_patch_ins_stw(inst, magic_var(mas4), inst_rt);
 580                 break;
 581         case KVM_INST_MTSPR(SPRN_MAS6):
 582                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 583                         kvm_patch_ins_stw(inst, magic_var(mas6), inst_rt);
 584                 break;
 585         case KVM_INST_MTSPR(SPRN_MAS7):
 586                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 587                         kvm_patch_ins_stw(inst, magic_var(mas7_3), inst_rt);
 588                 break;
 589 #endif /* CONFIG_PPC_BOOK3E_MMU */
 590 
 591         case KVM_INST_MTSPR(SPRN_SPRG4):
 592                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 593                         kvm_patch_ins_std(inst, magic_var(sprg4), inst_rt);
 594                 break;
 595         case KVM_INST_MTSPR(SPRN_SPRG5):
 596                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 597                         kvm_patch_ins_std(inst, magic_var(sprg5), inst_rt);
 598                 break;
 599         case KVM_INST_MTSPR(SPRN_SPRG6):
 600                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 601                         kvm_patch_ins_std(inst, magic_var(sprg6), inst_rt);
 602                 break;
 603         case KVM_INST_MTSPR(SPRN_SPRG7):
 604                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 605                         kvm_patch_ins_std(inst, magic_var(sprg7), inst_rt);
 606                 break;
 607 
 608 #ifdef CONFIG_BOOKE
 609         case KVM_INST_MTSPR(SPRN_ESR):
 610                 if (features & KVM_MAGIC_FEAT_MAS0_TO_SPRG7)
 611                         kvm_patch_ins_stw(inst, magic_var(esr), inst_rt);
 612                 break;
 613 #endif
 614 
 615         /* Nops */
 616         case KVM_INST_TLBSYNC:
 617                 kvm_patch_ins_nop(inst);
 618                 break;
 619 
 620         /* Rewrites */
 621         case KVM_INST_MTMSRD_L1:
 622                 kvm_patch_ins_mtmsrd(inst, inst_rt);
 623                 break;
 624         case KVM_INST_MTMSR:
 625         case KVM_INST_MTMSRD_L0:
 626                 kvm_patch_ins_mtmsr(inst, inst_rt);
 627                 break;
 628 #ifdef CONFIG_BOOKE
 629         case KVM_INST_WRTEE:
 630                 kvm_patch_ins_wrtee(inst, inst_rt, 0);
 631                 break;
 632 #endif
 633         }
 634 
 635         switch (inst_no_rt & ~KVM_MASK_RB) {
 636 #ifdef CONFIG_PPC_BOOK3S_32
 637         case KVM_INST_MTSRIN:
 638                 if (features & KVM_MAGIC_FEAT_SR) {
 639                         u32 inst_rb = _inst & KVM_MASK_RB;
 640                         kvm_patch_ins_mtsrin(inst, inst_rt, inst_rb);
 641                 }
 642                 break;
 643 #endif
 644         }
 645 
 646         switch (_inst) {
 647 #ifdef CONFIG_BOOKE
 648         case KVM_INST_WRTEEI_0:
 649                 kvm_patch_ins_wrteei_0(inst);
 650                 break;
 651 
 652         case KVM_INST_WRTEEI_1:
 653                 kvm_patch_ins_wrtee(inst, 0, 1);
 654                 break;
 655 #endif
 656         }
 657 }
 658 
 659 extern u32 kvm_template_start[];
 660 extern u32 kvm_template_end[];
 661 
 662 static void __init kvm_use_magic_page(void)
 663 {
 664         u32 *p;
 665         u32 *start, *end;
 666         u32 features;
 667 
 668         /* Tell the host to map the magic page to -4096 on all CPUs */
 669         on_each_cpu(kvm_map_magic_page, &features, 1);
 670 
 671         /* Quick self-test to see if the mapping works */
 672         if (!fault_in_pages_readable((const char *)KVM_MAGIC_PAGE, sizeof(u32))) {
 673                 kvm_patching_worked = false;
 674                 return;
 675         }
 676 
 677         /* Now loop through all code and find instructions */
 678         start = (void*)_stext;
 679         end = (void*)_etext;
 680 
 681         /*
 682          * Being interrupted in the middle of patching would
 683          * be bad for SPRG4-7, which KVM can't keep in sync
 684          * with emulated accesses because reads don't trap.
 685          */
 686         local_irq_disable();
 687 
 688         for (p = start; p < end; p++) {
 689                 /* Avoid patching the template code */
 690                 if (p >= kvm_template_start && p < kvm_template_end) {
 691                         p = kvm_template_end - 1;
 692                         continue;
 693                 }
 694                 kvm_check_ins(p, features);
 695         }
 696 
 697         local_irq_enable();
 698 
 699         printk(KERN_INFO "KVM: Live patching for a fast VM %s\n",
 700                          kvm_patching_worked ? "worked" : "failed");
 701 }
 702 
 703 static int __init kvm_guest_init(void)
 704 {
 705         if (!kvm_para_available())
 706                 return 0;
 707 
 708         if (!epapr_paravirt_enabled)
 709                 return 0;
 710 
 711         if (kvm_para_has_feature(KVM_FEATURE_MAGIC_PAGE))
 712                 kvm_use_magic_page();
 713 
 714 #ifdef CONFIG_PPC_BOOK3S_64
 715         /* Enable napping */
 716         powersave_nap = 1;
 717 #endif
 718 
 719         return 0;
 720 }
 721 
 722 postcore_initcall(kvm_guest_init);

/* [<][>][^][v][top][bottom][index][help] */