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