1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 *
4 * Copyright SUSE Linux Products GmbH 2010
5 *
6 * Authors: Alexander Graf <agraf@suse.de>
7 */
8
9#ifndef __ASM_KVM_BOOKE_H__
10#define __ASM_KVM_BOOKE_H__
11
12#include <linux/types.h>
13#include <linux/kvm_host.h>
14
15/*
16 * Number of available lpids. Only the low-order 6 bits of LPID rgister are
17 * implemented on e500mc+ cores.
18 */
19#define KVMPPC_NR_LPIDS                        64
20
21#define KVMPPC_INST_EHPRIV		0x7c00021c
22#define EHPRIV_OC_SHIFT			11
23/* "ehpriv 1" : ehpriv with OC = 1 is used for debug emulation */
24#define EHPRIV_OC_DEBUG			1
25
26static inline void kvmppc_set_gpr(struct kvm_vcpu *vcpu, int num, ulong val)
27{
28	vcpu->arch.regs.gpr[num] = val;
29}
30
31static inline ulong kvmppc_get_gpr(struct kvm_vcpu *vcpu, int num)
32{
33	return vcpu->arch.regs.gpr[num];
34}
35
36static inline void kvmppc_set_cr(struct kvm_vcpu *vcpu, u32 val)
37{
38	vcpu->arch.regs.ccr = val;
39}
40
41static inline u32 kvmppc_get_cr(struct kvm_vcpu *vcpu)
42{
43	return vcpu->arch.regs.ccr;
44}
45
46static inline void kvmppc_set_xer(struct kvm_vcpu *vcpu, ulong val)
47{
48	vcpu->arch.regs.xer = val;
49}
50
51static inline ulong kvmppc_get_xer(struct kvm_vcpu *vcpu)
52{
53	return vcpu->arch.regs.xer;
54}
55
56static inline bool kvmppc_need_byteswap(struct kvm_vcpu *vcpu)
57{
58	/* XXX Would need to check TLB entry */
59	return false;
60}
61
62static inline void kvmppc_set_ctr(struct kvm_vcpu *vcpu, ulong val)
63{
64	vcpu->arch.regs.ctr = val;
65}
66
67static inline ulong kvmppc_get_ctr(struct kvm_vcpu *vcpu)
68{
69	return vcpu->arch.regs.ctr;
70}
71
72static inline void kvmppc_set_lr(struct kvm_vcpu *vcpu, ulong val)
73{
74	vcpu->arch.regs.link = val;
75}
76
77static inline ulong kvmppc_get_lr(struct kvm_vcpu *vcpu)
78{
79	return vcpu->arch.regs.link;
80}
81
82static inline void kvmppc_set_pc(struct kvm_vcpu *vcpu, ulong val)
83{
84	vcpu->arch.regs.nip = val;
85}
86
87static inline ulong kvmppc_get_pc(struct kvm_vcpu *vcpu)
88{
89	return vcpu->arch.regs.nip;
90}
91
92static inline void kvmppc_set_fpr(struct kvm_vcpu *vcpu, int i, u64 val)
93{
94	vcpu->arch.fp.fpr[i][TS_FPROFFSET] = val;
95}
96
97static inline u64 kvmppc_get_fpr(struct kvm_vcpu *vcpu, int i)
98{
99	return vcpu->arch.fp.fpr[i][TS_FPROFFSET];
100}
101
102#ifdef CONFIG_BOOKE
103static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu)
104{
105	return vcpu->arch.fault_dear;
106}
107#endif
108
109static inline bool kvmppc_supports_magic_page(struct kvm_vcpu *vcpu)
110{
111	/* Magic page is only supported on e500v2 */
112#ifdef CONFIG_KVM_E500V2
113	return true;
114#else
115	return false;
116#endif
117}
118#endif /* __ASM_KVM_BOOKE_H__ */
119