xref: /linux/arch/powerpc/kvm/book3s_hv_nestedv2.c (revision 0b65365f)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright 2023 Jordan Niethe, IBM Corp. <jniethe5@gmail.com>
4  *
5  * Authors:
6  *    Jordan Niethe <jniethe5@gmail.com>
7  *
8  * Description: KVM functions specific to running on Book 3S
9  * processors as a NESTEDv2 guest.
10  *
11  */
12 
13 #include "linux/blk-mq.h"
14 #include "linux/console.h"
15 #include "linux/gfp_types.h"
16 #include "linux/signal.h"
17 #include <linux/kernel.h>
18 #include <linux/kvm_host.h>
19 #include <linux/pgtable.h>
20 
21 #include <asm/kvm_ppc.h>
22 #include <asm/kvm_book3s.h>
23 #include <asm/hvcall.h>
24 #include <asm/pgalloc.h>
25 #include <asm/reg.h>
26 #include <asm/plpar_wrappers.h>
27 #include <asm/guest-state-buffer.h>
28 #include "trace_hv.h"
29 
30 struct static_key_false __kvmhv_is_nestedv2 __read_mostly;
31 EXPORT_SYMBOL_GPL(__kvmhv_is_nestedv2);
32 
33 
34 static size_t
gs_msg_ops_kvmhv_nestedv2_config_get_size(struct kvmppc_gs_msg * gsm)35 gs_msg_ops_kvmhv_nestedv2_config_get_size(struct kvmppc_gs_msg *gsm)
36 {
37 	u16 ids[] = {
38 		KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE,
39 		KVMPPC_GSID_RUN_INPUT,
40 		KVMPPC_GSID_RUN_OUTPUT,
41 
42 	};
43 	size_t size = 0;
44 
45 	for (int i = 0; i < ARRAY_SIZE(ids); i++)
46 		size += kvmppc_gse_total_size(kvmppc_gsid_size(ids[i]));
47 	return size;
48 }
49 
50 static int
gs_msg_ops_kvmhv_nestedv2_config_fill_info(struct kvmppc_gs_buff * gsb,struct kvmppc_gs_msg * gsm)51 gs_msg_ops_kvmhv_nestedv2_config_fill_info(struct kvmppc_gs_buff *gsb,
52 					   struct kvmppc_gs_msg *gsm)
53 {
54 	struct kvmhv_nestedv2_config *cfg;
55 	int rc;
56 
57 	cfg = gsm->data;
58 
59 	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE)) {
60 		rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE,
61 					cfg->vcpu_run_output_size);
62 		if (rc < 0)
63 			return rc;
64 	}
65 
66 	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_INPUT)) {
67 		rc = kvmppc_gse_put_buff_info(gsb, KVMPPC_GSID_RUN_INPUT,
68 					      cfg->vcpu_run_input_cfg);
69 		if (rc < 0)
70 			return rc;
71 	}
72 
73 	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_OUTPUT)) {
74 		rc = kvmppc_gse_put_buff_info(gsb, KVMPPC_GSID_RUN_OUTPUT,
75 					      cfg->vcpu_run_output_cfg);
76 		if (rc < 0)
77 			return rc;
78 	}
79 
80 	return 0;
81 }
82 
83 static int
gs_msg_ops_kvmhv_nestedv2_config_refresh_info(struct kvmppc_gs_msg * gsm,struct kvmppc_gs_buff * gsb)84 gs_msg_ops_kvmhv_nestedv2_config_refresh_info(struct kvmppc_gs_msg *gsm,
85 					      struct kvmppc_gs_buff *gsb)
86 {
87 	struct kvmhv_nestedv2_config *cfg;
88 	struct kvmppc_gs_parser gsp = { 0 };
89 	struct kvmppc_gs_elem *gse;
90 	int rc;
91 
92 	cfg = gsm->data;
93 
94 	rc = kvmppc_gse_parse(&gsp, gsb);
95 	if (rc < 0)
96 		return rc;
97 
98 	gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE);
99 	if (gse)
100 		cfg->vcpu_run_output_size = kvmppc_gse_get_u64(gse);
101 	return 0;
102 }
103 
104 static struct kvmppc_gs_msg_ops config_msg_ops = {
105 	.get_size = gs_msg_ops_kvmhv_nestedv2_config_get_size,
106 	.fill_info = gs_msg_ops_kvmhv_nestedv2_config_fill_info,
107 	.refresh_info = gs_msg_ops_kvmhv_nestedv2_config_refresh_info,
108 };
109 
gs_msg_ops_vcpu_get_size(struct kvmppc_gs_msg * gsm)110 static size_t gs_msg_ops_vcpu_get_size(struct kvmppc_gs_msg *gsm)
111 {
112 	struct kvmppc_gs_bitmap gsbm = { 0 };
113 	size_t size = 0;
114 	u16 iden;
115 
116 	kvmppc_gsbm_fill(&gsbm);
117 	kvmppc_gsbm_for_each(&gsbm, iden)
118 	{
119 		switch (iden) {
120 		case KVMPPC_GSID_HOST_STATE_SIZE:
121 		case KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE:
122 		case KVMPPC_GSID_PARTITION_TABLE:
123 		case KVMPPC_GSID_PROCESS_TABLE:
124 		case KVMPPC_GSID_RUN_INPUT:
125 		case KVMPPC_GSID_RUN_OUTPUT:
126 			break;
127 		default:
128 			size += kvmppc_gse_total_size(kvmppc_gsid_size(iden));
129 		}
130 	}
131 	return size;
132 }
133 
gs_msg_ops_vcpu_fill_info(struct kvmppc_gs_buff * gsb,struct kvmppc_gs_msg * gsm)134 static int gs_msg_ops_vcpu_fill_info(struct kvmppc_gs_buff *gsb,
135 				     struct kvmppc_gs_msg *gsm)
136 {
137 	struct kvm_vcpu *vcpu;
138 	vector128 v;
139 	int rc, i;
140 	u16 iden;
141 	u32 arch_compat = 0;
142 
143 	vcpu = gsm->data;
144 
145 	kvmppc_gsm_for_each(gsm, iden)
146 	{
147 		rc = 0;
148 
149 		if ((gsm->flags & KVMPPC_GS_FLAGS_WIDE) !=
150 		    (kvmppc_gsid_flags(iden) & KVMPPC_GS_FLAGS_WIDE))
151 			continue;
152 
153 		switch (iden) {
154 		case KVMPPC_GSID_DSCR:
155 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.dscr);
156 			break;
157 		case KVMPPC_GSID_MMCRA:
158 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.mmcra);
159 			break;
160 		case KVMPPC_GSID_HFSCR:
161 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.hfscr);
162 			break;
163 		case KVMPPC_GSID_PURR:
164 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.purr);
165 			break;
166 		case KVMPPC_GSID_SPURR:
167 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.spurr);
168 			break;
169 		case KVMPPC_GSID_AMR:
170 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.amr);
171 			break;
172 		case KVMPPC_GSID_UAMOR:
173 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.uamor);
174 			break;
175 		case KVMPPC_GSID_SIAR:
176 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.siar);
177 			break;
178 		case KVMPPC_GSID_SDAR:
179 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.sdar);
180 			break;
181 		case KVMPPC_GSID_IAMR:
182 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.iamr);
183 			break;
184 		case KVMPPC_GSID_DAWR0:
185 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.dawr0);
186 			break;
187 		case KVMPPC_GSID_DAWR1:
188 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.dawr1);
189 			break;
190 		case KVMPPC_GSID_DAWRX0:
191 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.dawrx0);
192 			break;
193 		case KVMPPC_GSID_DAWRX1:
194 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.dawrx1);
195 			break;
196 		case KVMPPC_GSID_DEXCR:
197 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.dexcr);
198 			break;
199 		case KVMPPC_GSID_HASHKEYR:
200 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.hashkeyr);
201 			break;
202 		case KVMPPC_GSID_HASHPKEYR:
203 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.hashpkeyr);
204 			break;
205 		case KVMPPC_GSID_CIABR:
206 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ciabr);
207 			break;
208 		case KVMPPC_GSID_WORT:
209 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.wort);
210 			break;
211 		case KVMPPC_GSID_PPR:
212 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ppr);
213 			break;
214 		case KVMPPC_GSID_PSPB:
215 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.pspb);
216 			break;
217 		case KVMPPC_GSID_TAR:
218 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.tar);
219 			break;
220 		case KVMPPC_GSID_FSCR:
221 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.fscr);
222 			break;
223 		case KVMPPC_GSID_EBBHR:
224 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ebbhr);
225 			break;
226 		case KVMPPC_GSID_EBBRR:
227 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ebbrr);
228 			break;
229 		case KVMPPC_GSID_BESCR:
230 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.bescr);
231 			break;
232 		case KVMPPC_GSID_IC:
233 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ic);
234 			break;
235 		case KVMPPC_GSID_CTRL:
236 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ctrl);
237 			break;
238 		case KVMPPC_GSID_PIDR:
239 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.pid);
240 			break;
241 		case KVMPPC_GSID_AMOR: {
242 			u64 amor = ~0;
243 
244 			rc = kvmppc_gse_put_u64(gsb, iden, amor);
245 			break;
246 		}
247 		case KVMPPC_GSID_VRSAVE:
248 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.vrsave);
249 			break;
250 		case KVMPPC_GSID_MMCR(0)... KVMPPC_GSID_MMCR(3):
251 			i = iden - KVMPPC_GSID_MMCR(0);
252 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.mmcr[i]);
253 			break;
254 		case KVMPPC_GSID_SIER(0)... KVMPPC_GSID_SIER(2):
255 			i = iden - KVMPPC_GSID_SIER(0);
256 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.sier[i]);
257 			break;
258 		case KVMPPC_GSID_PMC(0)... KVMPPC_GSID_PMC(5):
259 			i = iden - KVMPPC_GSID_PMC(0);
260 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.pmc[i]);
261 			break;
262 		case KVMPPC_GSID_GPR(0)... KVMPPC_GSID_GPR(31):
263 			i = iden - KVMPPC_GSID_GPR(0);
264 			rc = kvmppc_gse_put_u64(gsb, iden,
265 						vcpu->arch.regs.gpr[i]);
266 			break;
267 		case KVMPPC_GSID_CR:
268 			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.regs.ccr);
269 			break;
270 		case KVMPPC_GSID_XER:
271 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.regs.xer);
272 			break;
273 		case KVMPPC_GSID_CTR:
274 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.regs.ctr);
275 			break;
276 		case KVMPPC_GSID_LR:
277 			rc = kvmppc_gse_put_u64(gsb, iden,
278 						vcpu->arch.regs.link);
279 			break;
280 		case KVMPPC_GSID_NIA:
281 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.regs.nip);
282 			break;
283 		case KVMPPC_GSID_SRR0:
284 			rc = kvmppc_gse_put_u64(gsb, iden,
285 						vcpu->arch.shregs.srr0);
286 			break;
287 		case KVMPPC_GSID_SRR1:
288 			rc = kvmppc_gse_put_u64(gsb, iden,
289 						vcpu->arch.shregs.srr1);
290 			break;
291 		case KVMPPC_GSID_SPRG0:
292 			rc = kvmppc_gse_put_u64(gsb, iden,
293 						vcpu->arch.shregs.sprg0);
294 			break;
295 		case KVMPPC_GSID_SPRG1:
296 			rc = kvmppc_gse_put_u64(gsb, iden,
297 						vcpu->arch.shregs.sprg1);
298 			break;
299 		case KVMPPC_GSID_SPRG2:
300 			rc = kvmppc_gse_put_u64(gsb, iden,
301 						vcpu->arch.shregs.sprg2);
302 			break;
303 		case KVMPPC_GSID_SPRG3:
304 			rc = kvmppc_gse_put_u64(gsb, iden,
305 						vcpu->arch.shregs.sprg3);
306 			break;
307 		case KVMPPC_GSID_DAR:
308 			rc = kvmppc_gse_put_u64(gsb, iden,
309 						vcpu->arch.shregs.dar);
310 			break;
311 		case KVMPPC_GSID_DSISR:
312 			rc = kvmppc_gse_put_u32(gsb, iden,
313 						vcpu->arch.shregs.dsisr);
314 			break;
315 		case KVMPPC_GSID_MSR:
316 			rc = kvmppc_gse_put_u64(gsb, iden,
317 						vcpu->arch.shregs.msr);
318 			break;
319 		case KVMPPC_GSID_VTB:
320 			rc = kvmppc_gse_put_u64(gsb, iden,
321 						vcpu->arch.vcore->vtb);
322 			break;
323 		case KVMPPC_GSID_DPDES:
324 			rc = kvmppc_gse_put_u64(gsb, iden,
325 						vcpu->arch.vcore->dpdes);
326 			break;
327 		case KVMPPC_GSID_LPCR:
328 			rc = kvmppc_gse_put_u64(gsb, iden,
329 						vcpu->arch.vcore->lpcr);
330 			break;
331 		case KVMPPC_GSID_TB_OFFSET:
332 			rc = kvmppc_gse_put_u64(gsb, iden,
333 						vcpu->arch.vcore->tb_offset);
334 			break;
335 		case KVMPPC_GSID_FPSCR:
336 			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.fp.fpscr);
337 			break;
338 		case KVMPPC_GSID_VSRS(0)... KVMPPC_GSID_VSRS(31):
339 			i = iden - KVMPPC_GSID_VSRS(0);
340 			memcpy(&v, &vcpu->arch.fp.fpr[i],
341 			       sizeof(vcpu->arch.fp.fpr[i]));
342 			rc = kvmppc_gse_put_vector128(gsb, iden, &v);
343 			break;
344 #ifdef CONFIG_VSX
345 		case KVMPPC_GSID_VSCR:
346 			rc = kvmppc_gse_put_u32(gsb, iden,
347 						vcpu->arch.vr.vscr.u[3]);
348 			break;
349 		case KVMPPC_GSID_VSRS(32)... KVMPPC_GSID_VSRS(63):
350 			i = iden - KVMPPC_GSID_VSRS(32);
351 			rc = kvmppc_gse_put_vector128(gsb, iden,
352 						      &vcpu->arch.vr.vr[i]);
353 			break;
354 #endif
355 		case KVMPPC_GSID_DEC_EXPIRY_TB: {
356 			u64 dw;
357 
358 			dw = vcpu->arch.dec_expires -
359 			     vcpu->arch.vcore->tb_offset;
360 			rc = kvmppc_gse_put_u64(gsb, iden, dw);
361 			break;
362 		}
363 		case KVMPPC_GSID_LOGICAL_PVR:
364 			/*
365 			 * Though 'arch_compat == 0' would mean the default
366 			 * compatibility, arch_compat, being a Guest Wide
367 			 * Element, cannot be filled with a value of 0 in GSB
368 			 * as this would result into a kernel trap.
369 			 * Hence, when `arch_compat == 0`, arch_compat should
370 			 * default to L1's PVR.
371 			 */
372 			if (!vcpu->arch.vcore->arch_compat) {
373 				if (cpu_has_feature(CPU_FTR_ARCH_31))
374 					arch_compat = PVR_ARCH_31;
375 				else if (cpu_has_feature(CPU_FTR_ARCH_300))
376 					arch_compat = PVR_ARCH_300;
377 			} else {
378 				arch_compat = vcpu->arch.vcore->arch_compat;
379 			}
380 			rc = kvmppc_gse_put_u32(gsb, iden, arch_compat);
381 			break;
382 		}
383 
384 		if (rc < 0)
385 			return rc;
386 	}
387 
388 	return 0;
389 }
390 
gs_msg_ops_vcpu_refresh_info(struct kvmppc_gs_msg * gsm,struct kvmppc_gs_buff * gsb)391 static int gs_msg_ops_vcpu_refresh_info(struct kvmppc_gs_msg *gsm,
392 					struct kvmppc_gs_buff *gsb)
393 {
394 	struct kvmppc_gs_parser gsp = { 0 };
395 	struct kvmhv_nestedv2_io *io;
396 	struct kvmppc_gs_bitmap *valids;
397 	struct kvm_vcpu *vcpu;
398 	struct kvmppc_gs_elem *gse;
399 	vector128 v;
400 	int rc, i;
401 	u16 iden;
402 
403 	vcpu = gsm->data;
404 
405 	rc = kvmppc_gse_parse(&gsp, gsb);
406 	if (rc < 0)
407 		return rc;
408 
409 	io = &vcpu->arch.nestedv2_io;
410 	valids = &io->valids;
411 
412 	kvmppc_gsp_for_each(&gsp, iden, gse)
413 	{
414 		switch (iden) {
415 		case KVMPPC_GSID_DSCR:
416 			vcpu->arch.dscr = kvmppc_gse_get_u64(gse);
417 			break;
418 		case KVMPPC_GSID_MMCRA:
419 			vcpu->arch.mmcra = kvmppc_gse_get_u64(gse);
420 			break;
421 		case KVMPPC_GSID_HFSCR:
422 			vcpu->arch.hfscr = kvmppc_gse_get_u64(gse);
423 			break;
424 		case KVMPPC_GSID_PURR:
425 			vcpu->arch.purr = kvmppc_gse_get_u64(gse);
426 			break;
427 		case KVMPPC_GSID_SPURR:
428 			vcpu->arch.spurr = kvmppc_gse_get_u64(gse);
429 			break;
430 		case KVMPPC_GSID_AMR:
431 			vcpu->arch.amr = kvmppc_gse_get_u64(gse);
432 			break;
433 		case KVMPPC_GSID_UAMOR:
434 			vcpu->arch.uamor = kvmppc_gse_get_u64(gse);
435 			break;
436 		case KVMPPC_GSID_SIAR:
437 			vcpu->arch.siar = kvmppc_gse_get_u64(gse);
438 			break;
439 		case KVMPPC_GSID_SDAR:
440 			vcpu->arch.sdar = kvmppc_gse_get_u64(gse);
441 			break;
442 		case KVMPPC_GSID_IAMR:
443 			vcpu->arch.iamr = kvmppc_gse_get_u64(gse);
444 			break;
445 		case KVMPPC_GSID_DAWR0:
446 			vcpu->arch.dawr0 = kvmppc_gse_get_u64(gse);
447 			break;
448 		case KVMPPC_GSID_DAWR1:
449 			vcpu->arch.dawr1 = kvmppc_gse_get_u64(gse);
450 			break;
451 		case KVMPPC_GSID_DAWRX0:
452 			vcpu->arch.dawrx0 = kvmppc_gse_get_u32(gse);
453 			break;
454 		case KVMPPC_GSID_DAWRX1:
455 			vcpu->arch.dawrx1 = kvmppc_gse_get_u32(gse);
456 			break;
457 		case KVMPPC_GSID_DEXCR:
458 			vcpu->arch.dexcr = kvmppc_gse_get_u64(gse);
459 			break;
460 		case KVMPPC_GSID_HASHKEYR:
461 			vcpu->arch.hashkeyr = kvmppc_gse_get_u64(gse);
462 			break;
463 		case KVMPPC_GSID_HASHPKEYR:
464 			vcpu->arch.hashpkeyr = kvmppc_gse_get_u64(gse);
465 			break;
466 		case KVMPPC_GSID_CIABR:
467 			vcpu->arch.ciabr = kvmppc_gse_get_u64(gse);
468 			break;
469 		case KVMPPC_GSID_WORT:
470 			vcpu->arch.wort = kvmppc_gse_get_u32(gse);
471 			break;
472 		case KVMPPC_GSID_PPR:
473 			vcpu->arch.ppr = kvmppc_gse_get_u64(gse);
474 			break;
475 		case KVMPPC_GSID_PSPB:
476 			vcpu->arch.pspb = kvmppc_gse_get_u32(gse);
477 			break;
478 		case KVMPPC_GSID_TAR:
479 			vcpu->arch.tar = kvmppc_gse_get_u64(gse);
480 			break;
481 		case KVMPPC_GSID_FSCR:
482 			vcpu->arch.fscr = kvmppc_gse_get_u64(gse);
483 			break;
484 		case KVMPPC_GSID_EBBHR:
485 			vcpu->arch.ebbhr = kvmppc_gse_get_u64(gse);
486 			break;
487 		case KVMPPC_GSID_EBBRR:
488 			vcpu->arch.ebbrr = kvmppc_gse_get_u64(gse);
489 			break;
490 		case KVMPPC_GSID_BESCR:
491 			vcpu->arch.bescr = kvmppc_gse_get_u64(gse);
492 			break;
493 		case KVMPPC_GSID_IC:
494 			vcpu->arch.ic = kvmppc_gse_get_u64(gse);
495 			break;
496 		case KVMPPC_GSID_CTRL:
497 			vcpu->arch.ctrl = kvmppc_gse_get_u64(gse);
498 			break;
499 		case KVMPPC_GSID_PIDR:
500 			vcpu->arch.pid = kvmppc_gse_get_u32(gse);
501 			break;
502 		case KVMPPC_GSID_AMOR:
503 			break;
504 		case KVMPPC_GSID_VRSAVE:
505 			vcpu->arch.vrsave = kvmppc_gse_get_u32(gse);
506 			break;
507 		case KVMPPC_GSID_MMCR(0)... KVMPPC_GSID_MMCR(3):
508 			i = iden - KVMPPC_GSID_MMCR(0);
509 			vcpu->arch.mmcr[i] = kvmppc_gse_get_u64(gse);
510 			break;
511 		case KVMPPC_GSID_SIER(0)... KVMPPC_GSID_SIER(2):
512 			i = iden - KVMPPC_GSID_SIER(0);
513 			vcpu->arch.sier[i] = kvmppc_gse_get_u64(gse);
514 			break;
515 		case KVMPPC_GSID_PMC(0)... KVMPPC_GSID_PMC(5):
516 			i = iden - KVMPPC_GSID_PMC(0);
517 			vcpu->arch.pmc[i] = kvmppc_gse_get_u32(gse);
518 			break;
519 		case KVMPPC_GSID_GPR(0)... KVMPPC_GSID_GPR(31):
520 			i = iden - KVMPPC_GSID_GPR(0);
521 			vcpu->arch.regs.gpr[i] = kvmppc_gse_get_u64(gse);
522 			break;
523 		case KVMPPC_GSID_CR:
524 			vcpu->arch.regs.ccr = kvmppc_gse_get_u32(gse);
525 			break;
526 		case KVMPPC_GSID_XER:
527 			vcpu->arch.regs.xer = kvmppc_gse_get_u64(gse);
528 			break;
529 		case KVMPPC_GSID_CTR:
530 			vcpu->arch.regs.ctr = kvmppc_gse_get_u64(gse);
531 			break;
532 		case KVMPPC_GSID_LR:
533 			vcpu->arch.regs.link = kvmppc_gse_get_u64(gse);
534 			break;
535 		case KVMPPC_GSID_NIA:
536 			vcpu->arch.regs.nip = kvmppc_gse_get_u64(gse);
537 			break;
538 		case KVMPPC_GSID_SRR0:
539 			vcpu->arch.shregs.srr0 = kvmppc_gse_get_u64(gse);
540 			break;
541 		case KVMPPC_GSID_SRR1:
542 			vcpu->arch.shregs.srr1 = kvmppc_gse_get_u64(gse);
543 			break;
544 		case KVMPPC_GSID_SPRG0:
545 			vcpu->arch.shregs.sprg0 = kvmppc_gse_get_u64(gse);
546 			break;
547 		case KVMPPC_GSID_SPRG1:
548 			vcpu->arch.shregs.sprg1 = kvmppc_gse_get_u64(gse);
549 			break;
550 		case KVMPPC_GSID_SPRG2:
551 			vcpu->arch.shregs.sprg2 = kvmppc_gse_get_u64(gse);
552 			break;
553 		case KVMPPC_GSID_SPRG3:
554 			vcpu->arch.shregs.sprg3 = kvmppc_gse_get_u64(gse);
555 			break;
556 		case KVMPPC_GSID_DAR:
557 			vcpu->arch.shregs.dar = kvmppc_gse_get_u64(gse);
558 			break;
559 		case KVMPPC_GSID_DSISR:
560 			vcpu->arch.shregs.dsisr = kvmppc_gse_get_u32(gse);
561 			break;
562 		case KVMPPC_GSID_MSR:
563 			vcpu->arch.shregs.msr = kvmppc_gse_get_u64(gse);
564 			break;
565 		case KVMPPC_GSID_VTB:
566 			vcpu->arch.vcore->vtb = kvmppc_gse_get_u64(gse);
567 			break;
568 		case KVMPPC_GSID_DPDES:
569 			vcpu->arch.vcore->dpdes = kvmppc_gse_get_u64(gse);
570 			break;
571 		case KVMPPC_GSID_LPCR:
572 			vcpu->arch.vcore->lpcr = kvmppc_gse_get_u64(gse);
573 			break;
574 		case KVMPPC_GSID_TB_OFFSET:
575 			vcpu->arch.vcore->tb_offset = kvmppc_gse_get_u64(gse);
576 			break;
577 		case KVMPPC_GSID_FPSCR:
578 			vcpu->arch.fp.fpscr = kvmppc_gse_get_u64(gse);
579 			break;
580 		case KVMPPC_GSID_VSRS(0)... KVMPPC_GSID_VSRS(31):
581 			kvmppc_gse_get_vector128(gse, &v);
582 			i = iden - KVMPPC_GSID_VSRS(0);
583 			memcpy(&vcpu->arch.fp.fpr[i], &v,
584 			       sizeof(vcpu->arch.fp.fpr[i]));
585 			break;
586 #ifdef CONFIG_VSX
587 		case KVMPPC_GSID_VSCR:
588 			vcpu->arch.vr.vscr.u[3] = kvmppc_gse_get_u32(gse);
589 			break;
590 		case KVMPPC_GSID_VSRS(32)... KVMPPC_GSID_VSRS(63):
591 			i = iden - KVMPPC_GSID_VSRS(32);
592 			kvmppc_gse_get_vector128(gse, &vcpu->arch.vr.vr[i]);
593 			break;
594 #endif
595 		case KVMPPC_GSID_HDAR:
596 			vcpu->arch.fault_dar = kvmppc_gse_get_u64(gse);
597 			break;
598 		case KVMPPC_GSID_HDSISR:
599 			vcpu->arch.fault_dsisr = kvmppc_gse_get_u32(gse);
600 			break;
601 		case KVMPPC_GSID_ASDR:
602 			vcpu->arch.fault_gpa = kvmppc_gse_get_u64(gse);
603 			break;
604 		case KVMPPC_GSID_HEIR:
605 			vcpu->arch.emul_inst = kvmppc_gse_get_u64(gse);
606 			break;
607 		case KVMPPC_GSID_DEC_EXPIRY_TB: {
608 			u64 dw;
609 
610 			dw = kvmppc_gse_get_u64(gse);
611 			vcpu->arch.dec_expires =
612 				dw + vcpu->arch.vcore->tb_offset;
613 			break;
614 		}
615 		case KVMPPC_GSID_LOGICAL_PVR:
616 			vcpu->arch.vcore->arch_compat = kvmppc_gse_get_u32(gse);
617 			break;
618 		default:
619 			continue;
620 		}
621 		kvmppc_gsbm_set(valids, iden);
622 	}
623 
624 	return 0;
625 }
626 
627 static struct kvmppc_gs_msg_ops vcpu_message_ops = {
628 	.get_size = gs_msg_ops_vcpu_get_size,
629 	.fill_info = gs_msg_ops_vcpu_fill_info,
630 	.refresh_info = gs_msg_ops_vcpu_refresh_info,
631 };
632 
kvmhv_nestedv2_host_create(struct kvm_vcpu * vcpu,struct kvmhv_nestedv2_io * io)633 static int kvmhv_nestedv2_host_create(struct kvm_vcpu *vcpu,
634 				      struct kvmhv_nestedv2_io *io)
635 {
636 	struct kvmhv_nestedv2_config *cfg;
637 	struct kvmppc_gs_buff *gsb, *vcpu_run_output, *vcpu_run_input;
638 	unsigned long guest_id, vcpu_id;
639 	struct kvmppc_gs_msg *gsm, *vcpu_message, *vcore_message;
640 	int rc;
641 
642 	cfg = &io->cfg;
643 	guest_id = vcpu->kvm->arch.lpid;
644 	vcpu_id = vcpu->vcpu_id;
645 
646 	gsm = kvmppc_gsm_new(&config_msg_ops, cfg, KVMPPC_GS_FLAGS_WIDE,
647 			     GFP_KERNEL);
648 	if (!gsm) {
649 		rc = -ENOMEM;
650 		goto err;
651 	}
652 
653 	gsb = kvmppc_gsb_new(kvmppc_gsm_size(gsm), guest_id, vcpu_id,
654 			     GFP_KERNEL);
655 	if (!gsb) {
656 		rc = -ENOMEM;
657 		goto free_gsm;
658 	}
659 
660 	rc = kvmppc_gsb_receive_datum(gsb, gsm,
661 				      KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE);
662 	if (rc < 0) {
663 		pr_err("KVM-NESTEDv2: couldn't get vcpu run output buffer minimum size\n");
664 		goto free_gsb;
665 	}
666 
667 	vcpu_run_output = kvmppc_gsb_new(cfg->vcpu_run_output_size, guest_id,
668 					 vcpu_id, GFP_KERNEL);
669 	if (!vcpu_run_output) {
670 		rc = -ENOMEM;
671 		goto free_gsb;
672 	}
673 
674 	cfg->vcpu_run_output_cfg.address = kvmppc_gsb_paddress(vcpu_run_output);
675 	cfg->vcpu_run_output_cfg.size = kvmppc_gsb_capacity(vcpu_run_output);
676 	io->vcpu_run_output = vcpu_run_output;
677 
678 	gsm->flags = 0;
679 	rc = kvmppc_gsb_send_datum(gsb, gsm, KVMPPC_GSID_RUN_OUTPUT);
680 	if (rc < 0) {
681 		pr_err("KVM-NESTEDv2: couldn't set vcpu run output buffer\n");
682 		goto free_gs_out;
683 	}
684 
685 	vcpu_message = kvmppc_gsm_new(&vcpu_message_ops, vcpu, 0, GFP_KERNEL);
686 	if (!vcpu_message) {
687 		rc = -ENOMEM;
688 		goto free_gs_out;
689 	}
690 	kvmppc_gsm_include_all(vcpu_message);
691 
692 	io->vcpu_message = vcpu_message;
693 
694 	vcpu_run_input = kvmppc_gsb_new(kvmppc_gsm_size(vcpu_message), guest_id,
695 					vcpu_id, GFP_KERNEL);
696 	if (!vcpu_run_input) {
697 		rc = -ENOMEM;
698 		goto free_vcpu_message;
699 	}
700 
701 	io->vcpu_run_input = vcpu_run_input;
702 	cfg->vcpu_run_input_cfg.address = kvmppc_gsb_paddress(vcpu_run_input);
703 	cfg->vcpu_run_input_cfg.size = kvmppc_gsb_capacity(vcpu_run_input);
704 	rc = kvmppc_gsb_send_datum(gsb, gsm, KVMPPC_GSID_RUN_INPUT);
705 	if (rc < 0) {
706 		pr_err("KVM-NESTEDv2: couldn't set vcpu run input buffer\n");
707 		goto free_vcpu_run_input;
708 	}
709 
710 	vcore_message = kvmppc_gsm_new(&vcpu_message_ops, vcpu,
711 				       KVMPPC_GS_FLAGS_WIDE, GFP_KERNEL);
712 	if (!vcore_message) {
713 		rc = -ENOMEM;
714 		goto free_vcpu_run_input;
715 	}
716 
717 	kvmppc_gsm_include_all(vcore_message);
718 	kvmppc_gsbm_clear(&vcore_message->bitmap, KVMPPC_GSID_LOGICAL_PVR);
719 	io->vcore_message = vcore_message;
720 
721 	kvmppc_gsbm_fill(&io->valids);
722 	kvmppc_gsm_free(gsm);
723 	kvmppc_gsb_free(gsb);
724 	return 0;
725 
726 free_vcpu_run_input:
727 	kvmppc_gsb_free(vcpu_run_input);
728 free_vcpu_message:
729 	kvmppc_gsm_free(vcpu_message);
730 free_gs_out:
731 	kvmppc_gsb_free(vcpu_run_output);
732 free_gsb:
733 	kvmppc_gsb_free(gsb);
734 free_gsm:
735 	kvmppc_gsm_free(gsm);
736 err:
737 	return rc;
738 }
739 
740 /**
741  * __kvmhv_nestedv2_mark_dirty() - mark a Guest State ID to be sent to the host
742  * @vcpu: vcpu
743  * @iden: guest state ID
744  *
745  * Mark a guest state ID as having been changed by the L1 host and thus
746  * the new value must be sent to the L0 hypervisor. See kvmhv_nestedv2_flush_vcpu()
747  */
__kvmhv_nestedv2_mark_dirty(struct kvm_vcpu * vcpu,u16 iden)748 int __kvmhv_nestedv2_mark_dirty(struct kvm_vcpu *vcpu, u16 iden)
749 {
750 	struct kvmhv_nestedv2_io *io;
751 	struct kvmppc_gs_bitmap *valids;
752 	struct kvmppc_gs_msg *gsm;
753 
754 	if (!iden)
755 		return 0;
756 
757 	io = &vcpu->arch.nestedv2_io;
758 	valids = &io->valids;
759 	gsm = io->vcpu_message;
760 	kvmppc_gsm_include(gsm, iden);
761 	gsm = io->vcore_message;
762 	kvmppc_gsm_include(gsm, iden);
763 	kvmppc_gsbm_set(valids, iden);
764 	return 0;
765 }
766 EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_mark_dirty);
767 
768 /**
769  * __kvmhv_nestedv2_cached_reload() - reload a Guest State ID from the host
770  * @vcpu: vcpu
771  * @iden: guest state ID
772  *
773  * Reload the value for the guest state ID from the L0 host into the L1 host.
774  * This is cached so that going out to the L0 host only happens if necessary.
775  */
__kvmhv_nestedv2_cached_reload(struct kvm_vcpu * vcpu,u16 iden)776 int __kvmhv_nestedv2_cached_reload(struct kvm_vcpu *vcpu, u16 iden)
777 {
778 	struct kvmhv_nestedv2_io *io;
779 	struct kvmppc_gs_bitmap *valids;
780 	struct kvmppc_gs_buff *gsb;
781 	struct kvmppc_gs_msg gsm;
782 	int rc;
783 
784 	if (!iden)
785 		return 0;
786 
787 	io = &vcpu->arch.nestedv2_io;
788 	valids = &io->valids;
789 	if (kvmppc_gsbm_test(valids, iden))
790 		return 0;
791 
792 	gsb = io->vcpu_run_input;
793 	kvmppc_gsm_init(&gsm, &vcpu_message_ops, vcpu, kvmppc_gsid_flags(iden));
794 	rc = kvmppc_gsb_receive_datum(gsb, &gsm, iden);
795 	if (rc < 0) {
796 		pr_err("KVM-NESTEDv2: couldn't get GSID: 0x%x\n", iden);
797 		return rc;
798 	}
799 	return 0;
800 }
801 EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_cached_reload);
802 
803 /**
804  * kvmhv_nestedv2_flush_vcpu() - send modified Guest State IDs to the host
805  * @vcpu: vcpu
806  * @time_limit: hdec expiry tb
807  *
808  * Send the values marked by __kvmhv_nestedv2_mark_dirty() to the L0 host.
809  * Thread wide values are copied to the H_GUEST_RUN_VCPU input buffer. Guest
810  * wide values need to be sent with H_GUEST_SET first.
811  *
812  * The hdec tb offset is always sent to L0 host.
813  */
kvmhv_nestedv2_flush_vcpu(struct kvm_vcpu * vcpu,u64 time_limit)814 int kvmhv_nestedv2_flush_vcpu(struct kvm_vcpu *vcpu, u64 time_limit)
815 {
816 	struct kvmhv_nestedv2_io *io;
817 	struct kvmppc_gs_buff *gsb;
818 	struct kvmppc_gs_msg *gsm;
819 	int rc;
820 
821 	io = &vcpu->arch.nestedv2_io;
822 	gsb = io->vcpu_run_input;
823 	gsm = io->vcore_message;
824 	rc = kvmppc_gsb_send_data(gsb, gsm);
825 	if (rc < 0) {
826 		pr_err("KVM-NESTEDv2: couldn't set guest wide elements\n");
827 		return rc;
828 	}
829 
830 	gsm = io->vcpu_message;
831 	kvmppc_gsb_reset(gsb);
832 	rc = kvmppc_gsm_fill_info(gsm, gsb);
833 	if (rc < 0) {
834 		pr_err("KVM-NESTEDv2: couldn't fill vcpu run input buffer\n");
835 		return rc;
836 	}
837 
838 	rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_HDEC_EXPIRY_TB, time_limit);
839 	if (rc < 0)
840 		return rc;
841 	return 0;
842 }
843 EXPORT_SYMBOL_GPL(kvmhv_nestedv2_flush_vcpu);
844 
845 /**
846  * kvmhv_nestedv2_set_ptbl_entry() - send partition and process table state to
847  * L0 host
848  * @lpid: guest id
849  * @dw0: partition table double word
850  * @dw1: process table double word
851  */
kvmhv_nestedv2_set_ptbl_entry(unsigned long lpid,u64 dw0,u64 dw1)852 int kvmhv_nestedv2_set_ptbl_entry(unsigned long lpid, u64 dw0, u64 dw1)
853 {
854 	struct kvmppc_gs_part_table patbl;
855 	struct kvmppc_gs_proc_table prtbl;
856 	struct kvmppc_gs_buff *gsb;
857 	size_t size;
858 	int rc;
859 
860 	size = kvmppc_gse_total_size(
861 		       kvmppc_gsid_size(KVMPPC_GSID_PARTITION_TABLE)) +
862 	       kvmppc_gse_total_size(
863 		       kvmppc_gsid_size(KVMPPC_GSID_PROCESS_TABLE)) +
864 	       sizeof(struct kvmppc_gs_header);
865 	gsb = kvmppc_gsb_new(size, lpid, 0, GFP_KERNEL);
866 	if (!gsb)
867 		return -ENOMEM;
868 
869 	patbl.address = dw0 & RPDB_MASK;
870 	patbl.ea_bits = ((((dw0 & RTS1_MASK) >> (RTS1_SHIFT - 3)) |
871 			  ((dw0 & RTS2_MASK) >> RTS2_SHIFT)) +
872 			 31);
873 	patbl.gpd_size = 1ul << ((dw0 & RPDS_MASK) + 3);
874 	rc = kvmppc_gse_put_part_table(gsb, KVMPPC_GSID_PARTITION_TABLE, patbl);
875 	if (rc < 0)
876 		goto free_gsb;
877 
878 	prtbl.address = dw1 & PRTB_MASK;
879 	prtbl.gpd_size = 1ul << ((dw1 & PRTS_MASK) + 12);
880 	rc = kvmppc_gse_put_proc_table(gsb, KVMPPC_GSID_PROCESS_TABLE, prtbl);
881 	if (rc < 0)
882 		goto free_gsb;
883 
884 	rc = kvmppc_gsb_send(gsb, KVMPPC_GS_FLAGS_WIDE);
885 	if (rc < 0) {
886 		pr_err("KVM-NESTEDv2: couldn't set the PATE\n");
887 		goto free_gsb;
888 	}
889 
890 	kvmppc_gsb_free(gsb);
891 	return 0;
892 
893 free_gsb:
894 	kvmppc_gsb_free(gsb);
895 	return rc;
896 }
897 EXPORT_SYMBOL_GPL(kvmhv_nestedv2_set_ptbl_entry);
898 
899 /**
900  * kvmhv_nestedv2_set_vpa() - register L2 VPA with L0
901  * @vcpu: vcpu
902  * @vpa: L1 logical real address
903  */
kvmhv_nestedv2_set_vpa(struct kvm_vcpu * vcpu,unsigned long vpa)904 int kvmhv_nestedv2_set_vpa(struct kvm_vcpu *vcpu, unsigned long vpa)
905 {
906 	struct kvmhv_nestedv2_io *io;
907 	struct kvmppc_gs_buff *gsb;
908 	int rc = 0;
909 
910 	io = &vcpu->arch.nestedv2_io;
911 	gsb = io->vcpu_run_input;
912 
913 	kvmppc_gsb_reset(gsb);
914 	rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_VPA, vpa);
915 	if (rc < 0)
916 		goto out;
917 
918 	rc = kvmppc_gsb_send(gsb, 0);
919 	if (rc < 0)
920 		pr_err("KVM-NESTEDv2: couldn't register the L2 VPA (rc=%d)\n", rc);
921 
922 out:
923 	kvmppc_gsb_reset(gsb);
924 	return rc;
925 }
926 EXPORT_SYMBOL_GPL(kvmhv_nestedv2_set_vpa);
927 
928 /**
929  * kvmhv_nestedv2_parse_output() - receive values from H_GUEST_RUN_VCPU output
930  * @vcpu: vcpu
931  *
932  * Parse the output buffer from H_GUEST_RUN_VCPU to update vcpu.
933  */
kvmhv_nestedv2_parse_output(struct kvm_vcpu * vcpu)934 int kvmhv_nestedv2_parse_output(struct kvm_vcpu *vcpu)
935 {
936 	struct kvmhv_nestedv2_io *io;
937 	struct kvmppc_gs_buff *gsb;
938 	struct kvmppc_gs_msg gsm;
939 
940 	io = &vcpu->arch.nestedv2_io;
941 	gsb = io->vcpu_run_output;
942 
943 	vcpu->arch.fault_dar = 0;
944 	vcpu->arch.fault_dsisr = 0;
945 	vcpu->arch.fault_gpa = 0;
946 	vcpu->arch.emul_inst = KVM_INST_FETCH_FAILED;
947 
948 	kvmppc_gsm_init(&gsm, &vcpu_message_ops, vcpu, 0);
949 	return kvmppc_gsm_refresh_info(&gsm, gsb);
950 }
951 EXPORT_SYMBOL_GPL(kvmhv_nestedv2_parse_output);
952 
kvmhv_nestedv2_host_free(struct kvm_vcpu * vcpu,struct kvmhv_nestedv2_io * io)953 static void kvmhv_nestedv2_host_free(struct kvm_vcpu *vcpu,
954 				     struct kvmhv_nestedv2_io *io)
955 {
956 	kvmppc_gsm_free(io->vcpu_message);
957 	kvmppc_gsm_free(io->vcore_message);
958 	kvmppc_gsb_free(io->vcpu_run_input);
959 	kvmppc_gsb_free(io->vcpu_run_output);
960 }
961 
__kvmhv_nestedv2_reload_ptregs(struct kvm_vcpu * vcpu,struct pt_regs * regs)962 int __kvmhv_nestedv2_reload_ptregs(struct kvm_vcpu *vcpu, struct pt_regs *regs)
963 {
964 	struct kvmhv_nestedv2_io *io;
965 	struct kvmppc_gs_bitmap *valids;
966 	struct kvmppc_gs_buff *gsb;
967 	struct kvmppc_gs_msg gsm;
968 	int rc = 0;
969 
970 
971 	io = &vcpu->arch.nestedv2_io;
972 	valids = &io->valids;
973 
974 	gsb = io->vcpu_run_input;
975 	kvmppc_gsm_init(&gsm, &vcpu_message_ops, vcpu, 0);
976 
977 	for (int i = 0; i < 32; i++) {
978 		if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_GPR(i)))
979 			kvmppc_gsm_include(&gsm, KVMPPC_GSID_GPR(i));
980 	}
981 
982 	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_CR))
983 		kvmppc_gsm_include(&gsm, KVMPPC_GSID_CR);
984 
985 	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_XER))
986 		kvmppc_gsm_include(&gsm, KVMPPC_GSID_XER);
987 
988 	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_CTR))
989 		kvmppc_gsm_include(&gsm, KVMPPC_GSID_CTR);
990 
991 	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_LR))
992 		kvmppc_gsm_include(&gsm, KVMPPC_GSID_LR);
993 
994 	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_NIA))
995 		kvmppc_gsm_include(&gsm, KVMPPC_GSID_NIA);
996 
997 	rc = kvmppc_gsb_receive_data(gsb, &gsm);
998 	if (rc < 0)
999 		pr_err("KVM-NESTEDv2: couldn't reload ptregs\n");
1000 
1001 	return rc;
1002 }
1003 EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_reload_ptregs);
1004 
__kvmhv_nestedv2_mark_dirty_ptregs(struct kvm_vcpu * vcpu,struct pt_regs * regs)1005 int __kvmhv_nestedv2_mark_dirty_ptregs(struct kvm_vcpu *vcpu,
1006 				       struct pt_regs *regs)
1007 {
1008 	for (int i = 0; i < 32; i++)
1009 		kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_GPR(i));
1010 
1011 	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_CR);
1012 	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_XER);
1013 	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_CTR);
1014 	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_LR);
1015 	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_NIA);
1016 
1017 	return 0;
1018 }
1019 EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_mark_dirty_ptregs);
1020 
1021 /**
1022  * kvmhv_nestedv2_vcpu_create() - create nested vcpu for the NESTEDv2 API
1023  * @vcpu: vcpu
1024  * @io: NESTEDv2 nested io state
1025  *
1026  * Parse the output buffer from H_GUEST_RUN_VCPU to update vcpu.
1027  */
kvmhv_nestedv2_vcpu_create(struct kvm_vcpu * vcpu,struct kvmhv_nestedv2_io * io)1028 int kvmhv_nestedv2_vcpu_create(struct kvm_vcpu *vcpu,
1029 			       struct kvmhv_nestedv2_io *io)
1030 {
1031 	long rc;
1032 
1033 	rc = plpar_guest_create_vcpu(0, vcpu->kvm->arch.lpid, vcpu->vcpu_id);
1034 
1035 	if (rc != H_SUCCESS) {
1036 		pr_err("KVM: Create Guest vcpu hcall failed, rc=%ld\n", rc);
1037 		switch (rc) {
1038 		case H_NOT_ENOUGH_RESOURCES:
1039 		case H_ABORTED:
1040 			return -ENOMEM;
1041 		case H_AUTHORITY:
1042 			return -EPERM;
1043 		default:
1044 			return -EINVAL;
1045 		}
1046 	}
1047 
1048 	rc = kvmhv_nestedv2_host_create(vcpu, io);
1049 
1050 	return rc;
1051 }
1052 EXPORT_SYMBOL_GPL(kvmhv_nestedv2_vcpu_create);
1053 
1054 /**
1055  * kvmhv_nestedv2_vcpu_free() - free the NESTEDv2 state
1056  * @vcpu: vcpu
1057  * @io: NESTEDv2 nested io state
1058  */
kvmhv_nestedv2_vcpu_free(struct kvm_vcpu * vcpu,struct kvmhv_nestedv2_io * io)1059 void kvmhv_nestedv2_vcpu_free(struct kvm_vcpu *vcpu,
1060 			      struct kvmhv_nestedv2_io *io)
1061 {
1062 	kvmhv_nestedv2_host_free(vcpu, io);
1063 }
1064 EXPORT_SYMBOL_GPL(kvmhv_nestedv2_vcpu_free);
1065