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 "host-" TYPE_POWERPC_CPU
  13
  14#ifdef CONFIG_KVM
  15
  16uint32_t kvmppc_get_tbfreq(void);
  17uint64_t kvmppc_get_clockfreq(void);
  18uint32_t kvmppc_get_vmx(void);
  19uint32_t kvmppc_get_dfp(void);
  20bool kvmppc_get_host_model(char **buf);
  21bool kvmppc_get_host_serial(char **buf);
  22int kvmppc_get_hasidle(CPUPPCState *env);
  23int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len);
  24int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level);
  25void kvmppc_enable_logical_ci_hcalls(void);
  26void kvmppc_enable_set_mode_hcall(void);
  27void kvmppc_enable_clear_ref_mod_hcalls(void);
  28void kvmppc_set_papr(PowerPCCPU *cpu);
  29int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr);
  30void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy);
  31int kvmppc_smt_threads(void);
  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);
  36target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
  37                                     bool radix, bool gtse,
  38                                     uint64_t proc_tbl);
  39#ifndef CONFIG_USER_ONLY
  40off_t kvmppc_alloc_rma(void **rma);
  41bool kvmppc_spapr_use_multitce(void);
  42int kvmppc_spapr_enable_inkernel_multitce(void);
  43void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
  44                              uint64_t bus_offset, uint32_t nb_table,
  45                              int *pfd, bool need_vfio);
  46int kvmppc_remove_spapr_tce(void *table, int pfd, uint32_t window_size);
  47int kvmppc_reset_htab(int shift_hint);
  48uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift);
  49#endif /* !CONFIG_USER_ONLY */
  50bool kvmppc_has_cap_epr(void);
  51int kvmppc_define_rtas_kernel_token(uint32_t token, const char *function);
  52bool kvmppc_has_cap_htab_fd(void);
  53int kvmppc_get_htab_fd(bool write);
  54int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, int64_t max_ns);
  55int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
  56                           uint16_t n_valid, uint16_t n_invalid);
  57void kvmppc_read_hptes(ppc_hash_pte64_t *hptes, hwaddr ptex, int n);
  58void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1);
  59bool kvmppc_has_cap_fixup_hcalls(void);
  60bool kvmppc_has_cap_htm(void);
  61bool kvmppc_has_cap_mmu_radix(void);
  62bool kvmppc_has_cap_mmu_hash_v3(void);
  63int kvmppc_enable_hwrng(void);
  64int kvmppc_put_books_sregs(PowerPCCPU *cpu);
  65PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void);
  66void kvmppc_check_papr_resize_hpt(Error **errp);
  67int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong flags, int shift);
  68int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift);
  69void kvmppc_update_sdr1(target_ulong sdr1);
  70bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu);
  71
  72bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path);
  73
  74#else
  75
  76static inline uint32_t kvmppc_get_tbfreq(void)
  77{
  78    return 0;
  79}
  80
  81static inline bool kvmppc_get_host_model(char **buf)
  82{
  83    return false;
  84}
  85
  86static inline bool kvmppc_get_host_serial(char **buf)
  87{
  88    return false;
  89}
  90
  91static inline uint64_t kvmppc_get_clockfreq(void)
  92{
  93    return 0;
  94}
  95
  96static inline uint32_t kvmppc_get_vmx(void)
  97{
  98    return 0;
  99}
 100
 101static inline uint32_t kvmppc_get_dfp(void)
 102{
 103    return 0;
 104}
 105
 106static inline int kvmppc_get_hasidle(CPUPPCState *env)
 107{
 108    return 0;
 109}
 110
 111static inline int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len)
 112{
 113    return -1;
 114}
 115
 116static inline int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level)
 117{
 118    return -1;
 119}
 120
 121static inline void kvmppc_enable_logical_ci_hcalls(void)
 122{
 123}
 124
 125static inline void kvmppc_enable_set_mode_hcall(void)
 126{
 127}
 128
 129static inline void kvmppc_enable_clear_ref_mod_hcalls(void)
 130{
 131}
 132
 133static inline void kvmppc_set_papr(PowerPCCPU *cpu)
 134{
 135}
 136
 137static inline int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr)
 138{
 139    return 0;
 140}
 141
 142static inline void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy)
 143{
 144}
 145
 146static inline int kvmppc_smt_threads(void)
 147{
 148    return 1;
 149}
 150
 151static inline int kvmppc_or_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits)
 152{
 153    return 0;
 154}
 155
 156static inline int kvmppc_clear_tsr_bits(PowerPCCPU *cpu, uint32_t tsr_bits)
 157{
 158    return 0;
 159}
 160
 161static inline int kvmppc_set_tcr(PowerPCCPU *cpu)
 162{
 163    return 0;
 164}
 165
 166static inline int kvmppc_booke_watchdog_enable(PowerPCCPU *cpu)
 167{
 168    return -1;
 169}
 170
 171static inline target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
 172                                     bool radix, bool gtse,
 173                                     uint64_t proc_tbl)
 174{
 175    return 0;
 176}
 177
 178#ifndef CONFIG_USER_ONLY
 179static inline off_t kvmppc_alloc_rma(void **rma)
 180{
 181    return 0;
 182}
 183
 184static inline bool kvmppc_spapr_use_multitce(void)
 185{
 186    return false;
 187}
 188
 189static inline int kvmppc_spapr_enable_inkernel_multitce(void)
 190{
 191    return -1;
 192}
 193
 194static inline void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
 195                                            uint64_t bus_offset,
 196                                            uint32_t nb_table,
 197                                            int *pfd, bool need_vfio)
 198{
 199    return NULL;
 200}
 201
 202static inline int kvmppc_remove_spapr_tce(void *table, int pfd,
 203                                          uint32_t nb_table)
 204{
 205    return -1;
 206}
 207
 208static inline int kvmppc_reset_htab(int shift_hint)
 209{
 210    return 0;
 211}
 212
 213static inline uint64_t kvmppc_rma_size(uint64_t current_size,
 214                                       unsigned int hash_shift)
 215{
 216    return ram_size;
 217}
 218
 219static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path)
 220{
 221    return true;
 222}
 223
 224#endif /* !CONFIG_USER_ONLY */
 225
 226static inline bool kvmppc_has_cap_epr(void)
 227{
 228    return false;
 229}
 230
 231static inline int kvmppc_define_rtas_kernel_token(uint32_t token,
 232                                                  const char *function)
 233{
 234    return -1;
 235}
 236
 237static inline bool kvmppc_has_cap_htab_fd(void)
 238{
 239    return false;
 240}
 241
 242static inline int kvmppc_get_htab_fd(bool write)
 243{
 244    return -1;
 245}
 246
 247static inline int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize,
 248                                   int64_t max_ns)
 249{
 250    abort();
 251}
 252
 253static inline int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
 254                                         uint16_t n_valid, uint16_t n_invalid)
 255{
 256    abort();
 257}
 258
 259static inline void kvmppc_read_hptes(ppc_hash_pte64_t *hptes,
 260                                     hwaddr ptex, int n)
 261{
 262    abort();
 263}
 264
 265static inline void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1)
 266{
 267    abort();
 268}
 269
 270static inline bool kvmppc_has_cap_fixup_hcalls(void)
 271{
 272    abort();
 273}
 274
 275static inline bool kvmppc_has_cap_htm(void)
 276{
 277    return false;
 278}
 279
 280static inline bool kvmppc_has_cap_mmu_radix(void)
 281{
 282    return false;
 283}
 284
 285static inline bool kvmppc_has_cap_mmu_hash_v3(void)
 286{
 287    return false;
 288}
 289
 290static inline int kvmppc_enable_hwrng(void)
 291{
 292    return -1;
 293}
 294
 295static inline int kvmppc_put_books_sregs(PowerPCCPU *cpu)
 296{
 297    abort();
 298}
 299
 300static inline PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
 301{
 302    return NULL;
 303}
 304
 305static inline void kvmppc_check_papr_resize_hpt(Error **errp)
 306{
 307    return;
 308}
 309
 310static inline int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu,
 311                                            target_ulong flags, int shift)
 312{
 313    return -ENOSYS;
 314}
 315
 316static inline int kvmppc_resize_hpt_commit(PowerPCCPU *cpu,
 317                                           target_ulong flags, int shift)
 318{
 319    return -ENOSYS;
 320}
 321
 322static inline void kvmppc_update_sdr1(target_ulong sdr1)
 323{
 324    abort();
 325}
 326
 327#endif
 328
 329#ifndef CONFIG_KVM
 330
 331#define kvmppc_eieio() do { } while (0)
 332
 333static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 334{
 335}
 336
 337static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 338{
 339}
 340
 341#else   /* CONFIG_KVM */
 342
 343#define kvmppc_eieio() \
 344    do {                                          \
 345        if (kvm_enabled()) {                          \
 346            asm volatile("eieio" : : : "memory"); \
 347        } \
 348    } while (0)
 349
 350/* Store data cache blocks back to memory */
 351static inline void kvmppc_dcbst_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 352{
 353    uint8_t *p;
 354
 355    for (p = addr; p < addr + len; p += cpu->env.dcache_line_size) {
 356        asm volatile("dcbst 0,%0" : : "r"(p) : "memory");
 357    }
 358}
 359
 360/* Invalidate instruction cache blocks */
 361static inline void kvmppc_icbi_range(PowerPCCPU *cpu, uint8_t *addr, int len)
 362{
 363    uint8_t *p;
 364
 365    for (p = addr; p < addr + len; p += cpu->env.icache_line_size) {
 366        asm volatile("icbi 0,%0" : : "r"(p));
 367    }
 368}
 369
 370#endif  /* CONFIG_KVM */
 371
 372#endif /* KVM_PPC_H */
 373