bpmpfw reliability fix

This commit is contained in:
souldbminersmwc committed 2026-08-25 14:49:57 -04:00
1 parent 1990b1b66c
commit ba07273675
3 files changed
+18 -23

No files matched your search

+1
View File
@@ -8,3 +8,4 @@ build
Source/hekate Source/hekate
dist/* dist/*
!dist/.gitignore !dist/.gitignore
Source/hoc-clk/sysmodule/data/bpmpfw.bin
+9 -9
View File
@@ -20,6 +20,15 @@ for arg in "$@"; do
done done
echo 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 ***" echo "*** Compiling hoc-clk ***"
TITLE_ID="$(grep -oP '"title_id":\s*"0x\K(\w+)' "$ROOT_DIR/sysmodule/perms.json")" 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" cp -vf "$ROOT_DIR/overlay/out/horizon-oc-overlay.ovl" "$DIST_DIR/switch/.overlays/horizon-oc-overlay.ovl"
echo 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 ***" echo "*** Copying assets ***"
mkdir -p "$DIST_DIR/config/horizon-oc" mkdir -p "$DIST_DIR/config/horizon-oc"
cp -vf "$ROOT_DIR/config.ini.template" "$DIST_DIR/config/horizon-oc/config.ini.template" cp -vf "$ROOT_DIR/config.ini.template" "$DIST_DIR/config/horizon-oc/config.ini.template"
+8 -14
View File
@@ -15,7 +15,6 @@
* *
*/ */
#include <cstdio>
#include <cstring> #include <cstring>
#include <switch.h> #include <switch.h>
@@ -25,6 +24,8 @@
#include "../mapping/mem_map.hpp" #include "../mapping/mem_map.hpp"
#include "bpmp.hpp" #include "bpmp.hpp"
#include "bpmpfw_bin.h"
namespace bpmp { namespace bpmp {
namespace { namespace {
@@ -60,6 +61,7 @@ namespace bpmp {
constexpr u32 FwStagingSize = 0x8000; constexpr u32 FwStagingSize = 0x8000;
constexpr u64 WorkRamPhysBase = FwIramPhysBase + FwStagingSize; // matches bpmpfw's WorkRamStart constexpr u64 WorkRamPhysBase = FwIramPhysBase + FwStagingSize; // matches bpmpfw's WorkRamStart
/* secmon will return error unless we apply thiss workaround */
alignas(4096) u8 s_fwStageBuf[FwStagingSize]; alignas(4096) u8 s_fwStageBuf[FwStagingSize];
HocClkBpmpSharedInfo s_sharedInfo = {}; HocClkBpmpSharedInfo s_sharedInfo = {};
@@ -108,23 +110,15 @@ namespace bpmp {
return (Result)1; return (Result)1;
} }
std::memset(s_fwStageBuf, 0, sizeof(s_fwStageBuf)); const size_t fw_size = bpmpfw_bin_size;
if (fw_size == 0 || fw_size > FwStagingSize) {
FILE *f = fopen("sdmc:/config/horizon-oc/bpmpfw.bin", "rb"); fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw of %zu bytes is invalid (should not happen)!", fw_size);
if (!f) {
fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin not found");
return (Result)1; return (Result)1;
} }
const size_t fw_size = fread(s_fwStageBuf, 1, sizeof(s_fwStageBuf), f); std::memcpy(s_fwStageBuf, bpmpfw_bin, fw_size);
fclose(f);
if (fw_size == 0) { fileUtils::LogLine("[bpmp] StartBpmfwExecution: loading %zu bytes at 0x%llx",
fileUtils::LogLine("[bpmp] StartBpmfwExecution: bpmpfw.bin is empty");
return (Result)1;
}
fileUtils::LogLine("[bpmp] StartBpmfwExecution: loaded %zu bytes, loading at 0x%llx",
fw_size, static_cast<unsigned long long>(FwIramPhysBase)); fw_size, static_cast<unsigned long long>(FwIramPhysBase));
/* Set BPMP reset */ /* Set BPMP reset */