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