qemu/target/ppc/kvm_ppc.h
<<
>>
Prefs
   1/*
   2 * Copyright 2008 IBM Corporation.
   3 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
   4 *
   5 * This work is licensed under the GNU GPL license version 2 or later.
   6 *
   7 */
   8
   9#ifndef KVM_PPC_H
  10#define KVM_PPC_H
  11
  12#define TYPE_HOST_POWERPC_CPU POWERPC_CPU_TYPE_NAME("host")
  13
  14#ifdef CONFIG_KVM
  15
  16uint32_t kvmppc_get_tbfreq(void);
  17uint64_t kvmppc_get_clockfreq(void);
  18bool kvmppc_get_host_model(char **buf);
  19bool kvmppc_get_host_serial(char **buf);
  20int kvmppc_get_hasidle(CPUPPCState *env);
  21int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len);
  22int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level);
  23void kvmppc_enable_logical_ci_hcalls(void);
  24void kvmppc_enable_set_mode_hcall(void);
  25void kvmppc_enable_clear_ref_mod_hcalls(void);
  26void kvmppc_enable_h_page_init(void);
  27void kvmppc_set_papr(PowerPCCPU *cpu);
  28int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr);
  29void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy);
  30bool kvmppc_get_fwnmi(void);
  31int kvmppc_set_fwnmi(PowerPCCPU *cpu);
  32int kvmppc_smt_threads(void);
  33void kvmppc_error_append_smt_possible_hint(Error *const *errp);
  34int kvmppc_set_smt_threads(int smt);
  35int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
  36int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits);
  37int kvmppc_set_tcr(PowerPCCPU *cpu);
  38int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu);
  39target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
  40                                     bool radix, bool gtse,
  41                                     uint64_t proc_tbl);
  42#ifndef CONFIG_USER_ONLY
  43bool kvmppc_spapr_use_multitce(void);
  44int kvmppc_spapr_enable_inkernel_multitce(void);
  45void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
  46                              uint64_t bus_offset, uint32_t nb_table,
  47                              int *pfd, bool need_vfio);
  48int kvmppc_remove_spapr_tce(void *table, int pfd, uint32_t window_size);
  49int kvmppc_reset_htab(int shift_hint);
  50uint64_t kvmppc_vrma_limit(unsigned int hash_shift);
  51bool kvmppc_has_cap_spapr_vfio(void);
  52#endif /* !CONFIG_USER_ONLY */
  53bool kvmppc_has_cap_epr(void);
  54int kvmppc_define_rtas_kernel_token(uint32_t token, const char *function);
  55int kvmppc_get_htab_fd(bool write, uint64_t index, Error **errp);
  56int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, int64_t max_ns);
  57int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
  58                           uint16_t n_valid, uint16_t n_invalid, Error **errp);
  59void kvmppc_read_hptes(ppc_hash_pte64_t *hptes, hwaddr ptex, int n);
  60void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1);
  61bool kvmppc_has_cap_fixup_hcalls(void);
  62bool kvmppc_has_cap_htm(void);
  63bool kvmppc_has_cap_mmu_radix(void);
  64bool kvmppc_has_cap_mmu_hash_v3(void);
  65bool kvmppc_has_cap_xive(void);
  66int kvmppc_get_cap_safe_cache(void);
  67int kvmppc_get_cap_safe_bounds_check(void);
  68int kvmppc_get_cap_safe_indirect_branch(void);
  69int kvmppc_get_cap_count_cache_flush_assist(void);
  70bool kvmppc_has_cap_nested_kvm_hv(void);
  71int kvmppc_set_cap_nested_kvm_hv(int enable);
  72int kvmppc_get_cap_large_decr(void);
  73int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable);
  74int kvmppc_enable_hwrng(void);
  75int kvmppc_put_books_sregs(PowerPCCPU *cpu);
  76PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void);
  77void kvmppc_check_papr_resize_hpt(Error **errp);
  78int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong flags, int shift);
  79int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift);
  80bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu);
  81
  82bool kvmppc_hpt_needs_host_contiguous_pages(void);
  83void kvm_check_mmu(PowerPCCPU *cpu, Error **errp);
  84void kvmppc_set_reg_ppc_online(PowerPCCPU *cpu, unsigned int online);
  85void kvmppc_set_reg_tb_offset(PowerPCCPU *cpu, int64_t tb_offset);
  86
  87int kvm_handle_nmi(PowerPCCPU *cpu, struct kvm_run *run);
  88
  89#else
  90
  91static inline uint32_t kvmppc_get_tbfreq(void)
  92{
  93    return 0;
  94}
  95
  96static inline bool kvmppc_get_host_model(char **buf)
  97{
  98    return false;
  99}
 100
 101static inline bool kvmppc_get_host_serial(char **buf)
 102{
 103    return false;
 104}
 105
 106static inline uint64_t kvmppc_get_clockfreq(void)
 107{
 108    return 0;
 109}
 110
 111static inline uint32_t kvmppc_get_vmx(void)
 112{
 113    return 0;
 114}
 115
 116static inline uint32_t kvmppc_get_dfp(void)
 117{
 118    return 0;
 119}
 120
 121static inline int kvmppc_get_hasidle(CPUPPCState *env)
 122{
 123    return 0;
 124}
 125
 126static inline int kvmppc_get_hypercall(CPUPPCState *env,
 127                                       uint8_t *buf, int buf_len)
 128{
 129    return -1;
 130}
 131
 132static inline int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level)
 133{
 134    return -1;
 135}
 136
 137static inline void kvmppc_enable_logical_ci_hcalls(void)
 138{
 139}
 140
 141static inline void kvmppc_enable_set_mode_hcall(void)
 142{
 143}
 144
 145static inline void kvmppc_enable_clear_ref_mod_hcalls(void)
 146{
 147}
 148
 149static inline void kvmppc_enable_h_page_init(void)
 150{
 151}
 152
 153static inline void kvmppc_set_papr(PowerPCCPU *cpu)
 154{
 155}
 156
 157static inline int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr)
 158{
 159    return 0;
 160}
 161
 162static inline void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy)
 163{
 164}
 165
 166static inline bool kvmppc_get_fwnmi(void)
 167{
 168    return false;
 169}
 170
 171static inline int kvmppc_set_fwnmi(PowerPCCPU *cpu)
 172{
 173    return -1;
 174}
 175
 176static inline int kvmppc_smt_threads(void)
 177{
 178    return 1;
 179}
 180
 181static inline void kvmppc_error_append_smt_possible_hint(Error *const *errp)
 182{
 183    return;
 184}
 185
 186static inline int kvmppc_set_smt_threads(int smt)
 187{
 188    return 0;
 189}
 190
 191static inline int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits)
 192{
 193    return 0;
 194}
 195
 196static inline int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits)
 197{
 198    return 0;
 199}
 200
 201static inline int kvmppc_set_tcr(PowerPCCPU *cpu)
 202{
 203    return 0;
 204}
 205
 206static inline int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu)
 207{
 208    return -1;
 209}
 210
 211static inline target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
 212                                     bool radix, bool gtse,
 213                                     uint64_t proc_tbl)
 214{
 215    return 0;
 216}
 217
 218static inline void kvmppc_set_reg_ppc_online(PowerPCCPU *cpu,
 219                                             unsigned int online)
 220{
 221    return;
 222}
 223
 224static inline void kvmppc_set_reg_tb_offset(PowerPCCPU *cpu, int64_t tb_offset)
 225{
 226}
 227
 228#ifndef CONFIG_USER_ONLY
 229static inline bool kvmppc_spapr_use_multitce(void)
 230{
 231    return false;
 232}
 233
 234static inline int kvmppc_spapr_enable_inkernel_multitce(void)
 235{
 236    return -1;
 237}
 238
 239static inline void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
 240                                            uint64_t bus_offset,
 241                                            uint32_t nb_table,
 242                                            int *pfd, bool need_vfio)
 243{
 244    return NULL;
 245}
 246
 247static inline int kvmppc_remove_spapr_tce(void *table, int pfd,
 248                                          uint32_t nb_table)
 249{
 250    return -1;
 251}
 252
 253static inline int kvmppc_reset_htab(int shift_hint)
 254{
 255    return 0;
 256}
 257
 258static inline uint64_t kvmppc_vrma_limit(unsigned int hash_shift)
 259{
 260    g_assert_not_reached();
 261}
 262
 263static inline bool kvmppc_hpt_needs_host_contiguous_pages(void)
 264{
 265    return false;
 266}
 267
 268static inline void kvm_check_mmu(PowerPCCPU *cpu, Error **errp)
 269{
 270}
 271
 272static inline bool kvmppc_has_cap_spapr_vfio(void)
 273{
 274    return false;
 275}
 276
 277static inline void kvmppc_read_hptes(ppc_hash_pte64_t *hptes,
 278                                     hwaddr ptex, int n)
 279{
 280    abort();
 281}
 282
 283static inline void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1)
 284{
 285    abort();
 286}
 287
 288#endif /* !CONFIG_USER_ONLY */
 289
 290static inline bool kvmppc_has_cap_epr(void)
 291{
 292    return false;
 293}
 294
 295static inline int kvmppc_define_rtas_kernel_token(uint32_t token,
 296                                                  const char *function)
 297{
 298    return -1;
 299}
 300
 301static inline int kvmppc_get_htab_fd(bool write, uint64_t index, Error **errp)
 302{
 303    return -1;
 304}
 305
 306static inline int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize,
 307                                   int64_t max_ns)
 308{
 309    abort();
 310}
 311
 312static inline int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
 313                                         uint16_t n_valid, uint16_t n_invalid,
 314                                         Error **errp)
 315{
 316    abort();
 317}
 318
 319static inline bool kvmppc_has_cap_fixup_hcalls(void)
 320{
 321    abort();
 322}
 323
 324static inline bool kvmppc_has_cap_htm(void)
 325{
 326    return false;
 327}
 328
 329static inline bool kvmppc_has_cap_mmu_radix(void)
 330{
 331    return false;
 332}
 333
 334static inline bool kvmppc_has_cap_mmu_hash_v3(void)
 335{
 336    return false;
 337}
 338
 339static inline bool kvmppc_has_cap_xive(void)
 340{
 341    return false;
 342}
 343
 344static inline int kvmppc_get_cap_safe_cache(void)
 345{
 346    return 0;
 347}
 348
 349static inline int kvmppc_get_cap_safe_bounds_check(void)
 350{
 351    return 0;
 352}
 353
 354static inline int kvmppc_get_cap_safe_indirect_branch(void)
 355{
 356    return 0;
 357}
 358
 359static inline int kvmppc_get_cap_count_cache_flush_assist(void)
 360{
 361    return 0;
 362}
 363
 364static inline bool kvmppc_has_cap_nested_kvm_hv(void)
 365{
 366    return false;
 367}
 368
 369static inline int kvmppc_set_cap_nested_kvm_hv(int enable)
 370{
 371    return -1;
 372}
 373
 374static inline int kvmppc_get_cap_large_decr(void)
 375{
 376    return 0;
 377}
 378
 379static inline int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable)
 380{
 381    return -1;
 382}
 383
 384static inline int kvmppc_enable_hwrng(void)
 385{
 386    return -1;
 387}
 388
 389static inline int kvmppc_put_books_sregs(PowerPCCPU *cpu)
 390{
 391    abort();
 392}
 393
 394static inline PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
 395{
 396    return NULL;
 397}
 398
 399static inline void kvmppc_check_papr_resize_hpt(Error **errp)
 400{
 401    return;
 402}
 403
 404static inline int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu,
 405                                            target_ulong flags, int shift)
 406{
 407    return -ENOSYS;
 408}
 409
 410static inline int kvmppc_resize_hpt_commit(PowerPCCPU *cpu,
 411                                           target_ulong flags, int shift)
 412{
 413    return -ENOSYS;
 414}
 415
 416static inline bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu)
 417{
 418    return false;
 419}
 420
 421#endif
 422
 423#ifndef CONFIG_KVM
 424
 425#define kvmppc_eieio() do { } while (0)
 426
 427static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 428{
 429}
 430
 431static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 432{
 433}
 434
 435#else   /* CONFIG_KVM */
 436
 437#define kvmppc_eieio() \
 438    do {                                          \
 439        if (kvm_enabled()) {                          \
 440            asm volatile("eieio" : : : "memory"); \
 441        } \
 442    } while (0)
 443
 444/* Store data cache blocks back to memory */
 445static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 446{
 447    uint8_t *p;
 448
 449    for (p = addr; p < addr + len; p += cpu->env.dcache_line_size) {
 450        asm volatile("dcbst 0,%0" : : "r"(p) : "memory");
 451    }
 452}
 453
 454/* Invalidate instruction cache blocks */
 455static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 456{
 457    uint8_t *p;
 458
 459    for (p = addr; p < addr + len; p += cpu->env.icache_line_size) {
 460        asm volatile("icbi 0,%0" : : "r"(p));
 461    }
 462}
 463
 464#endif  /* CONFIG_KVM */
 465
 466#endif /* KVM_PPC_H */
 467