Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1ffffbd authored by David Hildenbrand's avatar David Hildenbrand Committed by Christian Borntraeger
Browse files

KVM: s390: guestdbg: separate defines for per code



Let's avoid working with the PER_EVENT* defines, used for control register
manipulation, when checking the u8 PER code. Introduce separate defines
based on the existing defines.

Reviewed-by: default avatarEric Farman <farman@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
parent 8953fb08
Loading
Loading
Loading
Loading
+17 −11
Original line number Original line Diff line number Diff line
@@ -382,14 +382,20 @@ void kvm_s390_prepare_debug_exit(struct kvm_vcpu *vcpu)
	vcpu->guest_debug &= ~KVM_GUESTDBG_EXIT_PENDING;
	vcpu->guest_debug &= ~KVM_GUESTDBG_EXIT_PENDING;
}
}


#define PER_CODE_MASK		(PER_EVENT_MASK >> 24)
#define PER_CODE_BRANCH		(PER_EVENT_BRANCH >> 24)
#define PER_CODE_IFETCH		(PER_EVENT_IFETCH >> 24)
#define PER_CODE_STORE		(PER_EVENT_STORE >> 24)
#define PER_CODE_STORE_REAL	(PER_EVENT_STORE_REAL >> 24)

#define per_bp_event(code) \
#define per_bp_event(code) \
			(code & (PER_EVENT_IFETCH | PER_EVENT_BRANCH))
			(code & (PER_CODE_IFETCH | PER_CODE_BRANCH))
#define per_write_wp_event(code) \
#define per_write_wp_event(code) \
			(code & (PER_EVENT_STORE | PER_EVENT_STORE_REAL))
			(code & (PER_CODE_STORE | PER_CODE_STORE_REAL))


static int debug_exit_required(struct kvm_vcpu *vcpu)
static int debug_exit_required(struct kvm_vcpu *vcpu)
{
{
	u32 perc = (vcpu->arch.sie_block->perc << 24);
	u8 perc = vcpu->arch.sie_block->perc;
	struct kvm_debug_exit_arch *debug_exit = &vcpu->run->debug.arch;
	struct kvm_debug_exit_arch *debug_exit = &vcpu->run->debug.arch;
	struct kvm_hw_wp_info_arch *wp_info = NULL;
	struct kvm_hw_wp_info_arch *wp_info = NULL;
	struct kvm_hw_bp_info_arch *bp_info = NULL;
	struct kvm_hw_bp_info_arch *bp_info = NULL;
@@ -444,7 +450,7 @@ int kvm_s390_handle_per_ifetch_icpt(struct kvm_vcpu *vcpu)
	const u8 ilen = kvm_s390_get_ilen(vcpu);
	const u8 ilen = kvm_s390_get_ilen(vcpu);
	struct kvm_s390_pgm_info pgm_info = {
	struct kvm_s390_pgm_info pgm_info = {
		.code = PGM_PER,
		.code = PGM_PER,
		.per_code = PER_EVENT_IFETCH >> 24,
		.per_code = PER_CODE_IFETCH,
		.per_address = __rewind_psw(vcpu->arch.sie_block->gpsw, ilen),
		.per_address = __rewind_psw(vcpu->arch.sie_block->gpsw, ilen),
	};
	};


@@ -458,33 +464,33 @@ int kvm_s390_handle_per_ifetch_icpt(struct kvm_vcpu *vcpu)


static void filter_guest_per_event(struct kvm_vcpu *vcpu)
static void filter_guest_per_event(struct kvm_vcpu *vcpu)
{
{
	u32 perc = vcpu->arch.sie_block->perc << 24;
	const u8 perc = vcpu->arch.sie_block->perc;
	u64 peraddr = vcpu->arch.sie_block->peraddr;
	u64 peraddr = vcpu->arch.sie_block->peraddr;
	u64 addr = vcpu->arch.sie_block->gpsw.addr;
	u64 addr = vcpu->arch.sie_block->gpsw.addr;
	u64 cr9 = vcpu->arch.sie_block->gcr[9];
	u64 cr9 = vcpu->arch.sie_block->gcr[9];
	u64 cr10 = vcpu->arch.sie_block->gcr[10];
	u64 cr10 = vcpu->arch.sie_block->gcr[10];
	u64 cr11 = vcpu->arch.sie_block->gcr[11];
	u64 cr11 = vcpu->arch.sie_block->gcr[11];
	/* filter all events, demanded by the guest */
	/* filter all events, demanded by the guest */
	u32 guest_perc = perc & cr9 & PER_EVENT_MASK;
	u8 guest_perc = perc & (cr9 >> 24) & PER_CODE_MASK;


	if (!guest_per_enabled(vcpu))
	if (!guest_per_enabled(vcpu))
		guest_perc = 0;
		guest_perc = 0;


	/* filter "successful-branching" events */
	/* filter "successful-branching" events */
	if (guest_perc & PER_EVENT_BRANCH &&
	if (guest_perc & PER_CODE_BRANCH &&
	    cr9 & PER_CONTROL_BRANCH_ADDRESS &&
	    cr9 & PER_CONTROL_BRANCH_ADDRESS &&
	    !in_addr_range(addr, cr10, cr11))
	    !in_addr_range(addr, cr10, cr11))
		guest_perc &= ~PER_EVENT_BRANCH;
		guest_perc &= ~PER_CODE_BRANCH;


	/* filter "instruction-fetching" events */
	/* filter "instruction-fetching" events */
	if (guest_perc & PER_EVENT_IFETCH &&
	if (guest_perc & PER_CODE_IFETCH &&
	    !in_addr_range(peraddr, cr10, cr11))
	    !in_addr_range(peraddr, cr10, cr11))
		guest_perc &= ~PER_EVENT_IFETCH;
		guest_perc &= ~PER_CODE_IFETCH;


	/* All other PER events will be given to the guest */
	/* All other PER events will be given to the guest */
	/* TODO: Check altered address/address space */
	/* TODO: Check altered address/address space */


	vcpu->arch.sie_block->perc = guest_perc >> 24;
	vcpu->arch.sie_block->perc = guest_perc;


	if (!guest_perc)
	if (!guest_perc)
		vcpu->arch.sie_block->iprcc &= ~PGM_PER;
		vcpu->arch.sie_block->iprcc &= ~PGM_PER;