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 <penberg@cs.helsinki.fi>
This commit is contained in:
Pekka Enberg
2015-06-01 16:39:40 +01:00
committed by Will Deacon
parent 46365b263c
commit 60742802dc
4 changed files with 60 additions and 0 deletions
+1
View File
@@ -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))
+6
View File
@@ -0,0 +1,6 @@
#ifndef KVM__PCI_H
#define KVM__PCI_H
void pci__init(void);
#endif /* KVM__PCI_H */
+2
View File
@@ -2,6 +2,7 @@
#include "kvm/early_printk.h"
#include "kvm/util.h"
#include "kvm/pci.h"
#include <inttypes.h>
#include <signal.h>
@@ -110,6 +111,7 @@ int main(int argc, char *argv[])
kvm__enable_singlestep(kvm);
early_printk__init();
pci__init();
for (;;) {
kvm__run(kvm);
+51
View File
@@ -0,0 +1,51 @@
#include "kvm/pci.h"
#include "kvm/ioport.h"
#include <stdint.h>
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);
}