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