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

Commit 8f42ab27 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Alexander Graf
Browse files

KVM: PPC: BOOK3S: PR: Emulate virtual timebase register



virtual time base register is a per VM, per cpu register that needs
to be saved and restored on vm exit and entry. Writing to VTB is not
allowed in the privileged mode.

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
[agraf: fix compile error]
Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
parent 3cd60e31
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -505,6 +505,7 @@ struct kvm_vcpu_arch {
#endif
	/* Time base value when we entered the guest */
	u64 entry_tb;
	u64 entry_vtb;
	u32 tcr;
	ulong tsr; /* we need to perform set/clr_bits() which requires ulong */
	u32 ivor[64];
+9 −0
Original line number Diff line number Diff line
@@ -1203,6 +1203,15 @@
				     : "r" ((unsigned long)(v)) \
				     : "memory")

static inline unsigned long mfvtb (void)
{
#ifdef CONFIG_PPC_BOOK3S_64
	if (cpu_has_feature(CPU_FTR_ARCH_207S))
		return mfspr(SPRN_VTB);
#endif
	return 0;
}

#ifdef __powerpc64__
#if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
#define mftb()		({unsigned long rval;				\
+9 −0
Original line number Diff line number Diff line
@@ -102,6 +102,15 @@ static inline u64 get_rtc(void)
	return (u64)hi * 1000000000 + lo;
}

static inline u64 get_vtb(void)
{
#ifdef CONFIG_PPC_BOOK3S_64
	if (cpu_has_feature(CPU_FTR_ARCH_207S))
		return mfvtb();
#endif
	return 0;
}

#ifdef CONFIG_PPC64
static inline u64 get_tb(void)
{
+6 −0
Original line number Diff line number Diff line
@@ -646,6 +646,9 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
		case KVM_REG_PPC_BESCR:
			val = get_reg_val(reg->id, vcpu->arch.bescr);
			break;
		case KVM_REG_PPC_VTB:
			val = get_reg_val(reg->id, vcpu->arch.vtb);
			break;
		default:
			r = -EINVAL;
			break;
@@ -750,6 +753,9 @@ int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
		case KVM_REG_PPC_BESCR:
			vcpu->arch.bescr = set_reg_val(reg->id, val);
			break;
		case KVM_REG_PPC_VTB:
			vcpu->arch.vtb = set_reg_val(reg->id, val);
			break;
		default:
			r = -EINVAL;
			break;
+3 −0
Original line number Diff line number Diff line
@@ -577,6 +577,9 @@ int kvmppc_core_emulate_mfspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val
		 */
		*spr_val = vcpu->arch.spurr;
		break;
	case SPRN_VTB:
		*spr_val = vcpu->arch.vtb;
		break;
	case SPRN_GQR0:
	case SPRN_GQR1:
	case SPRN_GQR2:
Loading