162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright SUSE Linux Products GmbH 2010
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Authors: Alexander Graf <agraf@suse.de>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __ASM_KVM_BOOKE_H__
1062306a36Sopenharmony_ci#define __ASM_KVM_BOOKE_H__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci#include <linux/kvm_host.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/*
1662306a36Sopenharmony_ci * Number of available lpids. Only the low-order 6 bits of LPID rgister are
1762306a36Sopenharmony_ci * implemented on e500mc+ cores.
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_ci#define KVMPPC_NR_LPIDS                        64
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define KVMPPC_INST_EHPRIV		0x7c00021c
2262306a36Sopenharmony_ci#define EHPRIV_OC_SHIFT			11
2362306a36Sopenharmony_ci/* "ehpriv 1" : ehpriv with OC = 1 is used for debug emulation */
2462306a36Sopenharmony_ci#define EHPRIV_OC_DEBUG			1
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic inline void kvmppc_set_gpr(struct kvm_vcpu *vcpu, int num, ulong val)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	vcpu->arch.regs.gpr[num] = val;
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic inline ulong kvmppc_get_gpr(struct kvm_vcpu *vcpu, int num)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	return vcpu->arch.regs.gpr[num];
3462306a36Sopenharmony_ci}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistatic inline void kvmppc_set_cr(struct kvm_vcpu *vcpu, u32 val)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	vcpu->arch.regs.ccr = val;
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic inline u32 kvmppc_get_cr(struct kvm_vcpu *vcpu)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	return vcpu->arch.regs.ccr;
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline void kvmppc_set_xer(struct kvm_vcpu *vcpu, ulong val)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	vcpu->arch.regs.xer = val;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic inline ulong kvmppc_get_xer(struct kvm_vcpu *vcpu)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return vcpu->arch.regs.xer;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline bool kvmppc_need_byteswap(struct kvm_vcpu *vcpu)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	/* XXX Would need to check TLB entry */
5962306a36Sopenharmony_ci	return false;
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline void kvmppc_set_ctr(struct kvm_vcpu *vcpu, ulong val)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	vcpu->arch.regs.ctr = val;
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline ulong kvmppc_get_ctr(struct kvm_vcpu *vcpu)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	return vcpu->arch.regs.ctr;
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline void kvmppc_set_lr(struct kvm_vcpu *vcpu, ulong val)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	vcpu->arch.regs.link = val;
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistatic inline ulong kvmppc_get_lr(struct kvm_vcpu *vcpu)
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	return vcpu->arch.regs.link;
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistatic inline void kvmppc_set_pc(struct kvm_vcpu *vcpu, ulong val)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	vcpu->arch.regs.nip = val;
8562306a36Sopenharmony_ci}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_cistatic inline ulong kvmppc_get_pc(struct kvm_vcpu *vcpu)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	return vcpu->arch.regs.nip;
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#ifdef CONFIG_BOOKE
9362306a36Sopenharmony_cistatic inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci	return vcpu->arch.fault_dear;
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci#endif
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline bool kvmppc_supports_magic_page(struct kvm_vcpu *vcpu)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	/* Magic page is only supported on e500v2 */
10262306a36Sopenharmony_ci#ifdef CONFIG_KVM_E500V2
10362306a36Sopenharmony_ci	return true;
10462306a36Sopenharmony_ci#else
10562306a36Sopenharmony_ci	return false;
10662306a36Sopenharmony_ci#endif
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci#endif /* __ASM_KVM_BOOKE_H__ */
109