KVM: s390: add 'pgm' member to kvm_vcpu_arch and helper function
Add a 'struct kvm_s390_pgm_info pgm' member to kvm_vcpu_arch. This structure will be used if during instruction emulation in the context of a vcpu exception data needs to be stored somewhere. Also add a helper function kvm_s390_inject_prog_cond() which can inject vcpu's last exception if needed. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
parent
072c9878ee
commit
1b0462e574
|
@ -286,6 +286,7 @@ struct kvm_vcpu_arch {
|
||||||
struct kvm_s390_local_interrupt local_int;
|
struct kvm_s390_local_interrupt local_int;
|
||||||
struct hrtimer ckc_timer;
|
struct hrtimer ckc_timer;
|
||||||
struct tasklet_struct tasklet;
|
struct tasklet_struct tasklet;
|
||||||
|
struct kvm_s390_pgm_info pgm;
|
||||||
union {
|
union {
|
||||||
struct cpuid cpu_id;
|
struct cpuid cpu_id;
|
||||||
u64 stidp_data;
|
u64 stidp_data;
|
||||||
|
|
|
@ -170,6 +170,39 @@ int kvm_s390_handle_diag(struct kvm_vcpu *vcpu);
|
||||||
int kvm_s390_inject_prog_irq(struct kvm_vcpu *vcpu,
|
int kvm_s390_inject_prog_irq(struct kvm_vcpu *vcpu,
|
||||||
struct kvm_s390_pgm_info *pgm_info);
|
struct kvm_s390_pgm_info *pgm_info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kvm_s390_inject_prog_cond - conditionally inject a program check
|
||||||
|
* @vcpu: virtual cpu
|
||||||
|
* @rc: original return/error code
|
||||||
|
*
|
||||||
|
* This function is supposed to be used after regular guest access functions
|
||||||
|
* failed, to conditionally inject a program check to a vcpu. The typical
|
||||||
|
* pattern would look like
|
||||||
|
*
|
||||||
|
* rc = write_guest(vcpu, addr, data, len);
|
||||||
|
* if (rc)
|
||||||
|
* return kvm_s390_inject_prog_cond(vcpu, rc);
|
||||||
|
*
|
||||||
|
* A negative return code from guest access functions implies an internal error
|
||||||
|
* like e.g. out of memory. In these cases no program check should be injected
|
||||||
|
* to the guest.
|
||||||
|
* A positive value implies that an exception happened while accessing a guest's
|
||||||
|
* memory. In this case all data belonging to the corresponding program check
|
||||||
|
* has been stored in vcpu->arch.pgm and can be injected with
|
||||||
|
* kvm_s390_inject_prog_irq().
|
||||||
|
*
|
||||||
|
* Returns: - the original @rc value if @rc was negative (internal error)
|
||||||
|
* - zero if @rc was already zero
|
||||||
|
* - zero or error code from injecting if @rc was positive
|
||||||
|
* (program check injected to @vcpu)
|
||||||
|
*/
|
||||||
|
static inline int kvm_s390_inject_prog_cond(struct kvm_vcpu *vcpu, int rc)
|
||||||
|
{
|
||||||
|
if (rc <= 0)
|
||||||
|
return rc;
|
||||||
|
return kvm_s390_inject_prog_irq(vcpu, &vcpu->arch.pgm);
|
||||||
|
}
|
||||||
|
|
||||||
/* implemented in interrupt.c */
|
/* implemented in interrupt.c */
|
||||||
int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu);
|
int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu);
|
||||||
int psw_extint_disabled(struct kvm_vcpu *vcpu);
|
int psw_extint_disabled(struct kvm_vcpu *vcpu);
|
||||||
|
|
Loading…
Reference in New Issue