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

Commit 6df8d3fc authored by Bharat Bhushan's avatar Bharat Bhushan Committed by Alexander Graf
Browse files

booke: Added ONE_REG interface for IAC/DAC debug registers



IAC/DAC are defined as 32 bit while they are 64 bit wide. So ONE_REG
interface is added to set/get them.

Signed-off-by: default avatarBharat Bhushan <bharat.bhushan@freescale.com>
Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
parent f61c94bb
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -221,6 +221,12 @@ struct kvm_sregs {

			__u32 dbsr;	/* KVM_SREGS_E_UPDATE_DBSR */
			__u32 dbcr[3];
			/*
			 * iac/dac registers are 64bit wide, while this API
			 * interface provides only lower 32 bits on 64 bit
			 * processors. ONE_REG interface is added for 64bit
			 * iac/dac registers.
			 */
			__u32 iac[4];
			__u32 dac[2];
			__u32 dvc[2];
@@ -326,5 +332,11 @@ struct kvm_book3e_206_tlb_params {
};

#define KVM_REG_PPC_HIOR	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x1)
#define KVM_REG_PPC_IAC1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x2)
#define KVM_REG_PPC_IAC2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3)
#define KVM_REG_PPC_IAC3	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x4)
#define KVM_REG_PPC_IAC4	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x5)
#define KVM_REG_PPC_DAC1	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x6)
#define KVM_REG_PPC_DAC2	(KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x7)

#endif /* __LINUX_KVM_POWERPC_H */
+22 −2
Original line number Diff line number Diff line
@@ -346,6 +346,27 @@ struct kvmppc_slb {
	bool class	: 1;
};

# ifdef CONFIG_PPC_FSL_BOOK3E
#define KVMPPC_BOOKE_IAC_NUM	2
#define KVMPPC_BOOKE_DAC_NUM	2
# else
#define KVMPPC_BOOKE_IAC_NUM	4
#define KVMPPC_BOOKE_DAC_NUM	2
# endif
#define KVMPPC_BOOKE_MAX_IAC	4
#define KVMPPC_BOOKE_MAX_DAC	2

struct kvmppc_booke_debug_reg {
	u32 dbcr0;
	u32 dbcr1;
	u32 dbcr2;
#ifdef CONFIG_KVM_E500MC
	u32 dbcr4;
#endif
	u64 iac[KVMPPC_BOOKE_MAX_IAC];
	u64 dac[KVMPPC_BOOKE_MAX_DAC];
};

struct kvm_vcpu_arch {
	ulong host_stack;
	u32 host_pid;
@@ -440,8 +461,6 @@ struct kvm_vcpu_arch {

	u32 ccr0;
	u32 ccr1;
	u32 dbcr0;
	u32 dbcr1;
	u32 dbsr;

	u64 mmcr[3];
@@ -476,6 +495,7 @@ struct kvm_vcpu_arch {
	u32 tlbcfg[4];
	u32 mmucfg;
	u32 epr;
	struct kvmppc_booke_debug_reg dbg_reg;
#endif
	gpa_t paddr_accessed;
	gva_t vaddr_accessed;
+46 −2
Original line number Diff line number Diff line
@@ -1351,12 +1351,56 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,

int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
{
	return -EINVAL;
	int r = -EINVAL;

	switch (reg->id) {
	case KVM_REG_PPC_IAC1:
	case KVM_REG_PPC_IAC2:
	case KVM_REG_PPC_IAC3:
	case KVM_REG_PPC_IAC4: {
		int iac = reg->id - KVM_REG_PPC_IAC1;
		r = copy_to_user((u64 __user *)(long)reg->addr,
				 &vcpu->arch.dbg_reg.iac[iac], sizeof(u64));
		break;
	}
	case KVM_REG_PPC_DAC1:
	case KVM_REG_PPC_DAC2: {
		int dac = reg->id - KVM_REG_PPC_DAC1;
		r = copy_to_user((u64 __user *)(long)reg->addr,
				 &vcpu->arch.dbg_reg.dac[dac], sizeof(u64));
		break;
	}
	default:
		break;
	}
	return r;
}

int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
{
	return -EINVAL;
	int r = -EINVAL;

	switch (reg->id) {
	case KVM_REG_PPC_IAC1:
	case KVM_REG_PPC_IAC2:
	case KVM_REG_PPC_IAC3:
	case KVM_REG_PPC_IAC4: {
		int iac = reg->id - KVM_REG_PPC_IAC1;
		r = copy_from_user(&vcpu->arch.dbg_reg.iac[iac],
			     (u64 __user *)(long)reg->addr, sizeof(u64));
		break;
	}
	case KVM_REG_PPC_DAC1:
	case KVM_REG_PPC_DAC2: {
		int dac = reg->id - KVM_REG_PPC_DAC1;
		r = copy_from_user(&vcpu->arch.dbg_reg.dac[dac],
			     (u64 __user *)(long)reg->addr, sizeof(u64));
		break;
	}
	default:
		break;
	}
	return r;
}

int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
+4 −4
Original line number Diff line number Diff line
@@ -133,10 +133,10 @@ int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
		vcpu->arch.csrr1 = spr_val;
		break;
	case SPRN_DBCR0:
		vcpu->arch.dbcr0 = spr_val;
		vcpu->arch.dbg_reg.dbcr0 = spr_val;
		break;
	case SPRN_DBCR1:
		vcpu->arch.dbcr1 = spr_val;
		vcpu->arch.dbg_reg.dbcr1 = spr_val;
		break;
	case SPRN_DBSR:
		vcpu->arch.dbsr &= ~spr_val;
@@ -266,10 +266,10 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
		*spr_val = vcpu->arch.csrr1;
		break;
	case SPRN_DBCR0:
		*spr_val = vcpu->arch.dbcr0;
		*spr_val = vcpu->arch.dbg_reg.dbcr0;
		break;
	case SPRN_DBCR1:
		*spr_val = vcpu->arch.dbcr1;
		*spr_val = vcpu->arch.dbg_reg.dbcr1;
		break;
	case SPRN_DBSR:
		*spr_val = vcpu->arch.dbsr;