diff --git a/Makefile b/Makefile index ae5589e..67193b3 100644 --- a/Makefile +++ b/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/include/kvm/pci.h b/include/kvm/pci.h new file mode 100644 index 0000000..6f0c05a --- /dev/null +++ b/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/main.c b/main.c index 295f65d..d55194a 100644 --- a/main.c +++ b/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/pci.c b/pci.c new file mode 100644 index 0000000..2c49df9 --- /dev/null +++ b/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); +}