Skip to content

Commit

Permalink
Fix ElfModLoader not grabbing initial values for CVars
Browse files Browse the repository at this point in the history
  • Loading branch information
vyuuui committed Dec 28, 2023
1 parent bd2591a commit 189ee86
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 1 deletion.
27 changes: 27 additions & 0 deletions Source/Core/Core/PrimeHack/Mods/ElfModLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,32 @@ void ElfModLoader::write_cvar_val(CVarVal var, u32 addr) {
}
}

void ElfModLoader::read_cvar(CVar& var) {
switch (var.type) {
case CVarType::INT8:
var.value = read8(var.addr);
break;
case CVarType::INT16:
var.value = read16(var.addr);
break;
case CVarType::INT32:
var.value = read32(var.addr);
break;
case CVarType::INT64:
var.value = read64(var.addr);
break;
case CVarType::FLOAT32:
var.value = readf32(var.addr);
break;
case CVarType::FLOAT64:
var.value = readf64(var.addr);
break;
case CVarType::BOOLEAN:
var.value = static_cast<bool>(read8(var.addr));
break;
}
}

void ElfModLoader::run_mod(Game game, Region region) {
const auto load_mod = [this] {
std::string pending_elf = GetPendingModfile();
Expand Down Expand Up @@ -474,6 +500,7 @@ void ElfModLoader::parse_and_load_modfile(std::string const& path) {
resolve_symbols([this, &cvar] (Symbol* cvar_sym) {
cvar_map[cvar.name] = cvar;
cvar_map[cvar.name].addr = cvar_sym->address;
read_cvar(cvar_map[cvar.name]);
}, cvar.name);
}

Expand Down
1 change: 1 addition & 0 deletions Source/Core/Core/PrimeHack/Mods/ElfModLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ class ElfModLoader : public PrimeMod {
void clear_active_mod();

void write_cvar_val(CVarVal val, u32 addr);
void read_cvar(CVar& var);

// void clear_modinfo_from_ram();
// void write_modinfo_to_ram();
Expand Down
8 changes: 8 additions & 0 deletions Source/Core/Core/PrimeHack/PrimeMod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,14 @@ float PrimeMod::readf32(u32 addr) const {
return Common::BitCast<float>(read32(addr));
}

double PrimeMod::readf64(u32 addr) const {
if (active_guard == nullptr) {
WARN_LOG_FMT(POWERPC, "Attempted active mod code outside of critical section");
return 0;
}
return Common::BitCast<double>(read64(addr));
}

void PrimeMod::write8(u8 var, u32 addr) const {
if (active_guard == nullptr) {
WARN_LOG_FMT(POWERPC, "Attempted active mod code outside of critical section");
Expand Down
1 change: 1 addition & 0 deletions Source/Core/Core/PrimeHack/PrimeMod.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ class PrimeMod {
u32 readi(u32 addr) const;
u64 read64(u32 addr) const;
float readf32(u32 addr) const;
double readf64(u32 addr) const;
void write8(u8 var, u32 addr) const;
void write16(u16 var, u32 addr) const;
void write32(u32 var, u32 addr) const;
Expand Down
3 changes: 2 additions & 1 deletion Source/Core/DolphinQt/CVarsWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include <fstream>

CVarListModel::CVarListModel(QObject* parent) : QAbstractTableModel(parent) {
load_cvars();
update_cvar_cache();
}

Expand All @@ -37,6 +36,7 @@ void CVarListModel::get_column_widths(QFont const& font, std::array<int, CVarLis
}

void CVarListModel::update_cvar_cache() {
load_cvars();
cached_vals.clear();
const auto get_value = [](prime::CVar const& var) -> QVariant {
if (uint8_t const* val = std::get_if<uint8_t>(&var.value); val != nullptr) {
Expand Down Expand Up @@ -145,6 +145,7 @@ int CVarListModel::columnCount(const QModelIndex& parent) const {
}

void CVarListModel::load_cvars() {
cvar_list.clear();
prime::ElfModLoader* mod = static_cast<prime::ElfModLoader*>(prime::GetHackManager()->get_mod("elf_mod_loader"));
if (mod == nullptr) {
return;
Expand Down

0 comments on commit 189ee86

Please sign in to comment.