Skip to content

Commit 36ebcff

Browse files
author
ddk
committedSep 22, 2010
BUGFIX: KVM_SET[GET]_SREGS is called with illegal vcpu_fd
1 parent 81dd1cf commit 36ebcff

File tree

5 files changed

+36
-29
lines changed

5 files changed

+36
-29
lines changed
 

‎kvm/qemu/vl.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -5269,7 +5269,6 @@ void cpu_save(QEMUFile *f, void *opaque)
52695269
if (kvm_allowed) {
52705270
for (i = 0; i < NR_IRQ_WORDS ; i++) {
52715271
qemu_put_betls(f, &env->kvm_interrupt_bitmap[i]);
5272-
52735272
}
52745273
qemu_put_be64s(f, &env->tsc);
52755274
}
@@ -6273,8 +6272,8 @@ int main_loop(void)
62736272
reset_requested = 0;
62746273
qemu_system_reset();
62756274
#ifdef USE_KVM
6276-
if (kvm_allowed)
6277-
kvm_load_registers(env);
6275+
if (kvm_allowed)
6276+
kvm_load_registers(env);
62786277
#endif
62796278
ret = EXCP_INTERRUPT;
62806279
}

‎kvm/winkvm-qemu/migration.c

+8-11
Original file line numberDiff line numberDiff line change
@@ -812,18 +812,11 @@ static int migrate_incoming_fd(int fd)
812812
{
813813
int ret = 0;
814814
QEMUFile *f = qemu_fopen_fd(fd);
815-
uint32_t memsize;
816-
int rret;
817815
uint32_t addr;
816+
uint32_t memsize;
818817
extern void qemu_announce_self(void);
819-
820-
memsize = 0;
821-
rret = recv(fd, (void*)&memsize, sizeof(uint32_t), 0);
822-
if (rret < 0) {
823-
perror("recv error");
824-
}
825818

826-
memsize = bswap_32(memsize);
819+
memsize = qemu_get_be32(f);
827820
if (memsize != phys_ram_size) {
828821
fprintf(stderr,
829822
"src qemu is allocated %d [bytes] memory\n"
@@ -944,7 +937,8 @@ static int migrate_incoming_tcp(const char *host)
944937
}
945938

946939
send_ack:
947-
len = write(sfd, &status, 1);
940+
// len = write(sfd, &status, 1);
941+
len = send(sfd, &status, 1, 0);
948942
if (len == -1 && errno == EAGAIN)
949943
goto send_ack;
950944
if (len != 1) {
@@ -959,12 +953,15 @@ static int migrate_incoming_tcp(const char *host)
959953
}
960954

961955
wait_for_go:
962-
len = read(sfd, &status, 1);
956+
// len = read(sfd, &status, 1);
957+
len = recv(sfd, &status, 1, 0);
963958
if (len == -1 && errno == EAGAIN)
964959
goto wait_for_go;
965960
if (len != 1)
966961
rc = MIG_STAT_DST_READ_FAILED;
967962

963+
fprintf(stderr, "migrate incoming tcp end\n");
964+
968965
error_accept:
969966
close(sfd);
970967
error_socket:

‎kvm/winkvm-qemu/qemu-kvm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ static void load_regs(CPUState *env)
181181

182182
regs.rflags = env->eflags;
183183
regs.rip = env->eip;
184-
184+
185185
kvm_set_regs(kvm_context, 0, &regs);
186186

187187
memcpy(sregs.interrupt_bitmap, env->kvm_interrupt_bitmap, sizeof(sregs.interrupt_bitmap));

‎kvm/winkvm-qemu/vl.c

+19-12
Original file line numberDiff line numberDiff line change
@@ -5832,7 +5832,10 @@ static int fd_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int size)
58325832
ssize_t len;
58335833

58345834
again:
5835-
len = read(s->fd, buf + offset, size - offset);
5835+
/* len = read(s->fd, buf + offset, size - offset); */
5836+
/* this function is called by only migration.c */
5837+
/* So, this function is specialized with migration.c */
5838+
len = recv(s->fd, buf + offset, size - offset, 0);
58365839
if (len == -1) {
58375840
if (errno == EINTR || errno == EAGAIN)
58385841
goto again;
@@ -5899,8 +5902,8 @@ QEMUFile *qemu_fopen_compat(void *opaque, QEMUFilePutBufferFunc *put_buffer,
58995902
if (!f)
59005903
return NULL;
59015904

5902-
f->qemu_ff_compat = 1;
5903-
f->opaque = opaque;
5905+
f->qemu_ff_compat = 1;
5906+
f->opaque = opaque;
59045907
f->put_buffer = put_buffer;
59055908
f->get_buffer = get_buffer;
59065909
f->close = close;
@@ -5941,7 +5944,6 @@ static void qemu_fill_buffer(QEMUFile *f)
59415944
int len;
59425945

59435946
if (f->qemu_ff_compat) {
5944-
fprintf(stderr, "%s is called with qemu_ff_compat mode\n", __FUNCTION__);
59455947
if (!f->get_buffer)
59465948
return;
59475949

@@ -6290,6 +6292,7 @@ int qemu_live_savevm_state(QEMUFile *f)
62906292
return ret;
62916293
}
62926294

6295+
/* here is bugpoint */
62936296
int qemu_live_loadvm_state(QEMUFile *f)
62946297
{
62956298
SaveStateEntry *se;
@@ -6308,9 +6311,10 @@ int qemu_live_loadvm_state(QEMUFile *f)
63086311
}
63096312

63106313
for(;;) {
6311-
len = qemu_get_byte(f);
6312-
if (len == 0)
6313-
break;
6314+
len = qemu_get_byte(f);
6315+
if (len == 0)
6316+
break;
6317+
fprintf(stderr, "qemu_live_loadvm_state loop\n");
63146318
qemu_get_buffer(f, idstr, len);
63156319
idstr[len] = '\0';
63166320
instance_id = qemu_get_be32(f);
@@ -6897,6 +6901,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id)
68976901
qemu_get_betls(f, &env->kvm_interrupt_bitmap[i]);
68986902
}
68996903
qemu_get_be64s(f, &env->tsc);
6904+
fprintf(stderr, "kvm_load_regsiters() in %s\n", __FUNCTION__);
69006905
kvm_load_registers(env);
69016906
}
69026907
#endif
@@ -7980,8 +7985,10 @@ static int main_loop(void)
79807985
reset_requested = 0;
79817986
qemu_system_reset();
79827987
#ifdef USE_KVM
7983-
if (kvm_allowed)
7988+
if (kvm_allowed) {
7989+
fprintf(stderr, "kvm_load_registers() in %s\n", __FUNCTION__);
79847990
kvm_load_registers(env);
7991+
}
79857992
#endif
79867993
ret = EXCP_INTERRUPT;
79877994
}
@@ -8926,14 +8933,14 @@ int main(int argc, char **argv)
89268933
break;
89278934
#ifdef CONFIG_SLIRP
89288935
case QEMU_OPTION_tftp:
8929-
tftp_prefix = optarg;
8936+
tftp_prefix = optarg;
89308937
break;
89318938
case QEMU_OPTION_bootp:
89328939
bootp_filename = optarg;
89338940
break;
89348941
#ifndef _WIN32
89358942
case QEMU_OPTION_smb:
8936-
net_slirp_smb(optarg);
8943+
net_slirp_smb(optarg);
89378944
break;
89388945
#endif
89398946
case QEMU_OPTION_redir:
@@ -9228,8 +9235,8 @@ int main(int argc, char **argv)
92289235

92299236
#ifndef _WIN32
92309237
if (daemonize && !nographic && vnc_display == NULL) {
9231-
fprintf(stderr, "Can only daemonize if using -nographic or -vnc\n");
9232-
daemonize = 0;
9238+
fprintf(stderr, "Can only daemonize if using -nographic or -vnc\n");
9239+
daemonize = 0;
92339240
}
92349241

92359242
if (daemonize) {

‎vcproj/user/kvmctldll/kvmctl.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -605,9 +605,9 @@ int kvm_set_regs(kvm_context_t kvm, int vcpu, struct kvm_regs *regs)
605605
{
606606
BOOL ret;
607607
int fd = kvm->vcpu_fd[vcpu];
608-
unsigned long retlen;
608+
unsigned long retlen;
609609

610-
regs->vcpu_fd = fd;
610+
regs->vcpu_fd = fd;
611611
ret = DeviceIoControl(
612612
kvm->hnd,
613613
KVM_SET_REGS,
@@ -631,6 +631,8 @@ int kvm_get_sregs(kvm_context_t kvm, int vcpu, struct kvm_sregs *sregs)
631631
unsigned long retlen;
632632
int vcpu_fd = kvm->vcpu_fd[vcpu];
633633

634+
sregs->vcpu_fd = vcpu_fd;
635+
634636
ret = DeviceIoControl(
635637
kvm->hnd,
636638
KVM_GET_SREGS,
@@ -654,6 +656,8 @@ int kvm_set_sregs(kvm_context_t kvm, int vcpu, struct kvm_sregs *sregs)
654656
unsigned long retlen;
655657
int vcpu_fd = kvm->vcpu_fd[vcpu];
656658

659+
sregs->vcpu_fd = vcpu_fd;
660+
657661
ret = DeviceIoControl(
658662
kvm->hnd,
659663
KVM_SET_SREGS,

0 commit comments

Comments
 (0)
Please sign in to comment.