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