From 090aeecfeed7c330819d74a1b2c1ffe77fe71e4e Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Sat, 31 Jul 2010 15:52:43 +0300 Subject: [PATCH] kvm: Initial PCI probe emulation This patch adds simple PCI Configuration Mechanism 1 probing emulation. It doesn't expose any actual PCI devices yet. Signed-off-by: Pekka Enberg --- tools/kvm/Makefile | 1 + tools/kvm/include/kvm/pci.h | 6 +++++ tools/kvm/main.c | 2 ++ tools/kvm/pci.c | 51 +++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 tools/kvm/include/kvm/pci.h create mode 100644 tools/kvm/pci.c diff --git a/tools/kvm/Makefile b/tools/kvm/Makefile index ae5589e52c6c..67193b32578a 100644 --- a/tools/kvm/Makefile +++ b/tools/kvm/Makefile @@ -16,6 +16,7 @@ OBJS += ioport.o OBJS += kvm.o OBJS += main.o OBJS += mmio.o +OBJS += pci.o OBJS += util.o DEPS := $(patsubst %.o,%.d,$(OBJS)) diff --git a/tools/kvm/include/kvm/pci.h b/tools/kvm/include/kvm/pci.h new file mode 100644 index 000000000000..6f0c05a3c722 --- /dev/null +++ b/tools/kvm/include/kvm/pci.h @@ -0,0 +1,6 @@ +#ifndef KVM__PCI_H +#define KVM__PCI_H + +void pci__init(void); + +#endif /* KVM__PCI_H */ diff --git a/tools/kvm/main.c b/tools/kvm/main.c index 295f65dd115f..d55194a96811 100644 --- a/tools/kvm/main.c +++ b/tools/kvm/main.c @@ -2,6 +2,7 @@ #include "kvm/early_printk.h" #include "kvm/util.h" +#include "kvm/pci.h" #include #include @@ -110,6 +111,7 @@ int main(int argc, char *argv[]) kvm__enable_singlestep(kvm); early_printk__init(); + pci__init(); for (;;) { kvm__run(kvm); diff --git a/tools/kvm/pci.c b/tools/kvm/pci.c new file mode 100644 index 000000000000..2c49df9a21b3 --- /dev/null +++ b/tools/kvm/pci.c @@ -0,0 +1,51 @@ +#include "kvm/pci.h" + +#include "kvm/ioport.h" + +#include + +static uint32_t pci_cse; /* PCI configuration space enable */ + +static bool pci_cse_out(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) +{ + uint32_t *p = data; + + pci_cse = *p; + + return true; +} + +static bool pci_cse_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) +{ + uint32_t *p = data; + + *p = pci_cse; + + return true; +} + +static struct ioport_operations pci_cse_ops = { + .io_in = pci_cse_in, + .io_out = pci_cse_out, +}; + +static bool pci_mechanism_out(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) +{ + return true; +} + +static bool pci_mechanism_in(struct kvm *self, uint16_t port, void *data, int size, uint32_t count) +{ + return true; +} + +static struct ioport_operations pci_mechanism_ops = { + .io_in = pci_mechanism_in, + .io_out = pci_mechanism_out, +}; + +void pci__init(void) +{ + ioport__register(0xcfb, &pci_mechanism_ops); + ioport__register(0xcf8, &pci_cse_ops); +} -- 2.39.5