From ba072736752e55c585db5ed2de281ad8a491f7b3 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 25 Aug 2026 14:49:57 -0400 Subject: [PATCH] bpmpfw reliability fix --- .gitignore | 1 + Source/hoc-clk/build.sh | 18 +++++++++--------- Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp | 22 ++++++++-------------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 76dc4eee..5ec2190f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ build Source/hekate dist/* !dist/.gitignore +Source/hoc-clk/sysmodule/data/bpmpfw.bin diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh index f06780ec..74634101 100755 --- a/Source/hoc-clk/build.sh +++ b/Source/hoc-clk/build.sh @@ -20,6 +20,15 @@ for arg in "$@"; do done echo +echo "*** Compiling bpmpfw ***" +pushd "$ROOT_DIR/bpmpfw" +make -j$CORES +popd > /dev/null + +mkdir -p "$ROOT_DIR/sysmodule/data" +cp -vf "$ROOT_DIR/bpmpfw/out/bpmpfw.bin" "$ROOT_DIR/sysmodule/data/bpmpfw.bin" +echo + echo "*** Compiling hoc-clk ***" TITLE_ID="$(grep -oP '"title_id":\s*"0x\K(\w+)' "$ROOT_DIR/sysmodule/perms.json")" @@ -42,15 +51,6 @@ mkdir -p "$DIST_DIR/switch/.overlays" cp -vf "$ROOT_DIR/overlay/out/horizon-oc-overlay.ovl" "$DIST_DIR/switch/.overlays/horizon-oc-overlay.ovl" echo -echo "*** Compiling bpmpfw ***" -pushd "$ROOT_DIR/bpmpfw" -make -j$CORES -popd > /dev/null - -mkdir -p "$DIST_DIR/config/horizon-oc" -cp -vf "$ROOT_DIR/bpmpfw/out/bpmpfw.bin" "$DIST_DIR/config/horizon-oc/bpmpfw.bin" -echo - echo "*** Copying assets ***" mkdir -p "$DIST_DIR/config/horizon-oc" cp -vf "$ROOT_DIR/config.ini.template" "$DIST_DIR/config/horizon-oc/config.ini.template" diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 9485e559..5ca299f5 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -15,7 +15,6 @@ * */ -#include #include #include @@ -25,6 +24,8 @@ #include "../mapping/mem_map.hpp" #include "bpmp.hpp" +#include "bpmpfw_bin.h" + namespace bpmp { namespace { @@ -60,6 +61,7 @@ namespace bpmp { constexpr u32 FwStagingSize = 0x8000; constexpr u64 WorkRamPhysBase = FwIramPhysBase + FwStagingSize; // matches bpmpfw's WorkRamStart + /* secmon will return error unless we apply thiss workaround */ alignas(4096) u8 s_fwStageBuf[FwStagingSize]; HocClkBpmpSharedInfo s_sharedInfo = {}; @@ -108,23 +110,15 @@ namespace bpmp { return (Result)1; } - std::memset(s_fwStageBuf, 0, sizeof(s_fwStageBuf)); - - FILE *f = fopen("sdmc:/config/horizon-oc/bpmpfw.bin", "rb"); - if (!f) { - fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin not found"); + const size_t fw_size = bpmpfw_bin_size; + if (fw_size == 0 || fw_size > FwStagingSize) { + fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw of %zu bytes is invalid (should not happen)!", fw_size); return (Result)1; } - const size_t fw_size = fread(s_fwStageBuf, 1, sizeof(s_fwStageBuf), f); - fclose(f); + std::memcpy(s_fwStageBuf, bpmpfw_bin, fw_size); - if (fw_size == 0) { - fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin is empty"); - return (Result)1; - } - - fileUtils::LogLine("[bpmp] StartBpmfwExecution: loaded %zu bytes, loading at 0x%llx", + fileUtils::LogLine("[bpmp] StartBpmfwExecution: loading %zu bytes at 0x%llx", fw_size, static_cast(FwIramPhysBase)); /* Set BPMP reset */