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