// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright 2023 Jordan Niethe, IBM Corp. <jniethe5@gmail.com>
 *
 * Authors:
 *    Jordan Niethe <jniethe5@gmail.com>
 *
 * Description: KVM functions specific to running on Book 3S
 * processors as a NESTEDv2 guest.
 *
 */

#include "linux/blk-mq.h"
#include "linux/console.h"
#include "linux/gfp_types.h"
#include "linux/signal.h"
#include <linux/kernel.h>
#include <linux/kvm_host.h>
#include <linux/pgtable.h>

#include <asm/kvm_ppc.h>
#include <asm/kvm_book3s.h>
#include <asm/hvcall.h>
#include <asm/pgalloc.h>
#include <asm/reg.h>
#include <asm/plpar_wrappers.h>
#include <asm/guest-state-buffer.h>
#include "trace_hv.h"

struct static_key_false __kvmhv_is_nestedv2 __read_mostly;
EXPORT_SYMBOL_GPL(__kvmhv_is_nestedv2);


static size_t
gs_msg_ops_kvmhv_nestedv2_config_get_size(struct kvmppc_gs_msg *gsm)
{
	u16 ids[] = {
		KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE,
		KVMPPC_GSID_RUN_INPUT,
		KVMPPC_GSID_RUN_OUTPUT,

	};
	size_t size = 0;

	for (int i = 0; i < ARRAY_SIZE(ids); i++)
		size += kvmppc_gse_total_size(kvmppc_gsid_size(ids[i]));
	return size;
}

static int
gs_msg_ops_kvmhv_nestedv2_config_fill_info(struct kvmppc_gs_buff *gsb,
					   struct kvmppc_gs_msg *gsm)
{
	struct kvmhv_nestedv2_config *cfg;
	int rc;

	cfg = gsm->data;

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE)) {
		rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE,
					cfg->vcpu_run_output_size);
		if (rc < 0)
			return rc;
	}

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_INPUT)) {
		rc = kvmppc_gse_put_buff_info(gsb, KVMPPC_GSID_RUN_INPUT,
					      cfg->vcpu_run_input_cfg);
		if (rc < 0)
			return rc;
	}

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_OUTPUT)) {
		kvmppc_gse_put_buff_info(gsb, KVMPPC_GSID_RUN_OUTPUT,
					 cfg->vcpu_run_output_cfg);
		if (rc < 0)
			return rc;
	}

	return 0;
}

static int
gs_msg_ops_kvmhv_nestedv2_config_refresh_info(struct kvmppc_gs_msg *gsm,
					      struct kvmppc_gs_buff *gsb)
{
	struct kvmhv_nestedv2_config *cfg;
	struct kvmppc_gs_parser gsp = { 0 };
	struct kvmppc_gs_elem *gse;
	int rc;

	cfg = gsm->data;

	rc = kvmppc_gse_parse(&gsp, gsb);
	if (rc < 0)
		return rc;

	gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE);
	if (gse)
		cfg->vcpu_run_output_size = kvmppc_gse_get_u64(gse);
	return 0;
}

static struct kvmppc_gs_msg_ops config_msg_ops = {
	.get_size = gs_msg_ops_kvmhv_nestedv2_config_get_size,
	.fill_info = gs_msg_ops_kvmhv_nestedv2_config_fill_info,
	.refresh_info = gs_msg_ops_kvmhv_nestedv2_config_refresh_info,
};

static size_t gs_msg_ops_vcpu_get_size(struct kvmppc_gs_msg *gsm)
{
	struct kvmppc_gs_bitmap gsbm = { 0 };
	size_t size = 0;
	u16 iden;

	kvmppc_gsbm_fill(&gsbm);
	kvmppc_gsbm_for_each(&gsbm, iden)
	{
		switch (iden) {
		case KVMPPC_GSID_HOST_STATE_SIZE:
		case KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE:
		case KVMPPC_GSID_PARTITION_TABLE:
		case KVMPPC_GSID_PROCESS_TABLE:
		case KVMPPC_GSID_RUN_INPUT:
		case KVMPPC_GSID_RUN_OUTPUT:
			break;
		default:
			size += kvmppc_gse_total_size(kvmppc_gsid_size(iden));
		}
	}
	return size;
}

static int gs_msg_ops_vcpu_fill_info(struct kvmppc_gs_buff *gsb,
				     struct kvmppc_gs_msg *gsm)
{
	struct kvm_vcpu *vcpu;
	vector128 v;
	int rc, i;
	u16 iden;
	u32 arch_compat = 0;

	vcpu = gsm->data;

	kvmppc_gsm_for_each(gsm, iden)
	{
		rc = 0;

		if ((gsm->flags & KVMPPC_GS_FLAGS_WIDE) !=
		    (kvmppc_gsid_flags(iden) & KVMPPC_GS_FLAGS_WIDE))
			continue;

		switch (iden) {
		case KVMPPC_GSID_DSCR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.dscr);
			break;
		case KVMPPC_GSID_MMCRA:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.mmcra);
			break;
		case KVMPPC_GSID_HFSCR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.hfscr);
			break;
		case KVMPPC_GSID_PURR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.purr);
			break;
		case KVMPPC_GSID_SPURR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.spurr);
			break;
		case KVMPPC_GSID_AMR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.amr);
			break;
		case KVMPPC_GSID_UAMOR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.uamor);
			break;
		case KVMPPC_GSID_SIAR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.siar);
			break;
		case KVMPPC_GSID_SDAR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.sdar);
			break;
		case KVMPPC_GSID_IAMR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.iamr);
			break;
		case KVMPPC_GSID_DAWR0:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.dawr0);
			break;
		case KVMPPC_GSID_DAWR1:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.dawr1);
			break;
		case KVMPPC_GSID_DAWRX0:
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.dawrx0);
			break;
		case KVMPPC_GSID_DAWRX1:
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.dawrx1);
			break;
		case KVMPPC_GSID_CIABR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ciabr);
			break;
		case KVMPPC_GSID_WORT:
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.wort);
			break;
		case KVMPPC_GSID_PPR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ppr);
			break;
		case KVMPPC_GSID_PSPB:
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.pspb);
			break;
		case KVMPPC_GSID_TAR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.tar);
			break;
		case KVMPPC_GSID_FSCR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.fscr);
			break;
		case KVMPPC_GSID_EBBHR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ebbhr);
			break;
		case KVMPPC_GSID_EBBRR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ebbrr);
			break;
		case KVMPPC_GSID_BESCR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.bescr);
			break;
		case KVMPPC_GSID_IC:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ic);
			break;
		case KVMPPC_GSID_CTRL:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.ctrl);
			break;
		case KVMPPC_GSID_PIDR:
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.pid);
			break;
		case KVMPPC_GSID_AMOR: {
			u64 amor = ~0;

			rc = kvmppc_gse_put_u64(gsb, iden, amor);
			break;
		}
		case KVMPPC_GSID_VRSAVE:
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.vrsave);
			break;
		case KVMPPC_GSID_MMCR(0)... KVMPPC_GSID_MMCR(3):
			i = iden - KVMPPC_GSID_MMCR(0);
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.mmcr[i]);
			break;
		case KVMPPC_GSID_SIER(0)... KVMPPC_GSID_SIER(2):
			i = iden - KVMPPC_GSID_SIER(0);
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.sier[i]);
			break;
		case KVMPPC_GSID_PMC(0)... KVMPPC_GSID_PMC(5):
			i = iden - KVMPPC_GSID_PMC(0);
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.pmc[i]);
			break;
		case KVMPPC_GSID_GPR(0)... KVMPPC_GSID_GPR(31):
			i = iden - KVMPPC_GSID_GPR(0);
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.regs.gpr[i]);
			break;
		case KVMPPC_GSID_CR:
			rc = kvmppc_gse_put_u32(gsb, iden, vcpu->arch.regs.ccr);
			break;
		case KVMPPC_GSID_XER:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.regs.xer);
			break;
		case KVMPPC_GSID_CTR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.regs.ctr);
			break;
		case KVMPPC_GSID_LR:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.regs.link);
			break;
		case KVMPPC_GSID_NIA:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.regs.nip);
			break;
		case KVMPPC_GSID_SRR0:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.srr0);
			break;
		case KVMPPC_GSID_SRR1:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.srr1);
			break;
		case KVMPPC_GSID_SPRG0:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.sprg0);
			break;
		case KVMPPC_GSID_SPRG1:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.sprg1);
			break;
		case KVMPPC_GSID_SPRG2:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.sprg2);
			break;
		case KVMPPC_GSID_SPRG3:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.sprg3);
			break;
		case KVMPPC_GSID_DAR:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.dar);
			break;
		case KVMPPC_GSID_DSISR:
			rc = kvmppc_gse_put_u32(gsb, iden,
						vcpu->arch.shregs.dsisr);
			break;
		case KVMPPC_GSID_MSR:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.shregs.msr);
			break;
		case KVMPPC_GSID_VTB:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.vcore->vtb);
			break;
		case KVMPPC_GSID_LPCR:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.vcore->lpcr);
			break;
		case KVMPPC_GSID_TB_OFFSET:
			rc = kvmppc_gse_put_u64(gsb, iden,
						vcpu->arch.vcore->tb_offset);
			break;
		case KVMPPC_GSID_FPSCR:
			rc = kvmppc_gse_put_u64(gsb, iden, vcpu->arch.fp.fpscr);
			break;
		case KVMPPC_GSID_VSRS(0)... KVMPPC_GSID_VSRS(31):
			i = iden - KVMPPC_GSID_VSRS(0);
			memcpy(&v, &vcpu->arch.fp.fpr[i],
			       sizeof(vcpu->arch.fp.fpr[i]));
			rc = kvmppc_gse_put_vector128(gsb, iden, &v);
			break;
#ifdef CONFIG_VSX
		case KVMPPC_GSID_VSCR:
			rc = kvmppc_gse_put_u32(gsb, iden,
						vcpu->arch.vr.vscr.u[3]);
			break;
		case KVMPPC_GSID_VSRS(32)... KVMPPC_GSID_VSRS(63):
			i = iden - KVMPPC_GSID_VSRS(32);
			rc = kvmppc_gse_put_vector128(gsb, iden,
						      &vcpu->arch.vr.vr[i]);
			break;
#endif
		case KVMPPC_GSID_DEC_EXPIRY_TB: {
			u64 dw;

			dw = vcpu->arch.dec_expires -
			     vcpu->arch.vcore->tb_offset;
			rc = kvmppc_gse_put_u64(gsb, iden, dw);
			break;
		}
		case KVMPPC_GSID_LOGICAL_PVR:
			/*
			 * Though 'arch_compat == 0' would mean the default
			 * compatibility, arch_compat, being a Guest Wide
			 * Element, cannot be filled with a value of 0 in GSB
			 * as this would result into a kernel trap.
			 * Hence, when `arch_compat == 0`, arch_compat should
			 * default to L1's PVR.
			 */
			if (!vcpu->arch.vcore->arch_compat) {
				if (cpu_has_feature(CPU_FTR_ARCH_31))
					arch_compat = PVR_ARCH_31;
				else if (cpu_has_feature(CPU_FTR_ARCH_300))
					arch_compat = PVR_ARCH_300;
			} else {
				arch_compat = vcpu->arch.vcore->arch_compat;
			}
			rc = kvmppc_gse_put_u32(gsb, iden, arch_compat);
			break;
		}

		if (rc < 0)
			return rc;
	}

	return 0;
}

static int gs_msg_ops_vcpu_refresh_info(struct kvmppc_gs_msg *gsm,
					struct kvmppc_gs_buff *gsb)
{
	struct kvmppc_gs_parser gsp = { 0 };
	struct kvmhv_nestedv2_io *io;
	struct kvmppc_gs_bitmap *valids;
	struct kvm_vcpu *vcpu;
	struct kvmppc_gs_elem *gse;
	vector128 v;
	int rc, i;
	u16 iden;

	vcpu = gsm->data;

	rc = kvmppc_gse_parse(&gsp, gsb);
	if (rc < 0)
		return rc;

	io = &vcpu->arch.nestedv2_io;
	valids = &io->valids;

	kvmppc_gsp_for_each(&gsp, iden, gse)
	{
		switch (iden) {
		case KVMPPC_GSID_DSCR:
			vcpu->arch.dscr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_MMCRA:
			vcpu->arch.mmcra = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_HFSCR:
			vcpu->arch.hfscr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_PURR:
			vcpu->arch.purr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SPURR:
			vcpu->arch.spurr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_AMR:
			vcpu->arch.amr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_UAMOR:
			vcpu->arch.uamor = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SIAR:
			vcpu->arch.siar = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SDAR:
			vcpu->arch.sdar = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_IAMR:
			vcpu->arch.iamr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_DAWR0:
			vcpu->arch.dawr0 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_DAWR1:
			vcpu->arch.dawr1 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_DAWRX0:
			vcpu->arch.dawrx0 = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_DAWRX1:
			vcpu->arch.dawrx1 = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_CIABR:
			vcpu->arch.ciabr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_WORT:
			vcpu->arch.wort = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_PPR:
			vcpu->arch.ppr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_PSPB:
			vcpu->arch.pspb = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_TAR:
			vcpu->arch.tar = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_FSCR:
			vcpu->arch.fscr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_EBBHR:
			vcpu->arch.ebbhr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_EBBRR:
			vcpu->arch.ebbrr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_BESCR:
			vcpu->arch.bescr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_IC:
			vcpu->arch.ic = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_CTRL:
			vcpu->arch.ctrl = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_PIDR:
			vcpu->arch.pid = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_AMOR:
			break;
		case KVMPPC_GSID_VRSAVE:
			vcpu->arch.vrsave = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_MMCR(0)... KVMPPC_GSID_MMCR(3):
			i = iden - KVMPPC_GSID_MMCR(0);
			vcpu->arch.mmcr[i] = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SIER(0)... KVMPPC_GSID_SIER(2):
			i = iden - KVMPPC_GSID_SIER(0);
			vcpu->arch.sier[i] = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_PMC(0)... KVMPPC_GSID_PMC(5):
			i = iden - KVMPPC_GSID_PMC(0);
			vcpu->arch.pmc[i] = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_GPR(0)... KVMPPC_GSID_GPR(31):
			i = iden - KVMPPC_GSID_GPR(0);
			vcpu->arch.regs.gpr[i] = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_CR:
			vcpu->arch.regs.ccr = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_XER:
			vcpu->arch.regs.xer = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_CTR:
			vcpu->arch.regs.ctr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_LR:
			vcpu->arch.regs.link = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_NIA:
			vcpu->arch.regs.nip = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SRR0:
			vcpu->arch.shregs.srr0 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SRR1:
			vcpu->arch.shregs.srr1 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SPRG0:
			vcpu->arch.shregs.sprg0 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SPRG1:
			vcpu->arch.shregs.sprg1 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SPRG2:
			vcpu->arch.shregs.sprg2 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_SPRG3:
			vcpu->arch.shregs.sprg3 = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_DAR:
			vcpu->arch.shregs.dar = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_DSISR:
			vcpu->arch.shregs.dsisr = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_MSR:
			vcpu->arch.shregs.msr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_VTB:
			vcpu->arch.vcore->vtb = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_LPCR:
			vcpu->arch.vcore->lpcr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_TB_OFFSET:
			vcpu->arch.vcore->tb_offset = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_FPSCR:
			vcpu->arch.fp.fpscr = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_VSRS(0)... KVMPPC_GSID_VSRS(31):
			kvmppc_gse_get_vector128(gse, &v);
			i = iden - KVMPPC_GSID_VSRS(0);
			memcpy(&vcpu->arch.fp.fpr[i], &v,
			       sizeof(vcpu->arch.fp.fpr[i]));
			break;
#ifdef CONFIG_VSX
		case KVMPPC_GSID_VSCR:
			vcpu->arch.vr.vscr.u[3] = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_VSRS(32)... KVMPPC_GSID_VSRS(63):
			i = iden - KVMPPC_GSID_VSRS(32);
			kvmppc_gse_get_vector128(gse, &vcpu->arch.vr.vr[i]);
			break;
#endif
		case KVMPPC_GSID_HDAR:
			vcpu->arch.fault_dar = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_HDSISR:
			vcpu->arch.fault_dsisr = kvmppc_gse_get_u32(gse);
			break;
		case KVMPPC_GSID_ASDR:
			vcpu->arch.fault_gpa = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_HEIR:
			vcpu->arch.emul_inst = kvmppc_gse_get_u64(gse);
			break;
		case KVMPPC_GSID_DEC_EXPIRY_TB: {
			u64 dw;

			dw = kvmppc_gse_get_u64(gse);
			vcpu->arch.dec_expires =
				dw + vcpu->arch.vcore->tb_offset;
			break;
		}
		case KVMPPC_GSID_LOGICAL_PVR:
			vcpu->arch.vcore->arch_compat = kvmppc_gse_get_u32(gse);
			break;
		default:
			continue;
		}
		kvmppc_gsbm_set(valids, iden);
	}

	return 0;
}

static struct kvmppc_gs_msg_ops vcpu_message_ops = {
	.get_size = gs_msg_ops_vcpu_get_size,
	.fill_info = gs_msg_ops_vcpu_fill_info,
	.refresh_info = gs_msg_ops_vcpu_refresh_info,
};

static int kvmhv_nestedv2_host_create(struct kvm_vcpu *vcpu,
				      struct kvmhv_nestedv2_io *io)
{
	struct kvmhv_nestedv2_config *cfg;
	struct kvmppc_gs_buff *gsb, *vcpu_run_output, *vcpu_run_input;
	unsigned long guest_id, vcpu_id;
	struct kvmppc_gs_msg *gsm, *vcpu_message, *vcore_message;
	int rc;

	cfg = &io->cfg;
	guest_id = vcpu->kvm->arch.lpid;
	vcpu_id = vcpu->vcpu_id;

	gsm = kvmppc_gsm_new(&config_msg_ops, cfg, KVMPPC_GS_FLAGS_WIDE,
			     GFP_KERNEL);
	if (!gsm) {
		rc = -ENOMEM;
		goto err;
	}

	gsb = kvmppc_gsb_new(kvmppc_gsm_size(gsm), guest_id, vcpu_id,
			     GFP_KERNEL);
	if (!gsb) {
		rc = -ENOMEM;
		goto free_gsm;
	}

	rc = kvmppc_gsb_receive_datum(gsb, gsm,
				      KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE);
	if (rc < 0) {
		pr_err("KVM-NESTEDv2: couldn't get vcpu run output buffer minimum size\n");
		goto free_gsb;
	}

	vcpu_run_output = kvmppc_gsb_new(cfg->vcpu_run_output_size, guest_id,
					 vcpu_id, GFP_KERNEL);
	if (!vcpu_run_output) {
		rc = -ENOMEM;
		goto free_gsb;
	}

	cfg->vcpu_run_output_cfg.address = kvmppc_gsb_paddress(vcpu_run_output);
	cfg->vcpu_run_output_cfg.size = kvmppc_gsb_capacity(vcpu_run_output);
	io->vcpu_run_output = vcpu_run_output;

	gsm->flags = 0;
	rc = kvmppc_gsb_send_datum(gsb, gsm, KVMPPC_GSID_RUN_OUTPUT);
	if (rc < 0) {
		pr_err("KVM-NESTEDv2: couldn't set vcpu run output buffer\n");
		goto free_gs_out;
	}

	vcpu_message = kvmppc_gsm_new(&vcpu_message_ops, vcpu, 0, GFP_KERNEL);
	if (!vcpu_message) {
		rc = -ENOMEM;
		goto free_gs_out;
	}
	kvmppc_gsm_include_all(vcpu_message);

	io->vcpu_message = vcpu_message;

	vcpu_run_input = kvmppc_gsb_new(kvmppc_gsm_size(vcpu_message), guest_id,
					vcpu_id, GFP_KERNEL);
	if (!vcpu_run_input) {
		rc = -ENOMEM;
		goto free_vcpu_message;
	}

	io->vcpu_run_input = vcpu_run_input;
	cfg->vcpu_run_input_cfg.address = kvmppc_gsb_paddress(vcpu_run_input);
	cfg->vcpu_run_input_cfg.size = kvmppc_gsb_capacity(vcpu_run_input);
	rc = kvmppc_gsb_send_datum(gsb, gsm, KVMPPC_GSID_RUN_INPUT);
	if (rc < 0) {
		pr_err("KVM-NESTEDv2: couldn't set vcpu run input buffer\n");
		goto free_vcpu_run_input;
	}

	vcore_message = kvmppc_gsm_new(&vcpu_message_ops, vcpu,
				       KVMPPC_GS_FLAGS_WIDE, GFP_KERNEL);
	if (!vcore_message) {
		rc = -ENOMEM;
		goto free_vcpu_run_input;
	}

	kvmppc_gsm_include_all(vcore_message);
	kvmppc_gsbm_clear(&vcore_message->bitmap, KVMPPC_GSID_LOGICAL_PVR);
	io->vcore_message = vcore_message;

	kvmppc_gsbm_fill(&io->valids);
	kvmppc_gsm_free(gsm);
	kvmppc_gsb_free(gsb);
	return 0;

free_vcpu_run_input:
	kvmppc_gsb_free(vcpu_run_input);
free_vcpu_message:
	kvmppc_gsm_free(vcpu_message);
free_gs_out:
	kvmppc_gsb_free(vcpu_run_output);
free_gsb:
	kvmppc_gsb_free(gsb);
free_gsm:
	kvmppc_gsm_free(gsm);
err:
	return rc;
}

/**
 * __kvmhv_nestedv2_mark_dirty() - mark a Guest State ID to be sent to the host
 * @vcpu: vcpu
 * @iden: guest state ID
 *
 * Mark a guest state ID as having been changed by the L1 host and thus
 * the new value must be sent to the L0 hypervisor. See kvmhv_nestedv2_flush_vcpu()
 */
int __kvmhv_nestedv2_mark_dirty(struct kvm_vcpu *vcpu, u16 iden)
{
	struct kvmhv_nestedv2_io *io;
	struct kvmppc_gs_bitmap *valids;
	struct kvmppc_gs_msg *gsm;

	if (!iden)
		return 0;

	io = &vcpu->arch.nestedv2_io;
	valids = &io->valids;
	gsm = io->vcpu_message;
	kvmppc_gsm_include(gsm, iden);
	gsm = io->vcore_message;
	kvmppc_gsm_include(gsm, iden);
	kvmppc_gsbm_set(valids, iden);
	return 0;
}
EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_mark_dirty);

/**
 * __kvmhv_nestedv2_cached_reload() - reload a Guest State ID from the host
 * @vcpu: vcpu
 * @iden: guest state ID
 *
 * Reload the value for the guest state ID from the L0 host into the L1 host.
 * This is cached so that going out to the L0 host only happens if necessary.
 */
int __kvmhv_nestedv2_cached_reload(struct kvm_vcpu *vcpu, u16 iden)
{
	struct kvmhv_nestedv2_io *io;
	struct kvmppc_gs_bitmap *valids;
	struct kvmppc_gs_buff *gsb;
	struct kvmppc_gs_msg gsm;
	int rc;

	if (!iden)
		return 0;

	io = &vcpu->arch.nestedv2_io;
	valids = &io->valids;
	if (kvmppc_gsbm_test(valids, iden))
		return 0;

	gsb = io->vcpu_run_input;
	kvmppc_gsm_init(&gsm, &vcpu_message_ops, vcpu, kvmppc_gsid_flags(iden));
	rc = kvmppc_gsb_receive_datum(gsb, &gsm, iden);
	if (rc < 0) {
		pr_err("KVM-NESTEDv2: couldn't get GSID: 0x%x\n", iden);
		return rc;
	}
	return 0;
}
EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_cached_reload);

/**
 * kvmhv_nestedv2_flush_vcpu() - send modified Guest State IDs to the host
 * @vcpu: vcpu
 * @time_limit: hdec expiry tb
 *
 * Send the values marked by __kvmhv_nestedv2_mark_dirty() to the L0 host.
 * Thread wide values are copied to the H_GUEST_RUN_VCPU input buffer. Guest
 * wide values need to be sent with H_GUEST_SET first.
 *
 * The hdec tb offset is always sent to L0 host.
 */
int kvmhv_nestedv2_flush_vcpu(struct kvm_vcpu *vcpu, u64 time_limit)
{
	struct kvmhv_nestedv2_io *io;
	struct kvmppc_gs_buff *gsb;
	struct kvmppc_gs_msg *gsm;
	int rc;

	io = &vcpu->arch.nestedv2_io;
	gsb = io->vcpu_run_input;
	gsm = io->vcore_message;
	rc = kvmppc_gsb_send_data(gsb, gsm);
	if (rc < 0) {
		pr_err("KVM-NESTEDv2: couldn't set guest wide elements\n");
		return rc;
	}

	gsm = io->vcpu_message;
	kvmppc_gsb_reset(gsb);
	rc = kvmppc_gsm_fill_info(gsm, gsb);
	if (rc < 0) {
		pr_err("KVM-NESTEDv2: couldn't fill vcpu run input buffer\n");
		return rc;
	}

	rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_HDEC_EXPIRY_TB, time_limit);
	if (rc < 0)
		return rc;
	return 0;
}
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_flush_vcpu);

/**
 * kvmhv_nestedv2_set_ptbl_entry() - send partition and process table state to
 * L0 host
 * @lpid: guest id
 * @dw0: partition table double word
 * @dw1: process table double word
 */
int kvmhv_nestedv2_set_ptbl_entry(unsigned long lpid, u64 dw0, u64 dw1)
{
	struct kvmppc_gs_part_table patbl;
	struct kvmppc_gs_proc_table prtbl;
	struct kvmppc_gs_buff *gsb;
	size_t size;
	int rc;

	size = kvmppc_gse_total_size(
		       kvmppc_gsid_size(KVMPPC_GSID_PARTITION_TABLE)) +
	       kvmppc_gse_total_size(
		       kvmppc_gsid_size(KVMPPC_GSID_PROCESS_TABLE)) +
	       sizeof(struct kvmppc_gs_header);
	gsb = kvmppc_gsb_new(size, lpid, 0, GFP_KERNEL);
	if (!gsb)
		return -ENOMEM;

	patbl.address = dw0 & RPDB_MASK;
	patbl.ea_bits = ((((dw0 & RTS1_MASK) >> (RTS1_SHIFT - 3)) |
			  ((dw0 & RTS2_MASK) >> RTS2_SHIFT)) +
			 31);
	patbl.gpd_size = 1ul << ((dw0 & RPDS_MASK) + 3);
	rc = kvmppc_gse_put_part_table(gsb, KVMPPC_GSID_PARTITION_TABLE, patbl);
	if (rc < 0)
		goto free_gsb;

	prtbl.address = dw1 & PRTB_MASK;
	prtbl.gpd_size = 1ul << ((dw1 & PRTS_MASK) + 12);
	rc = kvmppc_gse_put_proc_table(gsb, KVMPPC_GSID_PROCESS_TABLE, prtbl);
	if (rc < 0)
		goto free_gsb;

	rc = kvmppc_gsb_send(gsb, KVMPPC_GS_FLAGS_WIDE);
	if (rc < 0) {
		pr_err("KVM-NESTEDv2: couldn't set the PATE\n");
		goto free_gsb;
	}

	kvmppc_gsb_free(gsb);
	return 0;

free_gsb:
	kvmppc_gsb_free(gsb);
	return rc;
}
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_set_ptbl_entry);

/**
 * kvmhv_nestedv2_set_vpa() - register L2 VPA with L0
 * @vcpu: vcpu
 * @vpa: L1 logical real address
 */
int kvmhv_nestedv2_set_vpa(struct kvm_vcpu *vcpu, unsigned long vpa)
{
	struct kvmhv_nestedv2_io *io;
	struct kvmppc_gs_buff *gsb;
	int rc = 0;

	io = &vcpu->arch.nestedv2_io;
	gsb = io->vcpu_run_input;

	kvmppc_gsb_reset(gsb);
	rc = kvmppc_gse_put_u64(gsb, KVMPPC_GSID_VPA, vpa);
	if (rc < 0)
		goto out;

	rc = kvmppc_gsb_send(gsb, 0);
	if (rc < 0)
		pr_err("KVM-NESTEDv2: couldn't register the L2 VPA (rc=%d)\n", rc);

out:
	kvmppc_gsb_reset(gsb);
	return rc;
}
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_set_vpa);

/**
 * kvmhv_nestedv2_parse_output() - receive values from H_GUEST_RUN_VCPU output
 * @vcpu: vcpu
 *
 * Parse the output buffer from H_GUEST_RUN_VCPU to update vcpu.
 */
int kvmhv_nestedv2_parse_output(struct kvm_vcpu *vcpu)
{
	struct kvmhv_nestedv2_io *io;
	struct kvmppc_gs_buff *gsb;
	struct kvmppc_gs_msg gsm;

	io = &vcpu->arch.nestedv2_io;
	gsb = io->vcpu_run_output;

	vcpu->arch.fault_dar = 0;
	vcpu->arch.fault_dsisr = 0;
	vcpu->arch.fault_gpa = 0;
	vcpu->arch.emul_inst = KVM_INST_FETCH_FAILED;

	kvmppc_gsm_init(&gsm, &vcpu_message_ops, vcpu, 0);
	return kvmppc_gsm_refresh_info(&gsm, gsb);
}
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_parse_output);

static void kvmhv_nestedv2_host_free(struct kvm_vcpu *vcpu,
				     struct kvmhv_nestedv2_io *io)
{
	kvmppc_gsm_free(io->vcpu_message);
	kvmppc_gsm_free(io->vcore_message);
	kvmppc_gsb_free(io->vcpu_run_input);
	kvmppc_gsb_free(io->vcpu_run_output);
}

int __kvmhv_nestedv2_reload_ptregs(struct kvm_vcpu *vcpu, struct pt_regs *regs)
{
	struct kvmhv_nestedv2_io *io;
	struct kvmppc_gs_bitmap *valids;
	struct kvmppc_gs_buff *gsb;
	struct kvmppc_gs_msg gsm;
	int rc = 0;


	io = &vcpu->arch.nestedv2_io;
	valids = &io->valids;

	gsb = io->vcpu_run_input;
	kvmppc_gsm_init(&gsm, &vcpu_message_ops, vcpu, 0);

	for (int i = 0; i < 32; i++) {
		if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_GPR(i)))
			kvmppc_gsm_include(&gsm, KVMPPC_GSID_GPR(i));
	}

	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_CR))
		kvmppc_gsm_include(&gsm, KVMPPC_GSID_CR);

	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_XER))
		kvmppc_gsm_include(&gsm, KVMPPC_GSID_XER);

	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_CTR))
		kvmppc_gsm_include(&gsm, KVMPPC_GSID_CTR);

	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_LR))
		kvmppc_gsm_include(&gsm, KVMPPC_GSID_LR);

	if (!kvmppc_gsbm_test(valids, KVMPPC_GSID_NIA))
		kvmppc_gsm_include(&gsm, KVMPPC_GSID_NIA);

	rc = kvmppc_gsb_receive_data(gsb, &gsm);
	if (rc < 0)
		pr_err("KVM-NESTEDv2: couldn't reload ptregs\n");

	return rc;
}
EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_reload_ptregs);

int __kvmhv_nestedv2_mark_dirty_ptregs(struct kvm_vcpu *vcpu,
				       struct pt_regs *regs)
{
	for (int i = 0; i < 32; i++)
		kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_GPR(i));

	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_CR);
	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_XER);
	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_CTR);
	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_LR);
	kvmhv_nestedv2_mark_dirty(vcpu, KVMPPC_GSID_NIA);

	return 0;
}
EXPORT_SYMBOL_GPL(__kvmhv_nestedv2_mark_dirty_ptregs);

/**
 * kvmhv_nestedv2_vcpu_create() - create nested vcpu for the NESTEDv2 API
 * @vcpu: vcpu
 * @io: NESTEDv2 nested io state
 *
 * Parse the output buffer from H_GUEST_RUN_VCPU to update vcpu.
 */
int kvmhv_nestedv2_vcpu_create(struct kvm_vcpu *vcpu,
			       struct kvmhv_nestedv2_io *io)
{
	long rc;

	rc = plpar_guest_create_vcpu(0, vcpu->kvm->arch.lpid, vcpu->vcpu_id);

	if (rc != H_SUCCESS) {
		pr_err("KVM: Create Guest vcpu hcall failed, rc=%ld\n", rc);
		switch (rc) {
		case H_NOT_ENOUGH_RESOURCES:
		case H_ABORTED:
			return -ENOMEM;
		case H_AUTHORITY:
			return -EPERM;
		default:
			return -EINVAL;
		}
	}

	rc = kvmhv_nestedv2_host_create(vcpu, io);

	return rc;
}
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_vcpu_create);

/**
 * kvmhv_nestedv2_vcpu_free() - free the NESTEDv2 state
 * @vcpu: vcpu
 * @io: NESTEDv2 nested io state
 */
void kvmhv_nestedv2_vcpu_free(struct kvm_vcpu *vcpu,
			      struct kvmhv_nestedv2_io *io)
{
	kvmhv_nestedv2_host_free(vcpu, io);
}
EXPORT_SYMBOL_GPL(kvmhv_nestedv2_vcpu_free);
