Commit a9640e2e authored by Eric Farman's avatar Eric Farman Committed by Janosch Frank
Browse files

KVM: s390: vsie: Disable some bits when in ESA mode



In the event that a nested guest is put in ESA mode,
ensure that some bits are scrubbed from the shadow SCB.

Reviewed-by: default avatarChristian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: default avatarEric Farman <farman@linux.ibm.com>
Reviewed-by: default avatarHendrik Brueckner <brueckner@linux.ibm.com>
Signed-off-by: default avatarJanosch Frank <frankja@linux.ibm.com>
parent b0ad874d
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -387,6 +387,17 @@ static int shadow_crycb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
	return 0;
}

static void shadow_esa(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
{
	struct kvm_s390_sie_block *scb_s = &vsie_page->scb_s;

	/* Ensure these bits are indeed turned off */
	scb_s->eca &= ~ECA_VX;
	scb_s->ecb &= ~(ECB_GS | ECB_TE);
	scb_s->ecb3 &= ~ECB3_RI;
	scb_s->ecd &= ~ECD_HOSTREGMGMT;
}

/* shadow (round up/down) the ibc to avoid validity icpt */
static void prepare_ibc(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
{
@@ -590,6 +601,9 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
	scb_s->hpid = HPID_VSIE;
	scb_s->cpnc = scb_o->cpnc;

	if (!(atomic_read(&scb_s->cpuflags) & CPUSTAT_ZARCH))
		shadow_esa(vcpu, vsie_page);

	prepare_ibc(vcpu, vsie_page);
	rc = shadow_crycb(vcpu, vsie_page);
out: