diff --git a/devices/common/pci/pcihost.cpp b/devices/common/pci/pcihost.cpp
index 4304d7a..51dacf1 100644
--- a/devices/common/pci/pcihost.cpp
+++ b/devices/common/pci/pcihost.cpp
@@ -1,7 +1,30 @@
+/*
+DingusPPC - The Experimental PowerPC Macintosh emulator
+Copyright (C) 2018-22 divingkatae and maximum
+ (theweirdo) spatium
+
+(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+*/
+
+#include
#include
#include
#include
#include
+#include
#include
@@ -29,3 +52,26 @@ bool PCIHost::pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIDe
// FIXME: add sanity checks!
return mem_ctrl->add_mmio_region(start_addr, size, obj);
}
+
+void PCIHost::attach_pci_device(std::string& dev_name, int slot_id)
+{
+ if (!DeviceRegistry::device_registered(dev_name)) {
+ LOG_F(WARNING, "PCIHost: specified PCI device %s doesn't exist", dev_name.c_str());
+ return;
+ }
+
+ // attempt to create device object
+ auto dev_obj = DeviceRegistry::get_descriptor(dev_name).m_create_func();
+
+ if (!dev_obj->supports_type(HWCompType::PCI_DEV)) {
+ LOG_F(WARNING, "PCIHost: cannot attach non-PCI device %s", dev_name.c_str());
+ return;
+ }
+
+ // add device to the machine object
+ gMachineObj->add_device(dev_name, std::move(dev_obj));
+
+ // register device with the PCI host
+ this->pci_register_device(
+ slot_id, dynamic_cast(gMachineObj->get_comp_by_name(dev_name)));
+}
diff --git a/devices/common/pci/pcihost.h b/devices/common/pci/pcihost.h
index 95ef0da..d21c27e 100644
--- a/devices/common/pci/pcihost.h
+++ b/devices/common/pci/pcihost.h
@@ -1,6 +1,6 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
-Copyright (C) 2018-21 divingkatae and maximum
+Copyright (C) 2018-22 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
@@ -22,7 +22,10 @@ along with this program. If not, see .
#ifndef PCI_HOST_H
#define PCI_HOST_H
+#include
+
#include
+#include
#include
#include
@@ -40,6 +43,8 @@ public:
virtual bool pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIDevice* obj);
+ virtual void attach_pci_device(std::string& dev_name, int slot_id);
+
protected:
std::unordered_map dev_map;
std::vector io_space_devs;