]> Git Repo - qemu.git/blame - target/ppc/kvm_ppc.h
spapr: Limit available pagesizes to provide a consistent guest environment
[qemu.git] / target / ppc / kvm_ppc.h
CommitLineData
d76d1650
AJ
1/*
2 * Copyright 2008 IBM Corporation.
3 * Authors: Hollis Blanchard <[email protected]>
4 *
5 * This work is licensed under the GNU GPL license version 2 or later.
6 *
7 */
8
2a6a4076
MA
9#ifndef KVM_PPC_H
10#define KVM_PPC_H
d76d1650 11
c9137065 12#define TYPE_HOST_POWERPC_CPU POWERPC_CPU_TYPE_NAME("host")
2985b86b 13
921e28db
AG
14#ifdef CONFIG_KVM
15
dc333cd6 16uint32_t kvmppc_get_tbfreq(void);
eadaada1 17uint64_t kvmppc_get_clockfreq(void);
ef951443
ND
18bool kvmppc_get_host_model(char **buf);
19bool kvmppc_get_host_serial(char **buf);
1a61a9ae 20int kvmppc_get_hasidle(CPUPPCState *env);
1328c2bf 21int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len);
1bc22652 22int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level);
026bfd89 23void kvmppc_enable_logical_ci_hcalls(void);
ef9971dd 24void kvmppc_enable_set_mode_hcall(void);
5145ad4f 25void kvmppc_enable_clear_ref_mod_hcalls(void);
1bc22652 26void kvmppc_set_papr(PowerPCCPU *cpu);
d6e166c0 27int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr);
5b95b8b9 28void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy);
e97c3636 29int kvmppc_smt_threads(void);
fa98fbfc
SB
30void kvmppc_hint_smt_possible(Error **errp);
31int kvmppc_set_smt_threads(int smt);
31f2cb8f
BB
32int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
33int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
34int kvmppc_set_tcr(PowerPCCPU *cpu);
35int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
b4db5413
SJS
36target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
37 bool radix, bool gtse,
38 uint64_t proc_tbl);
98efaf75 39#ifndef CONFIG_USER_ONLY
da95324e 40bool kvmppc_spapr_use_multitce(void);
3dc410ae 41int kvmppc_spapr_enable_inkernel_multitce(void);
d6ee2a7c
AK
42void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
43 uint64_t bus_offset, uint32_t nb_table,
44 int *pfd, bool need_vfio);
0f5cb298 45int kvmppc_remove_spapr_tce(void *table, int pfd, uint32_t window_size);
7f763a5d
DG
46int kvmppc_reset_htab(int shift_hint);
47uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift);
9ded780c 48bool kvmppc_has_cap_spapr_vfio(void);
98efaf75 49#endif /* !CONFIG_USER_ONLY */
3b961124 50bool kvmppc_has_cap_epr(void);
feaa64c4 51int kvmppc_define_rtas_kernel_token(uint32_t token, const char *function);
14b0d748 52int kvmppc_get_htab_fd(bool write, uint64_t index, Error **errp);
e68cb8b4
AK
53int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, int64_t max_ns);
54int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
55 uint16_t n_valid, uint16_t n_invalid);
1ad9f0a4
DG
56void kvmppc_read_hptes(ppc_hash_pte64_t *hptes, hwaddr ptex, int n);
57void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1);
87a91de6 58bool kvmppc_has_cap_fixup_hcalls(void);
bac3bf28 59bool kvmppc_has_cap_htm(void);
cf1c4cce
SB
60bool kvmppc_has_cap_mmu_radix(void);
61bool kvmppc_has_cap_mmu_hash_v3(void);
8acc2ae5
SJS
62int kvmppc_get_cap_safe_cache(void);
63int kvmppc_get_cap_safe_bounds_check(void);
64int kvmppc_get_cap_safe_indirect_branch(void);
4d9392be 65int kvmppc_enable_hwrng(void);
e5c0d3ce 66int kvmppc_put_books_sregs(PowerPCCPU *cpu);
52b2519c 67PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void);
30f4b05b 68void kvmppc_check_papr_resize_hpt(Error **errp);
b55d295e
DG
69int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong flags, int shift);
70int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift);
c363a37a 71bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu);
c1385933 72
24c6863c 73bool kvmppc_hpt_needs_host_contiguous_pages(void);
df587133 74
921e28db
AG
75#else
76
77static inline uint32_t kvmppc_get_tbfreq(void)
78{
79 return 0;
80}
81
ef951443
ND
82static inline bool kvmppc_get_host_model(char **buf)
83{
84 return false;
85}
86
87static inline bool kvmppc_get_host_serial(char **buf)
88{
89 return false;
90}
91
921e28db
AG
92static inline uint64_t kvmppc_get_clockfreq(void)
93{
94 return 0;
95}
96
6659394f
DG
97static inline uint32_t kvmppc_get_vmx(void)
98{
99 return 0;
100}
101
102static inline uint32_t kvmppc_get_dfp(void)
103{
104 return 0;
105}
106
1a61a9ae
SY
107static inline int kvmppc_get_hasidle(CPUPPCState *env)
108{
109 return 0;
110}
111
1328c2bf 112static inline int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len)
921e28db
AG
113{
114 return -1;
115}
116
1bc22652 117static inline int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level)
921e28db
AG
118{
119 return -1;
120}
121
026bfd89
DG
122static inline void kvmppc_enable_logical_ci_hcalls(void)
123{
124}
125
ef9971dd
AK
126static inline void kvmppc_enable_set_mode_hcall(void)
127{
128}
129
5145ad4f
NW
130static inline void kvmppc_enable_clear_ref_mod_hcalls(void)
131{
132}
133
1bc22652 134static inline void kvmppc_set_papr(PowerPCCPU *cpu)
f61b4bed
AG
135{
136}
137
d6e166c0 138static inline int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr)
6db5bb0f
AK
139{
140 return 0;
141}
142
5b95b8b9
AG
143static inline void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy)
144{
145}
146
e97c3636
DG
147static inline int kvmppc_smt_threads(void)
148{
149 return 1;
150}
151
fa98fbfc
SB
152static inline void kvmppc_hint_smt_possible(Error **errp)
153{
154 return;
155}
156
157static inline int kvmppc_set_smt_threads(int smt)
158{
159 return 0;
160}
161
31f2cb8f
BB
162static inline int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits)
163{
164 return 0;
165}
166
167static inline int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits)
168{
169 return 0;
170}
171
172static inline int kvmppc_set_tcr(PowerPCCPU *cpu)
173{
174 return 0;
175}
176
177static inline int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu)
178{
179 return -1;
180}
181
b4db5413
SJS
182static inline target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
183 bool radix, bool gtse,
184 uint64_t proc_tbl)
185{
186 return 0;
187}
188
98efaf75 189#ifndef CONFIG_USER_ONLY
da95324e
AK
190static inline bool kvmppc_spapr_use_multitce(void)
191{
192 return false;
193}
194
3dc410ae
AK
195static inline int kvmppc_spapr_enable_inkernel_multitce(void)
196{
197 return -1;
198}
199
d6ee2a7c
AK
200static inline void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
201 uint64_t bus_offset,
202 uint32_t nb_table,
203 int *pfd, bool need_vfio)
0f5cb298
DG
204{
205 return NULL;
206}
207
208static inline int kvmppc_remove_spapr_tce(void *table, int pfd,
523e7b8a 209 uint32_t nb_table)
0f5cb298
DG
210{
211 return -1;
212}
7f763a5d
DG
213
214static inline int kvmppc_reset_htab(int shift_hint)
215{
a3166f8f 216 return 0;
7f763a5d
DG
217}
218
219static inline uint64_t kvmppc_rma_size(uint64_t current_size,
220 unsigned int hash_shift)
221{
222 return ram_size;
223}
224
24c6863c
DG
225static inline bool kvmppc_hpt_needs_host_contiguous_pages(void)
226{
227 return false;
228}
229
9ded780c
AK
230static inline bool kvmppc_has_cap_spapr_vfio(void)
231{
232 return false;
233}
234
98efaf75 235#endif /* !CONFIG_USER_ONLY */
0f5cb298 236
3b961124
SY
237static inline bool kvmppc_has_cap_epr(void)
238{
239 return false;
240}
e68cb8b4 241
feaa64c4
DG
242static inline int kvmppc_define_rtas_kernel_token(uint32_t token,
243 const char *function)
244{
245 return -1;
246}
247
14b0d748 248static inline int kvmppc_get_htab_fd(bool write, uint64_t index, Error **errp)
e68cb8b4
AK
249{
250 return -1;
251}
252
253static inline int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize,
254 int64_t max_ns)
255{
256 abort();
257}
258
259static inline int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
260 uint16_t n_valid, uint16_t n_invalid)
261{
262 abort();
263}
264
1ad9f0a4
DG
265static inline void kvmppc_read_hptes(ppc_hash_pte64_t *hptes,
266 hwaddr ptex, int n)
7c43bca0
AK
267{
268 abort();
269}
270
1ad9f0a4 271static inline void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1)
c1385933
AK
272{
273 abort();
274}
275
87a91de6
AG
276static inline bool kvmppc_has_cap_fixup_hcalls(void)
277{
278 abort();
279}
280
bac3bf28
TH
281static inline bool kvmppc_has_cap_htm(void)
282{
283 return false;
284}
285
cf1c4cce
SB
286static inline bool kvmppc_has_cap_mmu_radix(void)
287{
288 return false;
289}
290
291static inline bool kvmppc_has_cap_mmu_hash_v3(void)
292{
293 return false;
294}
295
8acc2ae5
SJS
296static inline int kvmppc_get_cap_safe_cache(void)
297{
298 return 0;
299}
300
301static inline int kvmppc_get_cap_safe_bounds_check(void)
302{
303 return 0;
304}
305
306static inline int kvmppc_get_cap_safe_indirect_branch(void)
307{
308 return 0;
309}
310
4d9392be
TH
311static inline int kvmppc_enable_hwrng(void)
312{
313 return -1;
314}
e5c0d3ce
DG
315
316static inline int kvmppc_put_books_sregs(PowerPCCPU *cpu)
317{
318 abort();
319}
52b2519c
TH
320
321static inline PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
322{
323 return NULL;
324}
325
30f4b05b
DG
326static inline void kvmppc_check_papr_resize_hpt(Error **errp)
327{
328 return;
329}
b55d295e
DG
330
331static inline int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu,
332 target_ulong flags, int shift)
333{
334 return -ENOSYS;
335}
336
337static inline int kvmppc_resize_hpt_commit(PowerPCCPU *cpu,
338 target_ulong flags, int shift)
339{
340 return -ENOSYS;
341}
342
921e28db
AG
343#endif
344
b45d63b6 345#ifndef CONFIG_KVM
3240dd9a 346
b45d63b6 347#define kvmppc_eieio() do { } while (0)
3240dd9a
TH
348
349static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len)
350{
351}
352
353static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len)
354{
355}
356
357#else /* CONFIG_KVM */
358
b45d63b6
BH
359#define kvmppc_eieio() \
360 do { \
361 if (kvm_enabled()) { \
362 asm volatile("eieio" : : : "memory"); \
363 } \
364 } while (0)
3240dd9a
TH
365
366/* Store data cache blocks back to memory */
367static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len)
368{
369 uint8_t *p;
370
371 for (p = addr; p < addr + len; p += cpu->env.dcache_line_size) {
372 asm volatile("dcbst 0,%0" : : "r"(p) : "memory");
373 }
374}
375
376/* Invalidate instruction cache blocks */
377static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len)
378{
379 uint8_t *p;
380
381 for (p = addr; p < addr + len; p += cpu->env.icache_line_size) {
382 asm volatile("icbi 0,%0" : : "r"(p));
383 }
384}
385
386#endif /* CONFIG_KVM */
b45d63b6 387
2a6a4076 388#endif /* KVM_PPC_H */
This page took 0.847818 seconds and 4 git commands to generate.