+ (start_addr + size) <= (mem->guest_phys_addr +
+ mem->memory_size)) {
+ KVMSlot slot;
+ target_phys_addr_t mem_start;
+ ram_addr_t mem_size, mem_offset;
+
+ /* Not splitting */
+ if ((phys_offset - (start_addr - mem->guest_phys_addr)) ==
+ ((uint8_t *)mem->userspace_addr - phys_ram_base))
+ return;
+
+ /* unregister whole slot */
+ memcpy(&slot, mem, sizeof(slot));
+ mem->memory_size = 0;
+ kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, mem);
+
+ /* register prefix slot */
+ mem_start = slot.guest_phys_addr;
+ mem_size = start_addr - slot.guest_phys_addr;
+ mem_offset = (uint8_t *)slot.userspace_addr - phys_ram_base;
+ if (mem_size)
+ kvm_set_phys_mem(mem_start, mem_size, mem_offset);
+
+ /* register new slot */
+ kvm_set_phys_mem(start_addr, size, phys_offset);
+
+ /* register suffix slot */
+ mem_start = start_addr + size;
+ mem_offset += mem_size + size;
+ mem_size = slot.memory_size - mem_size - size;
+ if (mem_size)
+ kvm_set_phys_mem(mem_start, mem_size, mem_offset);
+