Skip to content

Commit

Permalink
live-migration complete
Browse files Browse the repository at this point in the history
  • Loading branch information
ddk committed Jan 24, 2011
1 parent 2a3dee1 commit 16f9179
Show file tree
Hide file tree
Showing 8 changed files with 67 additions and 45 deletions.
13 changes: 6 additions & 7 deletions kvm/winkvm-qemu-0.9.1/hw/i8259.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ typedef struct PicState {
uint8_t rotate_on_auto_eoi;
uint8_t special_fully_nested_mode;
uint8_t init4; /* true if 4 byte init */
// uint8_t single_mode; /* true if slave pic is not initialized */
uint8_t single_mode; /* true if slave pic is not initialized */
uint8_t elcr; /* PIIX edge/trigger selection*/
uint8_t elcr_mask;
PicState2 *pics_state;
Expand Down Expand Up @@ -276,7 +276,7 @@ static void pic_reset(void *opaque)
s->rotate_on_auto_eoi = 0;
s->special_fully_nested_mode = 0;
s->init4 = 0;
// s->single_mode = 0;
s->single_mode = 0;
/* Note: ELCR is not reset */
}

Expand All @@ -297,7 +297,7 @@ static void pic_ioport_write(void *opaque, uint32_t addr, uint32_t val)
qemu_irq_lower(s->pics_state->parent_irq);
s->init_state = 1;
s->init4 = val & 1;
// s->single_mode = val & 2;
s->single_mode = val & 2;
if (val & 0x02)
hw_error("single mode not supported");
if (val & 0x08)
Expand Down Expand Up @@ -356,8 +356,7 @@ static void pic_ioport_write(void *opaque, uint32_t addr, uint32_t val)
break;
case 1:
s->irq_base = val & 0xf8;
// s->init_state = s->single_mode ? (s->init4 ? 3 : 0) : 2;
s->init_state = 2;
s->init_state = s->single_mode ? (s->init4 ? 3 : 0) : 2;
break;
case 2:
if (s->init4) {
Expand Down Expand Up @@ -469,7 +468,7 @@ static void pic_save(QEMUFile *f, void *opaque)
qemu_put_8s(f, &s->rotate_on_auto_eoi);
qemu_put_8s(f, &s->special_fully_nested_mode);
qemu_put_8s(f, &s->init4);
// qemu_put_8s(f, &s->single_mode);
qemu_put_8s(f, &s->single_mode);
qemu_put_8s(f, &s->elcr);
}

Expand All @@ -494,7 +493,7 @@ static int pic_load(QEMUFile *f, void *opaque, int version_id)
qemu_get_8s(f, &s->rotate_on_auto_eoi);
qemu_get_8s(f, &s->special_fully_nested_mode);
qemu_get_8s(f, &s->init4);
// qemu_get_8s(f, &s->single_mode);
qemu_get_8s(f, &s->single_mode);
qemu_get_8s(f, &s->elcr);
return 0;
}
Expand Down
3 changes: 2 additions & 1 deletion kvm/winkvm-qemu-0.9.1/hw/ne2000.c
Original file line number Diff line number Diff line change
Expand Up @@ -752,7 +752,8 @@ void isa_ne2000_init(int base, qemu_irq irq, NICInfo *nd)
s->macaddr[3],
s->macaddr[4],
s->macaddr[5]);


// WARNING!!!
register_savevm("ne2000", 0, 2, ne2000_save, ne2000_load, s);
}

Expand Down
1 change: 1 addition & 0 deletions kvm/winkvm-qemu-0.9.1/hw/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ PCIBus *pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
bus->nirq = nirq;
first_bus = bus;
register_savevm("PCIBUS", nbus++, 1, pcibus_save, pcibus_load, bus);
//register_savevm("PCIBUS", nbus++, 3, pcibus_save, pcibus_load, bus);
return bus;
}

Expand Down
4 changes: 3 additions & 1 deletion kvm/winkvm-qemu-0.9.1/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -943,8 +943,10 @@ static int migrate_incoming_tcp(const char *host)
rc = MIG_STAT_DST_WRITE_FAILED;
goto error_accept;
}


printf("Wait for go\n");
rc = wait_for_message("WAIT FOR GO", sfd, wait_for_message_timeout);
printf("WAIT FOR GO\n");
if (rc) {
rc += 200;
goto error_accept;
Expand Down
14 changes: 14 additions & 0 deletions kvm/winkvm-qemu-0.9.1/monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@
#include "disas.h"
#include <dirent.h>

#if USE_KVM
#include "qemu-kvm.h"
extern int kvm_allowed;
#endif

#ifdef CONFIG_PROFILER
#include "qemu-timer.h" /* for ticks_per_sec */
#endif
Expand Down Expand Up @@ -2310,6 +2315,15 @@ static void monitor_handle_command(const char *cmdline)
goto fail;
}

#ifdef USE_KVM
if(1)
{
CPUState *env=mon_get_cpu();
if (kvm_allowed)
kvm_save_registers(env);
}
#endif

switch(nb_args) {
case 0:
cmd->handler();
Expand Down
9 changes: 5 additions & 4 deletions kvm/winkvm-qemu-0.9.1/qemu-kvm.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ static void save_regs(CPUState *env)
#endif
rc = kvm_get_msrs(kvm_context, 0, msrs, n);
if (rc == -1) {
perror("kvm_get_msrs FAILED");
perror("kvm_get_msrs FAILED");
}
else {
n = rc; /* actual number of MSRs */
Expand All @@ -397,14 +397,15 @@ static void save_regs(CPUState *env)
static int try_push_interrupts(void *opaque)
{
CPUState **envs = opaque, *env;
env = envs[0];
env = envs[0];

if (env->ready_for_interrupt_injection &&
(env->interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK)) {
env->interrupt_request &= ~CPU_INTERRUPT_HARD;
// for now using cpu 0
kvm_inject_irq(kvm_context, 0, cpu_get_pic_interrupt(env));
// for now using cpu 0
unsigned irq = cpu_get_pic_interrupt(env);
kvm_inject_irq(kvm_context, 0, irq);
}

return (env->interrupt_request & CPU_INTERRUPT_HARD) != 0;
Expand Down
43 changes: 23 additions & 20 deletions kvm/winkvm-qemu-0.9.1/vl.c
Original file line number Diff line number Diff line change
Expand Up @@ -6253,7 +6253,7 @@ static int qemu_loadvm_state(QEMUFile *f)
fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
instance_id, idstr);
} else {
ret = se->load_state(f, se->opaque, version_id);
ret = se->load_state(f, se->opaque, version_id);
if (ret < 0) {
fprintf(stderr, "qemu: warning: error while loading state for instance 0x%x of device '%s'\n",
instance_id, idstr);
Expand Down Expand Up @@ -6319,6 +6319,8 @@ int qemu_live_loadvm_state(QEMUFile *f)
instance_id = qemu_get_be32(f);
version_id = qemu_get_be32(f);
se = find_se(idstr, instance_id);
printf("idstr=%s instance=0x%x version=%d len=%d\n",
idstr, instance_id, version_id, len);
if (!se) {
fprintf(stderr, "qemu: warning: instance 0x%x of device '%s' not present in current VM\n",
instance_id, idstr);
Expand Down Expand Up @@ -7461,16 +7463,12 @@ static int ram_load_static(QEMUFile *f, void *opaque)
uint8_t buf[10];
int i;


/*
if (version_id == 1)
return ram_load_v1(f, opaque);
if (version_id != 2)
return -EINVAL;
*/
printf("ram_load_static:\n");

if (qemu_get_be32(f) != phys_ram_size)
return -EINVAL;
if (qemu_get_be32(f) != phys_ram_size) {
printf("%s: invalid phys_ram_size: %d\n", phys_ram_size);
return -EINVAL;
}
if (ram_decompress_open(s, f) < 0)
return -EINVAL;
for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
Expand Down Expand Up @@ -7525,19 +7523,23 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id)

switch (version_id) {
case 1:
ret = ram_load_v1(f, opaque);
printf("version_id 1\n");
ret = ram_load_v1(f, opaque);
break;
case 3:
if (qemu_get_byte(f)) {
printf("version_id 3\n");
if (qemu_get_byte(f)) {
ret = ram_load_live(f, opaque);
break;
}
}
case 2:
ret = ram_load_static(f, opaque);
break;
printf("version_id 2\n");
ret = ram_load_static(f, opaque);
break;
default:
ret = -EINVAL;
break;
printf("version_id: nothing\n");
ret = -EINVAL;
break;
}

return ret;
Expand Down Expand Up @@ -9387,7 +9389,7 @@ int main(int argc, char **argv)

/* init the memory */
phys_ram_size = ram_size + vga_ram_size + MAX_BIOS_SIZE;
/* phys_ram_size = ram_size + vga_ram_size + ((256 + 64) * 1024); */
//phys_ram_size = ram_size + vga_ram_size + ((256 + 64) * 1024);
fprintf(stderr, "phys_ram_size: %d\nram_size: %d\nvga_ram_size: %d\n",
phys_ram_size, ram_size, vga_ram_size);

Expand Down Expand Up @@ -9438,8 +9440,8 @@ int main(int argc, char **argv)
if (drive_init(drives_opt[i], snapshot, machine) == -1)
exit(1);

register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
register_savevm("ram", 0, 2, ram_save, ram_load, NULL);
register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
register_savevm("ram", 0, 3, ram_save, ram_load, NULL); /* ddk check */

init_ioports();

Expand Down Expand Up @@ -9586,6 +9588,7 @@ int main(int argc, char **argv)
close(fd);
}

printf("go mainloop");
main_loop();
quit_timers();

Expand Down
25 changes: 13 additions & 12 deletions vcproj/user/kvmctldll/kvmctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1124,11 +1124,10 @@ struct kvm_msr_list* __cdecl kvm_get_msr_list(kvm_context_t kvm)

int __cdecl kvm_get_msrs(kvm_context_t kvm, int vcpu, struct kvm_msr_entry *msrs, int n)
{
// fprintf(stderr, " %s implement me\n", __FUNCTION__);
/*
struct kvm_msrs *kmsrs = malloc(sizeof *kmsrs + n * sizeof *msrs);
int r, e;
int e;
BOOL ret;
unsigned long retlen;

if (!kmsrs) {
// errno = ENOMEM;
Expand All @@ -1138,12 +1137,12 @@ int __cdecl kvm_get_msrs(kvm_context_t kvm, int vcpu, struct kvm_msr_entry *msrs
kmsrs->nmsrs = n;
memcpy(kmsrs->entries, msrs, n * sizeof *msrs);

ret = DeviceIoControl(kvm->hnd,
KVM_GET_REGS,
&fd,
sizeof(int),
regs,
sizeof(struct kvm_regs),
ret = DeviceIoControl(kvm->hnd,
KVM_GET_MSRS,
kmsrs,
sizeof *kmsrs + n * sizeof *msrs,
kmsrs,
sizeof *kmsrs + n * sizeof *msrs,
&retlen,
NULL);

Expand All @@ -1153,9 +1152,11 @@ int __cdecl kvm_get_msrs(kvm_context_t kvm, int vcpu, struct kvm_msr_entry *msrs
memcpy(msrs, kmsrs->entries, n * sizeof *msrs);
free(kmsrs);
errno = e;
return r;
*/
return -1;

if (ret)
return 1;
else
return -1;
}

int __cdecl kvm_set_msrs(kvm_context_t kvm, int vcpu, struct kvm_msr_entry *msrs, int n)
Expand Down

0 comments on commit 16f9179

Please sign in to comment.