mirror of
https://github.com/dingusdev/dingusppc.git
synced 2026-04-20 18:17:02 +00:00
memctrlbase: Return entry instead of bool.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
DingusPPC - The Experimental PowerPC Macintosh emulator
|
||||
Copyright (C) 2018-23 divingkatae and maximum
|
||||
Copyright (C) 2018-25 divingkatae and maximum
|
||||
(theweirdo) spatium
|
||||
|
||||
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
|
||||
@@ -42,7 +42,7 @@ PCIBridgeBase::PCIBridgeBase(std::string name, PCIHeaderType hdr_type, int num_b
|
||||
this->pci_wr_bridge_control = [this](uint16_t val) { this->bridge_control = val; };
|
||||
};
|
||||
|
||||
bool PCIBridgeBase::pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj)
|
||||
AddressMapEntry* PCIBridgeBase::pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj)
|
||||
{
|
||||
// FIXME: constrain region to memory range
|
||||
return this->host_instance->pci_register_mmio_region(start_addr, size, obj);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
DingusPPC - The Experimental PowerPC Macintosh emulator
|
||||
Copyright (C) 2018-23 divingkatae and maximum
|
||||
Copyright (C) 2018-25 divingkatae and maximum
|
||||
(theweirdo) spatium
|
||||
|
||||
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
|
||||
@@ -43,14 +43,14 @@ public:
|
||||
~PCIBridgeBase() = default;
|
||||
|
||||
// PCIHost methods
|
||||
virtual bool pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj);
|
||||
virtual bool pci_unregister_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj);
|
||||
virtual AddressMapEntry* pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj) override;
|
||||
virtual bool pci_unregister_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj) override;
|
||||
|
||||
// PCIBase methods
|
||||
virtual uint32_t pci_cfg_read(uint32_t reg_offs, AccessDetails &details);
|
||||
virtual void pci_cfg_write(uint32_t reg_offs, uint32_t value, AccessDetails &details);
|
||||
virtual uint32_t pci_cfg_read(uint32_t reg_offs, AccessDetails &details) override;
|
||||
virtual void pci_cfg_write(uint32_t reg_offs, uint32_t value, AccessDetails &details) override;
|
||||
|
||||
bool supports_io_space() {
|
||||
bool supports_io_space() override {
|
||||
return true;
|
||||
};
|
||||
|
||||
@@ -69,7 +69,7 @@ public:
|
||||
std::function<void(uint16_t)> pci_wr_bridge_control;
|
||||
|
||||
// HWComponent methods
|
||||
virtual int device_postinit();
|
||||
virtual int device_postinit() override;
|
||||
|
||||
protected:
|
||||
// PCI configuration space state
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
DingusPPC - The Experimental PowerPC Macintosh emulator
|
||||
Copyright (C) 2018-24 divingkatae and maximum
|
||||
Copyright (C) 2018-25 divingkatae and maximum
|
||||
(theweirdo) spatium
|
||||
|
||||
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
|
||||
@@ -23,7 +23,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#include <devices/common/pci/pcibridge.h>
|
||||
#include <devices/common/pci/pcihost.h>
|
||||
#include <devices/deviceregistry.h>
|
||||
#include <devices/memctrl/memctrlbase.h>
|
||||
#include <machines/machinefactory.h>
|
||||
#include <machines/machinebase.h>
|
||||
#include <endianswap.h>
|
||||
@@ -90,7 +89,7 @@ void PCIHost::pci_unregister_device(int dev_fun_num)
|
||||
gMachineObj->remove_device(dev_instance); // calls destructor of dev_instance since it is a unique_ptr in the device_map.
|
||||
}
|
||||
|
||||
bool PCIHost::pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj)
|
||||
AddressMapEntry* PCIHost::pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj)
|
||||
{
|
||||
MemCtrlBase *mem_ctrl = dynamic_cast<MemCtrlBase *>
|
||||
(gMachineObj->get_comp_by_type(HWCompType::MEM_CTRL));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
DingusPPC - The Experimental PowerPC Macintosh emulator
|
||||
Copyright (C) 2018-24 divingkatae and maximum
|
||||
Copyright (C) 2018-25 divingkatae and maximum
|
||||
(theweirdo) spatium
|
||||
|
||||
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
|
||||
@@ -24,6 +24,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
#include <core/bitops.h>
|
||||
#include <devices/common/hwinterrupt.h>
|
||||
#include <devices/memctrl/memctrlbase.h>
|
||||
#include <endianswap.h>
|
||||
|
||||
#include <cinttypes>
|
||||
@@ -70,8 +71,8 @@ public:
|
||||
virtual bool pci_register_device(int dev_fun_num, PCIBase* dev_instance);
|
||||
virtual void pci_unregister_device(int dev_fun_num);
|
||||
|
||||
virtual bool pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj);
|
||||
virtual bool pci_unregister_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj);
|
||||
virtual AddressMapEntry* pci_register_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj);
|
||||
virtual bool pci_unregister_mmio_region(uint32_t start_addr, uint32_t size, PCIBase* obj);
|
||||
|
||||
virtual void attach_pci_device(const std::string& dev_name, int slot_id);
|
||||
PCIBase *attach_pci_device(const std::string& dev_name, int slot_id,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
DingusPPC - The Experimental PowerPC Macintosh emulator
|
||||
Copyright (C) 2018-24 divingkatae and maximum
|
||||
Copyright (C) 2018-25 divingkatae and maximum
|
||||
(theweirdo) spatium
|
||||
|
||||
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
|
||||
@@ -188,7 +188,7 @@ bool MemCtrlBase::is_range_free(uint32_t addr, uint32_t size) {
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_mem_region(uint32_t start_addr, uint32_t size,
|
||||
AddressMapEntry* MemCtrlBase::add_mem_region(uint32_t start_addr, uint32_t size,
|
||||
uint32_t dest_addr, uint32_t type,
|
||||
uint8_t init_val = 0)
|
||||
{
|
||||
@@ -196,7 +196,7 @@ bool MemCtrlBase::add_mem_region(uint32_t start_addr, uint32_t size,
|
||||
|
||||
// bail out if a memory region for the given range already exists
|
||||
if (!is_range_free(start_addr, size))
|
||||
return false;
|
||||
return nullptr;
|
||||
|
||||
uint8_t* reg_content = new uint8_t[size](); // allocate and clear to zero
|
||||
|
||||
@@ -233,27 +233,27 @@ bool MemCtrlBase::add_mem_region(uint32_t start_addr, uint32_t size,
|
||||
dest_addr
|
||||
);
|
||||
|
||||
return true;
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_rom_region(uint32_t start_addr, uint32_t size) {
|
||||
AddressMapEntry* MemCtrlBase::add_rom_region(uint32_t start_addr, uint32_t size) {
|
||||
return add_mem_region(start_addr, size, 0, RT_ROM);
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_ram_region(uint32_t start_addr, uint32_t size) {
|
||||
AddressMapEntry* MemCtrlBase::add_ram_region(uint32_t start_addr, uint32_t size) {
|
||||
return add_mem_region(start_addr, size, 0, RT_RAM);
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_mem_mirror_common(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset, uint32_t size) {
|
||||
AddressMapEntry* MemCtrlBase::add_mem_mirror_common(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset, uint32_t size) {
|
||||
AddressMapEntry *entry, *ref_entry;
|
||||
|
||||
ref_entry = find_range(dest_addr);
|
||||
if (!ref_entry)
|
||||
return false;
|
||||
return nullptr;
|
||||
|
||||
// use origin's size if no size was specified
|
||||
if (!size)
|
||||
@@ -262,7 +262,7 @@ bool MemCtrlBase::add_mem_mirror_common(uint32_t start_addr, uint32_t dest_addr,
|
||||
if (ref_entry->start + offset + size - 1 > ref_entry->end) {
|
||||
LOG_F(ERROR, "Partial mirror outside the origin, offset=0x%X, size=0x%X",
|
||||
offset, size);
|
||||
return false;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
entry = new AddressMapEntry;
|
||||
@@ -291,45 +291,45 @@ bool MemCtrlBase::add_mem_mirror_common(uint32_t start_addr, uint32_t dest_addr,
|
||||
: ""
|
||||
);
|
||||
|
||||
return true;
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_mem_mirror(uint32_t start_addr, uint32_t dest_addr) {
|
||||
AddressMapEntry* MemCtrlBase::add_mem_mirror(uint32_t start_addr, uint32_t dest_addr) {
|
||||
return this->add_mem_mirror_common(start_addr, dest_addr);
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_mem_mirror_partial(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset, uint32_t size) {
|
||||
AddressMapEntry* MemCtrlBase::add_mem_mirror_partial(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset, uint32_t size) {
|
||||
return this->add_mem_mirror_common(start_addr, dest_addr, offset, size);
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::set_data(uint32_t load_addr, const uint8_t* data, uint32_t size) {
|
||||
AddressMapEntry* MemCtrlBase::set_data(uint32_t load_addr, const uint8_t* data, uint32_t size) {
|
||||
AddressMapEntry* ref_entry;
|
||||
uint32_t cpy_size;
|
||||
|
||||
ref_entry = find_range(load_addr);
|
||||
if (!ref_entry)
|
||||
return false;
|
||||
return nullptr;
|
||||
|
||||
uint32_t load_offset = load_addr - ref_entry->start;
|
||||
|
||||
cpy_size = std::min(ref_entry->end - ref_entry->start + 1, size);
|
||||
memcpy(ref_entry->mem_ptr + load_offset, data, cpy_size);
|
||||
|
||||
return true;
|
||||
return ref_entry;
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice* dev_instance)
|
||||
AddressMapEntry* MemCtrlBase::add_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice* dev_instance)
|
||||
{
|
||||
AddressMapEntry *entry;
|
||||
|
||||
// bail out if a memory region for the given range already exists
|
||||
if (!is_range_free(start_addr, size))
|
||||
return false;
|
||||
return nullptr;
|
||||
|
||||
entry = new AddressMapEntry;
|
||||
|
||||
@@ -351,9 +351,10 @@ bool MemCtrlBase::add_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice
|
||||
: ""
|
||||
);
|
||||
|
||||
return true;
|
||||
return entry;
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::remove_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice* dev_instance)
|
||||
{
|
||||
int found = 0;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
DingusPPC - The Experimental PowerPC Macintosh emulator
|
||||
Copyright (C) 2018-24 divingkatae and maximum
|
||||
Copyright (C) 2018-25 divingkatae and maximum
|
||||
(theweirdo) spatium
|
||||
|
||||
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
|
||||
@@ -64,18 +64,18 @@ class MemCtrlBase {
|
||||
public:
|
||||
MemCtrlBase() = default;
|
||||
virtual ~MemCtrlBase();
|
||||
virtual bool add_rom_region(uint32_t start_addr, uint32_t size);
|
||||
virtual bool add_ram_region(uint32_t start_addr, uint32_t size);
|
||||
virtual bool add_mem_mirror(uint32_t start_addr, uint32_t dest_addr);
|
||||
virtual bool add_mem_mirror_partial(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset, uint32_t size);
|
||||
virtual AddressMapEntry* add_rom_region(uint32_t start_addr, uint32_t size);
|
||||
virtual AddressMapEntry* add_ram_region(uint32_t start_addr, uint32_t size);
|
||||
virtual AddressMapEntry* add_mem_mirror(uint32_t start_addr, uint32_t dest_addr);
|
||||
virtual AddressMapEntry* add_mem_mirror_partial(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset, uint32_t size);
|
||||
|
||||
virtual bool add_mmio_region(uint32_t start_addr, uint32_t size,
|
||||
MMIODevice* dev_instance);
|
||||
virtual AddressMapEntry* add_mmio_region(uint32_t start_addr, uint32_t size,
|
||||
MMIODevice* dev_instance);
|
||||
virtual bool remove_mmio_region(uint32_t start_addr, uint32_t size,
|
||||
MMIODevice* dev_instance);
|
||||
|
||||
virtual bool set_data(uint32_t reg_addr, const uint8_t* data, uint32_t size);
|
||||
virtual AddressMapEntry* set_data(uint32_t reg_addr, const uint8_t* data, uint32_t size);
|
||||
|
||||
AddressMapEntry* find_range(uint32_t addr);
|
||||
AddressMapEntry* find_range_exact(uint32_t addr, uint32_t size,
|
||||
@@ -91,13 +91,13 @@ public:
|
||||
void dump_regions();
|
||||
|
||||
protected:
|
||||
bool add_mem_region(
|
||||
AddressMapEntry* add_mem_region(
|
||||
uint32_t start_addr, uint32_t size, uint32_t dest_addr, uint32_t type,
|
||||
uint8_t init_val
|
||||
);
|
||||
|
||||
bool add_mem_mirror_common(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset=0, uint32_t size=0);
|
||||
AddressMapEntry* add_mem_mirror_common(uint32_t start_addr, uint32_t dest_addr,
|
||||
uint32_t offset=0, uint32_t size=0);
|
||||
|
||||
private:
|
||||
std::vector<uint8_t*> mem_regions;
|
||||
|
||||
Reference in New Issue
Block a user