book3s_hv_nestedv2.c 28 KB

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