#include <palacios/vmm.h>
#include <devices/i440fx.h>
+#include <devices/pci.h>
struct i440_state {
- int foo;
+ struct vm_device * pci;
};
}
-static int i440_init(struct vm_device * dev) {
- // struct i440_state * state = (struct i440_state *)(dev->private_data);
-
-
- v3_dev_hook_io(dev, 0x00b2,
- &io_read, &io_write);
- v3_dev_hook_io(dev, 0x00b3,
- &io_read, &io_write);
+static int i440_init(struct vm_device * dev) {
+ struct i440_state * state = (struct i440_state *)(dev->private_data);
+ struct pci_device * pci_dev = NULL;
+ struct v3_pci_bar bars[6];
+ int i;
- v3_dev_hook_io(dev, 0x0cf8,
- &io_read, &io_write);
+ for (i = 0; i < 4; i++) {
+ v3_dev_hook_io(dev, 0x0cf8 + i,
+ &io_read, &io_write);
+ v3_dev_hook_io(dev, 0x0cfc + i,
+ &io_read, &io_write);
+ }
+ for (i = 0; i < 6; i++) {
+ bars[i].type = PCI_BAR_NONE;
+ }
+ pci_dev = v3_pci_register_device(state->pci, PCI_STD_DEVICE, 0, 0, 0, "i440FX", bars,
+ NULL, NULL, NULL, dev);
- v3_dev_hook_io(dev, 0x0cf9,
- &io_read, &io_write);
+ if (!pci_dev) {
+ return -1;
+ }
+ pci_dev->config_header.vendor_id = 0x8086;
+ pci_dev->config_header.device_id = 0x1237;
+ pci_dev->config_header.revision = 0x02;
+ pci_dev->config_header.subclass = 0x00; // SubClass: host2pci
+ pci_dev->config_header.class = 0x06; // Class: PCI bridge
+ pci_dev->config_space[0x72] = 0x02; // SMRAM (?)
return 0;
}
struct vm_device * v3_create_i440fx(struct vm_device * pci) {
-
struct i440_state * state = NULL;
-
state = (struct i440_state *)V3_Malloc(sizeof(struct i440_state));
+
+ state->pci = pci;
struct vm_device * i440_dev = v3_create_device("i440FX", &dev_ops, state);
return i440_dev;
-
}