Commit 34fc643fd3ff76dac6990cd2fa4a136111eb383a

Authored by aliguori
1 parent af12906f

Make KVMSlot a real structure

struct kvm_userspace_memory_region does not use QEMU friendly types to 
define memory slots.  This results in lots of ugly casting with warnings 
on 32-bit platforms.

This patch introduces a proper KVMSlot structure that uses QEMU types to
describe memory slots.  This eliminates many of the casts and isolates 
the type conversions to one spot.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5755 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 37 additions and 17 deletions
kvm-all.c
@@ -32,7 +32,14 @@ @@ -32,7 +32,14 @@
32 do { } while (0) 32 do { } while (0)
33 #endif 33 #endif
34 34
35 -typedef struct kvm_userspace_memory_region KVMSlot; 35 +typedef struct KVMSlot
  36 +{
  37 + target_phys_addr_t start_addr;
  38 + ram_addr_t memory_size;
  39 + ram_addr_t phys_offset;
  40 + int slot;
  41 + int flags;
  42 +} KVMSlot;
36 43
37 int kvm_allowed = 0; 44 int kvm_allowed = 0;
38 45
@@ -67,8 +74,8 @@ static KVMSlot *kvm_lookup_slot(KVMState *s, target_phys_addr_t start_addr) @@ -67,8 +74,8 @@ static KVMSlot *kvm_lookup_slot(KVMState *s, target_phys_addr_t start_addr)
67 for (i = 0; i < ARRAY_SIZE(s->slots); i++) { 74 for (i = 0; i < ARRAY_SIZE(s->slots); i++) {
68 KVMSlot *mem = &s->slots[i]; 75 KVMSlot *mem = &s->slots[i];
69 76
70 - if (start_addr >= mem->guest_phys_addr &&  
71 - start_addr < (mem->guest_phys_addr + mem->memory_size)) 77 + if (start_addr >= mem->start_addr &&
  78 + start_addr < (mem->start_addr + mem->memory_size))
72 return mem; 79 return mem;
73 } 80 }
74 81
@@ -309,6 +316,19 @@ int kvm_cpu_exec(CPUState *env) @@ -309,6 +316,19 @@ int kvm_cpu_exec(CPUState *env)
309 return ret; 316 return ret;
310 } 317 }
311 318
  319 +static int kvm_set_user_memory_region(KVMState *s, KVMSlot *slot)
  320 +{
  321 + struct kvm_userspace_memory_region mem;
  322 +
  323 + mem.slot = slot->slot;
  324 + mem.guest_phys_addr = slot->start_addr;
  325 + mem.memory_size = slot->memory_size;
  326 + mem.userspace_addr = (unsigned long)phys_ram_base + slot->phys_offset;
  327 + mem.flags = slot->flags;
  328 +
  329 + return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
  330 +}
  331 +
312 void kvm_set_phys_mem(target_phys_addr_t start_addr, 332 void kvm_set_phys_mem(target_phys_addr_t start_addr,
313 ram_addr_t size, 333 ram_addr_t size,
314 ram_addr_t phys_offset) 334 ram_addr_t phys_offset)
@@ -324,32 +344,32 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, @@ -324,32 +344,32 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr,
324 if (mem) { 344 if (mem) {
325 if ((flags == IO_MEM_UNASSIGNED) || (flags >= TLB_MMIO)) { 345 if ((flags == IO_MEM_UNASSIGNED) || (flags >= TLB_MMIO)) {
326 mem->memory_size = 0; 346 mem->memory_size = 0;
327 - mem->guest_phys_addr = start_addr;  
328 - mem->userspace_addr = 0; 347 + mem->start_addr = start_addr;
  348 + mem->phys_offset = 0;
329 mem->flags = 0; 349 mem->flags = 0;
330 350
331 - kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, mem);  
332 - } else if (start_addr >= mem->guest_phys_addr &&  
333 - (start_addr + size) <= (mem->guest_phys_addr + 351 + kvm_set_user_memory_region(s, mem);
  352 + } else if (start_addr >= mem->start_addr &&
  353 + (start_addr + size) <= (mem->start_addr +
334 mem->memory_size)) { 354 mem->memory_size)) {
335 KVMSlot slot; 355 KVMSlot slot;
336 target_phys_addr_t mem_start; 356 target_phys_addr_t mem_start;
337 ram_addr_t mem_size, mem_offset; 357 ram_addr_t mem_size, mem_offset;
338 358
339 /* Not splitting */ 359 /* Not splitting */
340 - if ((phys_offset - (start_addr - mem->guest_phys_addr)) ==  
341 - ((uint8_t *)mem->userspace_addr - phys_ram_base)) 360 + if ((phys_offset - (start_addr - mem->start_addr)) ==
  361 + mem->phys_offset)
342 return; 362 return;
343 363
344 /* unregister whole slot */ 364 /* unregister whole slot */
345 memcpy(&slot, mem, sizeof(slot)); 365 memcpy(&slot, mem, sizeof(slot));
346 mem->memory_size = 0; 366 mem->memory_size = 0;
347 - kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, mem); 367 + kvm_set_user_memory_region(s, mem);
348 368
349 /* register prefix slot */ 369 /* register prefix slot */
350 - mem_start = slot.guest_phys_addr;  
351 - mem_size = start_addr - slot.guest_phys_addr;  
352 - mem_offset = (uint8_t *)slot.userspace_addr - phys_ram_base; 370 + mem_start = slot.start_addr;
  371 + mem_size = start_addr - slot.start_addr;
  372 + mem_offset = slot.phys_offset;
353 if (mem_size) 373 if (mem_size)
354 kvm_set_phys_mem(mem_start, mem_size, mem_offset); 374 kvm_set_phys_mem(mem_start, mem_size, mem_offset);
355 375
@@ -375,11 +395,11 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr, @@ -375,11 +395,11 @@ void kvm_set_phys_mem(target_phys_addr_t start_addr,
375 395
376 mem = kvm_alloc_slot(s); 396 mem = kvm_alloc_slot(s);
377 mem->memory_size = size; 397 mem->memory_size = size;
378 - mem->guest_phys_addr = start_addr;  
379 - mem->userspace_addr = (unsigned long)(phys_ram_base + phys_offset); 398 + mem->start_addr = start_addr;
  399 + mem->phys_offset = phys_offset;
380 mem->flags = 0; 400 mem->flags = 0;
381 401
382 - kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, mem); 402 + kvm_set_user_memory_region(s, mem);
383 /* FIXME deal with errors */ 403 /* FIXME deal with errors */
384 } 404 }
385 405