mirror of
https://github.com/dingusdev/dingusppc.git
synced 2025-02-23 05:29:26 +00:00
Improve previous (cosmetics & code duplication).
This commit is contained in:
parent
e510c11be2
commit
8d01440558
@ -27,6 +27,13 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#include <vector>
|
||||
#include <loguru.hpp>
|
||||
|
||||
static inline bool match_mem_entry(const AddressMapEntry* entry,
|
||||
const uint32_t start, const uint32_t end,
|
||||
MMIODevice* dev_instance)
|
||||
{
|
||||
return start == entry->start && end == entry->end &&
|
||||
(!dev_instance || dev_instance == entry->devobj);
|
||||
}
|
||||
|
||||
MemCtrlBase::~MemCtrlBase() {
|
||||
for (auto& entry : address_map) {
|
||||
@ -53,11 +60,13 @@ AddressMapEntry* MemCtrlBase::find_range(uint32_t addr) {
|
||||
}
|
||||
|
||||
|
||||
AddressMapEntry* MemCtrlBase::find_range_exact(uint32_t addr, uint32_t size, MMIODevice* dev_instance) {
|
||||
AddressMapEntry* MemCtrlBase::find_range_exact(uint32_t addr, uint32_t size,
|
||||
MMIODevice* dev_instance)
|
||||
{
|
||||
if (size) {
|
||||
uint32_t end = addr + size - 1;
|
||||
const uint32_t end = addr + size - 1;
|
||||
for (auto& entry : address_map) {
|
||||
if (addr == entry->start && end == entry->end && (!dev_instance || dev_instance == entry->devobj) )
|
||||
if (match_mem_entry(entry, addr, end, dev_instance))
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
@ -98,15 +107,33 @@ bool MemCtrlBase::is_range_free(uint32_t addr, uint32_t size) {
|
||||
uint32_t end = addr + size - 1;
|
||||
for (auto& entry : address_map) {
|
||||
if (addr == entry->start && end == entry->end) {
|
||||
LOG_F(WARNING, "memory region 0x%X..0x%X%s%s%s already exists", addr, end, entry->devobj ? " (" : "", entry->devobj ? entry->devobj->get_name().c_str() : "", entry->devobj ? ")" : "");
|
||||
LOG_F(WARNING, "memory region 0x%X..0x%X%s%s%s already exists",
|
||||
addr, end,
|
||||
entry->devobj ? " (" : "",
|
||||
entry->devobj ? entry->devobj->get_name().c_str() : "",
|
||||
entry->devobj ? ")"
|
||||
: ""
|
||||
);
|
||||
result = false;
|
||||
}
|
||||
else if (addr >= entry->start && end <= entry->end) {
|
||||
LOG_F(WARNING, "0x%X..0x%X already exists in memory region 0x%X..0x%X%s%s%s", addr, end, entry->start, entry->end, entry->devobj ? " (" : "", entry->devobj ? entry->devobj->get_name().c_str() : "", entry->devobj ? ")" : "");
|
||||
LOG_F(WARNING, "0x%X..0x%X already exists in memory region 0x%X..0x%X%s%s%s",
|
||||
addr, end, entry->start, entry->end,
|
||||
entry->devobj ? " (" : "",
|
||||
entry->devobj ? entry->devobj->get_name().c_str() : "",
|
||||
entry->devobj ? ")"
|
||||
: ""
|
||||
);
|
||||
result = false;
|
||||
}
|
||||
else if (end >= entry->start && addr <= entry->end) {
|
||||
LOG_F(ERROR, "0x%X..0x%X overlaps existing memory region 0x%X..0x%X%s%s%s", addr, end, entry->start, entry->end, entry->devobj ? " (" : "", entry->devobj ? entry->devobj->get_name().c_str() : "", entry->devobj ? ")" : "");
|
||||
LOG_F(ERROR, "0x%X..0x%X overlaps existing memory region 0x%X..0x%X%s%s%s",
|
||||
addr, end, entry->start, entry->end,
|
||||
entry->devobj ? " (" : "",
|
||||
entry->devobj ? entry->devobj->get_name().c_str() : "",
|
||||
entry->devobj ? ")"
|
||||
: ""
|
||||
);
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
@ -115,8 +142,10 @@ bool MemCtrlBase::is_range_free(uint32_t addr, uint32_t size) {
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_mem_region(
|
||||
uint32_t start_addr, uint32_t size, uint32_t dest_addr, uint32_t type, uint8_t init_val = 0) {
|
||||
bool MemCtrlBase::add_mem_region(uint32_t start_addr, uint32_t size,
|
||||
uint32_t dest_addr, uint32_t type,
|
||||
uint8_t init_val = 0)
|
||||
{
|
||||
AddressMapEntry *entry;
|
||||
|
||||
/* error if a memory region for the given range already exists */
|
||||
@ -180,14 +209,18 @@ bool MemCtrlBase::add_mem_mirror(uint32_t start_addr, uint32_t dest_addr) {
|
||||
|
||||
this->address_map.push_back(entry);
|
||||
|
||||
LOG_F(INFO, "Added mem region mirror 0x%X..0x%X (%s%s%s%s) -> 0x%X : 0x%X..0x%X%s%s%s", start_addr, end,
|
||||
LOG_F(INFO, "Added mem region mirror 0x%X..0x%X (%s%s%s%s) -> 0x%X : 0x%X..0x%X%s%s%s",
|
||||
start_addr, end,
|
||||
entry->type & RT_ROM ? "ROM," : "",
|
||||
entry->type & RT_RAM ? "RAM," : "",
|
||||
entry->type & RT_MMIO ? "MMIO," : "",
|
||||
entry->type & RT_MIRROR ? "MIRROR," : "",
|
||||
dest_addr,
|
||||
ref_entry->start, ref_entry->end,
|
||||
ref_entry->devobj ? " (" : "", ref_entry->devobj ? ref_entry->devobj->get_name().c_str() : "", ref_entry->devobj ? ")" : ""
|
||||
ref_entry->devobj ? " (" : "",
|
||||
ref_entry->devobj ? ref_entry->devobj->get_name().c_str() : "",
|
||||
ref_entry->devobj ? ")"
|
||||
: ""
|
||||
);
|
||||
|
||||
return true;
|
||||
@ -209,7 +242,8 @@ bool MemCtrlBase::set_data(uint32_t reg_addr, const uint8_t* data, uint32_t size
|
||||
}
|
||||
|
||||
|
||||
bool MemCtrlBase::add_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice* dev_instance) {
|
||||
bool MemCtrlBase::add_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice* dev_instance)
|
||||
{
|
||||
AddressMapEntry *entry;
|
||||
|
||||
/* error if a memory region for the given range already exists */
|
||||
@ -228,30 +262,55 @@ bool MemCtrlBase::add_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice
|
||||
|
||||
this->address_map.push_back(entry);
|
||||
|
||||
LOG_F(INFO, "Added mmio region 0x%X..0x%X%s%s%s", start_addr, end, dev_instance ? " (" : "", dev_instance ? dev_instance->get_name().c_str() : "", dev_instance ? ")" : "");
|
||||
LOG_F(INFO, "Added mmio region 0x%X..0x%X%s%s%s",
|
||||
start_addr, end,
|
||||
dev_instance ? " (" : "",
|
||||
dev_instance ? dev_instance->get_name().c_str() : "",
|
||||
dev_instance ? ")"
|
||||
: ""
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MemCtrlBase::remove_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice* dev_instance) {
|
||||
bool MemCtrlBase::remove_mmio_region(uint32_t start_addr, uint32_t size, MMIODevice* dev_instance)
|
||||
{
|
||||
int found = 0;
|
||||
|
||||
uint32_t end = start_addr + size - 1;
|
||||
address_map.erase(std::remove_if(address_map.begin(), address_map.end(),
|
||||
[start_addr, end, dev_instance, &found](const AddressMapEntry *entry) {
|
||||
bool result = (start_addr == entry->start && end == entry->end && (!dev_instance || dev_instance == entry->devobj));
|
||||
bool result = match_mem_entry(entry, start_addr, end, dev_instance);
|
||||
found += result;
|
||||
return result;
|
||||
}
|
||||
), address_map.end());
|
||||
|
||||
if (found == 0)
|
||||
LOG_F(ERROR, "Cannot find mmio region 0x%X..0x%X%s%s%s to remove", start_addr, end, dev_instance ? " (" : "", dev_instance ? dev_instance->get_name().c_str() : "", dev_instance ? ")" : "");
|
||||
LOG_F(ERROR, "Cannot find mmio region 0x%X..0x%X%s%s%s to remove",
|
||||
start_addr, end,
|
||||
dev_instance ? " (" : "",
|
||||
dev_instance ? dev_instance->get_name().c_str() : "",
|
||||
dev_instance ? ")"
|
||||
: ""
|
||||
);
|
||||
else if (found > 1)
|
||||
LOG_F(ERROR, "Removed %d occurrences of mmio region 0x%X..0x%X%s%s%s", found, start_addr, end, dev_instance ? " (" : "", dev_instance ? dev_instance->get_name().c_str() : "", dev_instance ? ")" : "");
|
||||
LOG_F(ERROR, "Removed %d occurrences of mmio region 0x%X..0x%X%s%s%s",
|
||||
found, start_addr, end,
|
||||
dev_instance ? " (" : "",
|
||||
dev_instance ? dev_instance->get_name().c_str() : "",
|
||||
dev_instance ? ")"
|
||||
: ""
|
||||
);
|
||||
else
|
||||
LOG_F(INFO, "Removed mmio region 0x%X..0x%X%s%s%s", start_addr, end, dev_instance ? " (" : "", dev_instance ? dev_instance->get_name().c_str() : "", dev_instance ? ")" : "");
|
||||
|
||||
LOG_F(INFO, "Removed mmio region 0x%X..0x%X%s%s%s",
|
||||
start_addr, end,
|
||||
dev_instance ? " (" : "",
|
||||
dev_instance ? dev_instance->get_name().c_str() : "",
|
||||
dev_instance ? ")"
|
||||
: ""
|
||||
);
|
||||
|
||||
return (found > 0);
|
||||
}
|
||||
|
||||
|
@ -253,7 +253,8 @@ void MPC106::setup_ram() {
|
||||
}
|
||||
|
||||
if (!this->add_ram_region(0, ram_size)) {
|
||||
LOG_F(WARNING, "MPC106 RAM allocation 0x%X..0x%X failed (maybe already exists?)", 0, ram_size - 1);
|
||||
LOG_F(WARNING, "MPC106 RAM allocation 0x%X..0x%X failed (maybe already exists?)",
|
||||
0, ram_size - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
int initialize_catalyst(std::string& id)
|
||||
{
|
||||
LOG_F(INFO, "Building machine catalyst");
|
||||
LOG_F(INFO, "Building machine Catalyst...");
|
||||
|
||||
PlatinumCtrl* platinum_obj;
|
||||
|
||||
|
@ -47,7 +47,7 @@ int get_cpu_pll_value(const uint64_t cpu_freq_hz) {
|
||||
|
||||
int initialize_gazelle(std::string& id)
|
||||
{
|
||||
LOG_F(INFO, "Building machine gazelle");
|
||||
LOG_F(INFO, "Building machine Gazelle...");
|
||||
|
||||
PCIHost *pci_host = dynamic_cast<PCIHost*>(gMachineObj->get_comp_by_name("PsxPci1"));
|
||||
|
||||
|
@ -94,7 +94,7 @@ static void setup_ram_slot(std::string name, int i2c_addr, int capacity_megs) {
|
||||
|
||||
int initialize_gossamer(std::string& id)
|
||||
{
|
||||
LOG_F(INFO, "Building machine gossamer");
|
||||
LOG_F(INFO, "Building machine Gossamer...");
|
||||
|
||||
// get pointer to the memory controller/PCI host bridge object
|
||||
MPC106* grackle_obj = dynamic_cast<MPC106*>(gMachineObj->get_comp_by_name("Grackle"));
|
||||
|
@ -38,7 +38,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
int initialize_pdm(std::string& id)
|
||||
{
|
||||
LOG_F(INFO, "Building machine pdm");
|
||||
LOG_F(INFO, "Building machine PDM...");
|
||||
|
||||
uint16_t machine_id;
|
||||
|
||||
|
@ -36,7 +36,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
int initialize_tnt(std::string& id)
|
||||
{
|
||||
LOG_F(INFO, "Building machine tnt");
|
||||
LOG_F(INFO, "Building machine TNT...");
|
||||
|
||||
HammerheadCtrl* memctrl_obj;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user