Commit 20715a22 authored by Sasha Levin's avatar Sasha Levin Committed by Will Deacon
Browse files

kvm tools: Fixes for serial module



Fixes include:
 - Error handling
 - Cleanup
 - Standard init/uninit

Signed-off-by: default avatarSasha Levin <levinsasha928@gmail.com>
parent ea6eeb1c
......@@ -1115,7 +1115,11 @@ static int kvm_cmd_run_init(int argc, const char **argv)
rtc__init();
serial8250__init(kvm);
r = serial8250__init(kvm);
if (r < 0) {
pr_err("serial__init() failed with error %d\n", r);
goto fail;
}
if (active_console == CONSOLE_VIRTIO)
virtio_console__init(kvm);
......@@ -1224,6 +1228,7 @@ static int kvm_cmd_run_work(void)
r = 0;
kvm_cpu__delete(kvm_cpus[0]);
kvm_cpus[0] = NULL;
for (i = 1; i < nrcpus; i++) {
if (kvm_cpus[i]->is_running) {
......@@ -1261,6 +1266,10 @@ static void kvm_cmd_run_exit(int guest_ret)
disk_image__close_all(kvm->disks, image_count);
free(kvm_cpus);
r = serial8250__exit(kvm);
if (r < 0)
pr_warning("serial8250__exit() failed with error %d\n", r);
r = ioport__exit(kvm);
if (r < 0)
pr_warning("ioport__exit() failed with error %d\n", r);
......
......@@ -396,19 +396,52 @@ static struct ioport_operations serial8250_ops = {
.io_out = serial8250_out,
};
static void serial8250__device_init(struct kvm *kvm, struct serial8250_device *dev)
static int serial8250__device_init(struct kvm *kvm, struct serial8250_device *dev)
{
ioport__register(dev->iobase, &serial8250_ops, 8, NULL);
int r;
r = ioport__register(dev->iobase, &serial8250_ops, 8, NULL);
kvm__irq_line(kvm, dev->irq, 0);
return r;
}
void serial8250__init(struct kvm *kvm)
int serial8250__init(struct kvm *kvm)
{
unsigned int i, j;
int r = 0;
for (i = 0; i < ARRAY_SIZE(devices); i++) {
struct serial8250_device *dev = &devices[i];
r = serial8250__device_init(kvm, dev);
if (r < 0)
goto cleanup;
}
return r;
cleanup:
for (j = 0; j <= i; j++) {
struct serial8250_device *dev = &devices[j];
ioport__unregister(dev->iobase);
}
return r;
}
int serial8250__exit(struct kvm *kvm)
{
unsigned int i;
int r;
for (i = 0; i < ARRAY_SIZE(devices); i++) {
struct serial8250_device *dev = &devices[i];
serial8250__device_init(kvm, dev);
r = ioport__unregister(dev->iobase);
if (r < 0)
return r;
}
return 0;
}
......@@ -3,7 +3,8 @@
struct kvm;
void serial8250__init(struct kvm *kvm);
int serial8250__init(struct kvm *kvm);
int serial8250__exit(struct kvm *kvm);
void serial8250__update_consoles(struct kvm *kvm);
void serial8250__inject_sysrq(struct kvm *kvm);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment