mirror of
https://github.com/PretendoNetwork/Inkay.git
synced 2026-08-18 11:37:02 +02:00
refactor: make replaceBulk truly bulk-processing, try to optimise a bit
miiverse extra load times gone from 15 seconds to 2 seconds, though that's mostly because I changed the search range 😎
This commit is contained in:
parent
50b1c9a594
commit
d62765bab9
4 changed files with 54 additions and 32 deletions
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include <kernel/kernel.h>
|
||||
#include <coreinit/memorymap.h>
|
||||
#include <algorithm>
|
||||
|
||||
bool replace(uint32_t start, uint32_t size, const char* original_val, size_t original_val_sz, const char* new_val, size_t new_val_sz) {
|
||||
for (uint32_t addr = start; addr < start + size - original_val_sz; addr++) {
|
||||
|
|
@ -32,13 +33,34 @@ bool replace(uint32_t start, uint32_t size, const char* original_val, size_t ori
|
|||
return false;
|
||||
}
|
||||
|
||||
void replaceBulk(uint32_t start, uint32_t size, const char* original_val, size_t original_val_sz, const char* new_val, size_t new_val_sz) {
|
||||
for (uint32_t addr = start; addr < start + size - original_val_sz; addr++) {
|
||||
int ret = memcmp(original_val, (void*)addr, original_val_sz);
|
||||
if (ret == 0) {
|
||||
DEBUG_FUNCTION_LINE("found bulk @%08x", addr);
|
||||
KernelCopyData(OSEffectiveToPhysical(addr), OSEffectiveToPhysical((uint32_t)new_val), new_val_sz);
|
||||
DEBUG_FUNCTION_LINE("new bulk @%08x", addr);
|
||||
void replaceBulk(uint32_t start, uint32_t size, std::span<const replacement> replacements) {
|
||||
// work out the biggest input replacement
|
||||
auto max_sz = std::max_element(replacements.begin(), replacements.end(), [](auto& a, auto& b) {
|
||||
return a.orig.size_bytes() < b.orig.size_bytes();
|
||||
})->orig.size_bytes();
|
||||
|
||||
int counts[replacements.size()];
|
||||
for (auto& c : counts) {
|
||||
c = 0;
|
||||
}
|
||||
|
||||
for (uint32_t addr = start; addr < start + size - max_sz; addr++) {
|
||||
for (int i = 0; i < (int)replacements.size(); i++) {
|
||||
const auto& replacement = replacements[i];
|
||||
|
||||
int ret = memcmp((void*)addr, replacement.orig.data(), replacement.orig.size_bytes());
|
||||
if (ret == 0) {
|
||||
KernelCopyData(
|
||||
OSEffectiveToPhysical(addr),
|
||||
OSEffectiveToPhysical((uint32_t)replacement.repl.data()),
|
||||
replacement.repl.size_bytes()
|
||||
);
|
||||
counts[i]++;
|
||||
break; // don't check the other replacements
|
||||
}
|
||||
}
|
||||
}
|
||||
for (auto c : counts) {
|
||||
DEBUG_FUNCTION_LINE("replaced %d times", c);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,6 +16,13 @@
|
|||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
#include <span>
|
||||
|
||||
bool replace(uint32_t start, uint32_t size, const char* original_val, size_t original_val_sz, const char* new_val, size_t new_val_sz);
|
||||
void replaceBulk(uint32_t start, uint32_t size, const char* original_val, size_t original_val_sz, const char* new_val, size_t new_val_sz);
|
||||
|
||||
struct replacement {
|
||||
std::span<const uint8_t> orig;
|
||||
std::span<const uint8_t> repl;
|
||||
};
|
||||
|
||||
void replaceBulk(uint32_t start, uint32_t size, std::span<const replacement> replacements);
|
||||
|
|
|
|||
Loading…
Reference in a new issue