From: Pekka Enberg Date: Sat, 31 Jul 2010 12:52:43 +0000 (+0300) Subject: kvm: Initial PCI probe emulation X-Git-Tag: next-20110824~3^2~528^2~75 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=090aeecfeed7c330819d74a1b2c1ffe77fe71e4e;p=karo-tx-linux.git 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 --- 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); +}