aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@arm.com>2021-03-15 15:33:36 +0000
committerWill Deacon <will@kernel.org>2021-03-18 09:44:45 +0000
commit82304999f9366cdf54f809a91d13f532ed4213a7 (patch)
tree13b74ffff022e17f1348549d0b1602ea9c61d0ff
parentd24bedb1cc9aa2754f6284567f8521e659f7665b (diff)
downloadkvmtool-82304999f9366cdf54f809a91d13f532ed4213a7.tar.gz
x86/ioport: Refactor trap handlers
With the planned retirement of the special ioport emulation code, we need to provide emulation functions compatible with the MMIO prototype. Adjust the trap handlers 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-9-andre.przywara@arm.com Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r--x86/ioport.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/x86/ioport.c b/x86/ioport.c
index a8d2bb1a..b198de7a 100644
--- a/x86/ioport.c
+++ b/x86/ioport.c
@@ -3,8 +3,14 @@
#include <stdlib.h>
#include <stdio.h>
+static void dummy_io(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len,
+ u8 is_write, void *ptr)
+{
+}
+
static bool debug_io_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
{
+ dummy_io(vcpu, port, data, size, true, NULL);
return 0;
}
@@ -12,15 +18,23 @@ static struct ioport_operations debug_ops = {
.io_out = debug_io_out,
};
-static bool seabios_debug_io_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
+static void seabios_debug_io(struct kvm_cpu *vcpu, u64 addr, u8 *data,
+ u32 len, u8 is_write, void *ptr)
{
char ch;
+ if (!is_write)
+ return;
+
ch = ioport__read8(data);
putchar(ch);
+}
- return true;
+static bool seabios_debug_io_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
+{
+ seabios_debug_io(vcpu, port, data, size, true, NULL);
+ return 0;
}
static struct ioport_operations seabios_debug_ops = {
@@ -29,11 +43,13 @@ static struct ioport_operations seabios_debug_ops = {
static bool dummy_io_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
{
+ dummy_io(vcpu, port, data, size, false, NULL);
return true;
}
static bool dummy_io_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
{
+ dummy_io(vcpu, port, data, size, true, NULL);
return true;
}
@@ -50,13 +66,19 @@ static struct ioport_operations dummy_write_only_ioport_ops = {
* The "fast A20 gate"
*/
-static bool ps2_control_a_io_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
+static void ps2_control_io(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len,
+ u8 is_write, void *ptr)
{
/*
* A20 is always enabled.
*/
- ioport__write8(data, 0x02);
+ if (!is_write)
+ ioport__write8(data, 0x02);
+}
+static bool ps2_control_a_io_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size)
+{
+ ps2_control_io(vcpu, port, data, size, false, NULL);
return true;
}