aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@arm.com>2021-03-15 15:33:34 +0000
committerWill Deacon <will@kernel.org>2021-03-18 09:44:45 +0000
commitf7ef3dc0cd28ec6d3209202141e62e308aed9461 (patch)
tree6fbccb8508137cb307a7ee89cd9c4a5019754ada
parentfc7696277b298d30b44fd4559baf60d6cf1411e2 (diff)
downloadkvmtool-f7ef3dc0cd28ec6d3209202141e62e308aed9461.tar.gz
hw/i8042: Refactor trap handler
With the planned retirement of the special ioport emulation code, we need to provide an emulation function compatible with the MMIO prototype. Adjust the trap handler to use that new function, and provide shims to implement the old ioport interface, for now. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Reviewed-by: Alexandru Elisei <alexandru.elisei@arm.com> Link: https://lore.kernel.org/r/20210315153350.19988-7-andre.przywara@arm.com Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r--hw/i8042.c68
1 files changed, 34 insertions, 34 deletions
diff --git a/hw/i8042.c b/hw/i8042.c
index 7d1f9772..ab866662 100644
--- a/hw/i8042.c
+++ b/hw/i8042.c
@@ -292,52 +292,52 @@ static void kbd_reset(void)
};
}
-/*
- * Called when the OS has written to one of the keyboard's ports (0x60 or 0x64)
- */
-static bool kbd_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
+static void kbd_io(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len,
+ u8 is_write, void *ptr)
{
- switch (port) {
- case I8042_COMMAND_REG: {
- u8 value = kbd_read_status();
- ioport__write8(data, value);
+ u8 value;
+
+ if (is_write)
+ value = ioport__read8(data);
+
+ switch (addr) {
+ case I8042_COMMAND_REG:
+ if (is_write)
+ kbd_write_command(vcpu->kvm, value);
+ else
+ value = kbd_read_status();
break;
- }
- case I8042_DATA_REG: {
- u8 value = kbd_read_data();
- ioport__write8(data, value);
+ case I8042_DATA_REG:
+ if (is_write)
+ kbd_write_data(value);
+ else
+ value = kbd_read_data();
break;
- }
- case I8042_PORT_B_REG: {
- ioport__write8(data, 0x20);
+ case I8042_PORT_B_REG:
+ if (!is_write)
+ value = 0x20;
break;
- }
default:
- return false;
+ return;
}
+ if (!is_write)
+ ioport__write8(data, value);
+}
+
+/*
+ * Called when the OS has written to one of the keyboard's ports (0x60 or 0x64)
+ */
+static bool kbd_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
+{
+ kbd_io(vcpu, port, data, size, false, NULL);
+
return true;
}
static bool kbd_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
{
- switch (port) {
- case I8042_COMMAND_REG: {
- u8 value = ioport__read8(data);
- kbd_write_command(vcpu->kvm, value);
- break;
- }
- case I8042_DATA_REG: {
- u8 value = ioport__read8(data);
- kbd_write_data(value);
- break;
- }
- case I8042_PORT_B_REG: {
- break;
- }
- default:
- return false;
- }
+ kbd_io(vcpu, port, data, size, true, NULL);
return true;
}