Revision a60f24b5 target-ppc/kvm.c
b/target-ppc/kvm.c | ||
---|---|---|
140 | 140 |
int ret, i; |
141 | 141 |
|
142 | 142 |
if (!kvm_enabled() || |
143 |
!kvm_check_extension(env->kvm_state, KVM_CAP_SW_TLB)) {
|
|
143 |
!kvm_check_extension(cs->kvm_state, KVM_CAP_SW_TLB)) {
|
|
144 | 144 |
return 0; |
145 | 145 |
} |
146 | 146 |
|
... | ... | |
178 | 178 |
|
179 | 179 |
|
180 | 180 |
#if defined(TARGET_PPC64) |
181 |
static void kvm_get_fallback_smmu_info(CPUPPCState *env,
|
|
181 |
static void kvm_get_fallback_smmu_info(PowerPCCPU *cpu,
|
|
182 | 182 |
struct kvm_ppc_smmu_info *info) |
183 | 183 |
{ |
184 |
CPUPPCState *env = &cpu->env; |
|
185 |
CPUState *cs = CPU(cpu); |
|
186 |
|
|
184 | 187 |
memset(info, 0, sizeof(*info)); |
185 | 188 |
|
186 | 189 |
/* We don't have the new KVM_PPC_GET_SMMU_INFO ioctl, so |
... | ... | |
206 | 209 |
* implements KVM_CAP_PPC_GET_SMMU_INFO and thus doesn't hit |
207 | 210 |
* this fallback. |
208 | 211 |
*/ |
209 |
if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_GET_PVINFO)) {
|
|
212 |
if (kvm_check_extension(cs->kvm_state, KVM_CAP_PPC_GET_PVINFO)) {
|
|
210 | 213 |
/* No flags */ |
211 | 214 |
info->flags = 0; |
212 | 215 |
info->slb_size = 64; |
... | ... | |
262 | 265 |
} |
263 | 266 |
} |
264 | 267 |
|
265 |
static void kvm_get_smmu_info(CPUPPCState *env, struct kvm_ppc_smmu_info *info)
|
|
268 |
static void kvm_get_smmu_info(PowerPCCPU *cpu, struct kvm_ppc_smmu_info *info)
|
|
266 | 269 |
{ |
270 |
CPUState *cs = CPU(cpu); |
|
267 | 271 |
int ret; |
268 | 272 |
|
269 |
if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_GET_SMMU_INFO)) {
|
|
270 |
ret = kvm_vm_ioctl(env->kvm_state, KVM_PPC_GET_SMMU_INFO, info);
|
|
273 |
if (kvm_check_extension(cs->kvm_state, KVM_CAP_PPC_GET_SMMU_INFO)) {
|
|
274 |
ret = kvm_vm_ioctl(cs->kvm_state, KVM_PPC_GET_SMMU_INFO, info);
|
|
271 | 275 |
if (ret == 0) { |
272 | 276 |
return; |
273 | 277 |
} |
274 | 278 |
} |
275 | 279 |
|
276 |
kvm_get_fallback_smmu_info(env, info);
|
|
280 |
kvm_get_fallback_smmu_info(cpu, info);
|
|
277 | 281 |
} |
278 | 282 |
|
279 | 283 |
static long getrampagesize(void) |
... | ... | |
316 | 320 |
return (1ul << shift) <= rampgsize; |
317 | 321 |
} |
318 | 322 |
|
319 |
static void kvm_fixup_page_sizes(CPUPPCState *env)
|
|
323 |
static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
|
|
320 | 324 |
{ |
321 | 325 |
static struct kvm_ppc_smmu_info smmu_info; |
322 | 326 |
static bool has_smmu_info; |
327 |
CPUPPCState *env = &cpu->env; |
|
323 | 328 |
long rampagesize; |
324 | 329 |
int iq, ik, jq, jk; |
325 | 330 |
|
... | ... | |
330 | 335 |
|
331 | 336 |
/* Collect MMU info from kernel if not already */ |
332 | 337 |
if (!has_smmu_info) { |
333 |
kvm_get_smmu_info(env, &smmu_info);
|
|
338 |
kvm_get_smmu_info(cpu, &smmu_info);
|
|
334 | 339 |
has_smmu_info = true; |
335 | 340 |
} |
336 | 341 |
|
... | ... | |
373 | 378 |
} |
374 | 379 |
#else /* defined (TARGET_PPC64) */ |
375 | 380 |
|
376 |
static inline void kvm_fixup_page_sizes(CPUPPCState *env)
|
|
381 |
static inline void kvm_fixup_page_sizes(PowerPCCPU *cpu)
|
|
377 | 382 |
{ |
378 | 383 |
} |
379 | 384 |
|
... | ... | |
386 | 391 |
int ret; |
387 | 392 |
|
388 | 393 |
/* Gather server mmu info from KVM and update the CPU state */ |
389 |
kvm_fixup_page_sizes(cenv);
|
|
394 |
kvm_fixup_page_sizes(cpu);
|
|
390 | 395 |
|
391 | 396 |
/* Synchronize sregs with kvm */ |
392 | 397 |
ret = kvm_arch_sync_sregs(cpu); |
... | ... | |
986 | 991 |
|
987 | 992 |
int kvmppc_get_hypercall(CPUPPCState *env, uint8_t *buf, int buf_len) |
988 | 993 |
{ |
994 |
PowerPCCPU *cpu = ppc_env_get_cpu(env); |
|
995 |
CPUState *cs = CPU(cpu); |
|
989 | 996 |
uint32_t *hc = (uint32_t*)buf; |
990 | 997 |
|
991 | 998 |
struct kvm_ppc_pvinfo pvinfo; |
992 | 999 |
|
993 |
if (kvm_check_extension(env->kvm_state, KVM_CAP_PPC_GET_PVINFO) &&
|
|
994 |
!kvm_vm_ioctl(env->kvm_state, KVM_PPC_GET_PVINFO, &pvinfo)) {
|
|
1000 |
if (kvm_check_extension(cs->kvm_state, KVM_CAP_PPC_GET_PVINFO) &&
|
|
1001 |
!kvm_vm_ioctl(cs->kvm_state, KVM_PPC_GET_PVINFO, &pvinfo)) {
|
|
995 | 1002 |
memcpy(buf, pvinfo.hcall, buf_len); |
996 | 1003 |
|
997 | 1004 |
return 0; |
Also available in: Unified diff