Fixes include: - Error handling - Cleanup - Standard init/uninit Signed-off-by: Sasha Levin <levinsasha...@gmail.com> --- tools/kvm/builtin-run.c | 10 +++++++++- tools/kvm/hw/rtc.c | 27 +++++++++++++++++++++++---- tools/kvm/include/kvm/rtc.h | 5 ++++- 3 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/tools/kvm/builtin-run.c b/tools/kvm/builtin-run.c index 0b94ef0..5b198e0 100644 --- a/tools/kvm/builtin-run.c +++ b/tools/kvm/builtin-run.c @@ -1076,7 +1076,11 @@ static int kvm_cmd_run_init(int argc, const char **argv) ioport__setup_arch(); - rtc__init(); + r = rtc__init(kvm); + if (r < 0) { + pr_error("rtc__init() failed with error %d\n", r); + goto fail; + } r = serial8250__init(kvm); if (r < 0) { @@ -1244,6 +1248,10 @@ static void kvm_cmd_run_uninit(int guest_ret) if (r < 0) pr_warning("serial8250__uninit() failed with error %d\n", r); + r = rtc__uninit(kvm); + if (r < 0) + pr_warning("rtc__uninit() failed with error %d\n", r); + r = kvm__arch_free_firmware(kvm); if (r < 0) pr_warning("kvm__arch_free_firmware() failed with error %d\n", r); diff --git a/tools/kvm/hw/rtc.c b/tools/kvm/hw/rtc.c index 6d4a05a..affc5ee 100644 --- a/tools/kvm/hw/rtc.c +++ b/tools/kvm/hw/rtc.c @@ -100,7 +100,6 @@ static bool cmos_ram_index_out(struct ioport *ioport, struct kvm *kvm, u16 port, u8 value = ioport__read8(data); kvm->nmi_disabled = value & (1UL << 7); - rtc.cmos_idx = value & ~(1UL << 7); return true; @@ -110,9 +109,29 @@ static struct ioport_operations cmos_ram_index_ioport_ops = { .io_out = cmos_ram_index_out, }; -void rtc__init(void) +int rtc__init(struct kvm *kvm) { + int r = 0; + /* PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK) */ - ioport__register(0x0070, &cmos_ram_index_ioport_ops, 1, NULL); - ioport__register(0x0071, &cmos_ram_data_ioport_ops, 1, NULL); + r = ioport__register(0x0070, &cmos_ram_index_ioport_ops, 1, NULL); + if (r < 0) + return r; + + r = ioport__register(0x0071, &cmos_ram_data_ioport_ops, 1, NULL); + if (r < 0) { + ioport__unregister(0x0071); + return r; + } + + return r; } + +int rtc__uninit(struct kvm *kvm) +{ + /* PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK) */ + ioport__unregister(0x0070); + ioport__unregister(0x0071); + + return 0; +} \ No newline at end of file diff --git a/tools/kvm/include/kvm/rtc.h b/tools/kvm/include/kvm/rtc.h index 0b8d9f9..a13db59a 100644 --- a/tools/kvm/include/kvm/rtc.h +++ b/tools/kvm/include/kvm/rtc.h @@ -1,6 +1,9 @@ #ifndef KVM__RTC_H #define KVM__RTC_H -void rtc__init(void); +struct kvm; + +int rtc__init(struct kvm *kvm); +int rtc__uninit(struct kvm *kvm); #endif /* KVM__RTC_H */ -- 1.7.8 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html