From b809d8674925d3c6e6b25efa91dccc04a460a62f Mon Sep 17 00:00:00 2001 From: Luciano Ciccariello Date: Mon, 4 Mar 2024 20:41:38 +0000 Subject: [PATCH] Fix HD mode on Prime 1 --- cmake/src/main/hook/patch/CMakeLists.txt | 1 + src/main/hook/patch/sysinfo.c | 31 ++++++++++++++++++++++++ src/main/hook/patch/sysinfo.h | 8 ++++++ src/main/hook/pri/main.c | 9 +++++++ 4 files changed, 49 insertions(+) create mode 100644 src/main/hook/patch/sysinfo.c create mode 100644 src/main/hook/patch/sysinfo.h diff --git a/cmake/src/main/hook/patch/CMakeLists.txt b/cmake/src/main/hook/patch/CMakeLists.txt index 9d55729..b25abd4 100644 --- a/cmake/src/main/hook/patch/CMakeLists.txt +++ b/cmake/src/main/hook/patch/CMakeLists.txt @@ -26,6 +26,7 @@ set(SOURCE_FILES ${SRC}/redir.c ${SRC}/sigsegv.c ${SRC}/sound.c + ${SRC}/sysinfo.c ${SRC}/usb-emu.c ${SRC}/usb-init-fix.c ${SRC}/usb-mnt.c diff --git a/src/main/hook/patch/sysinfo.c b/src/main/hook/patch/sysinfo.c new file mode 100644 index 0000000..3a8cc3b --- /dev/null +++ b/src/main/hook/patch/sysinfo.c @@ -0,0 +1,31 @@ +#define LOG_MODULE "patch-sysinfo" + +#include +#include + +#include "capnhook/hook/lib.h" + +#include "util/log.h" + +typedef int (*sysinfo_t)(struct sysinfo *info); + +static bool patch_sysinfo_initialized; +static sysinfo_t patch_sysinfo_real_sysinfo; +int sysinfo(struct sysinfo *info) { + if (!patch_sysinfo_real_sysinfo) { + patch_sysinfo_real_sysinfo = (sysinfo_t)cnh_lib_get_func_addr("sysinfo"); + } + + // Prime will not run in HD if totalram / (mem_unit * 1024) is less than 999999 + int ret = patch_sysinfo_real_sysinfo(info); + info->totalram = info->totalram * info->mem_unit; + info->mem_unit = 1; + + return ret; +} + +void patch_sysinfo_init() +{ + patch_sysinfo_initialized = true; + log_info("Initialized"); +} diff --git a/src/main/hook/patch/sysinfo.h b/src/main/hook/patch/sysinfo.h new file mode 100644 index 0000000..f1a9441 --- /dev/null +++ b/src/main/hook/patch/sysinfo.h @@ -0,0 +1,8 @@ +#pragma once + +/** + * Initialize the patch module + * + * This takes care of overriding system specs + */ +void patch_sysinfo_init(); diff --git a/src/main/hook/pri/main.c b/src/main/hook/pri/main.c index 9f94a62..005e30d 100644 --- a/src/main/hook/pri/main.c +++ b/src/main/hook/pri/main.c @@ -26,6 +26,7 @@ #include "hook/patch/redir.h" #include "hook/patch/sigsegv.h" #include "hook/patch/sound.h" +#include "hook/patch/sysinfo.h" #include "hook/patch/usb-emu.h" #include "hook/patch/usb-init-fix.h" #include "hook/patch/usb-mnt.h" @@ -151,6 +152,13 @@ static void prihook_patch_gfx_init(struct prihook_options *options) } } +static void prihook_patch_sysinfo_init(struct prihook_options *options) +{ + log_assert(options); + + patch_sysinfo_init(); +} + static void prihook_patch_main_loop_init(struct prihook_options *options) { log_assert(options); @@ -283,6 +291,7 @@ void prihook_trap_before_main(int argc, char **argv) prihook_fs_redirs_init(&options, game_data_path); prihook_patch_fs_mounting_init(); prihook_patch_gfx_init(&options); + prihook_patch_sysinfo_init(&options); prihook_patch_main_loop_init(&options); prihook_patch_sound_init(&options); prihook_patch_sigsegv_init(&options);