From 836e24c82e59c513cff791d1fee05e7a5370c475 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Thu, 13 Aug 2026 20:03:53 -0400 Subject: [PATCH] more debug feature --- .../loader/source/oc/customize.cpp | 2 +- .../loader/source/oc/oc_common.hpp | 2 - .../source/oc/pcv/mariko/pcv_mariko.cpp | 6 +- Source/hoc-clk/build.sh | 18 ++++-- Source/hoc-clk/common/include/hocclk/config.h | 5 +- Source/hoc-clk/overlay/Makefile | 5 ++ Source/hoc-clk/overlay/src/main.cpp | 4 +- .../hoc-clk/overlay/src/ui/gui/base_gui.cpp | 6 +- .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 55 ++++++++++++++++++- Source/hoc-clk/sysmodule/src/file/kip.cpp | 3 + Source/hoc-clk/sysmodule/src/file/kip.hpp | 8 ++- build.sh | 20 ++++--- 12 files changed, 111 insertions(+), 23 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index 4550d8ea..dae3037f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -222,7 +222,7 @@ volatile CustomizeTable C = { /* Debugging options */ /* PCV Log Verbosity */ -/* -1: Nothing */ +/* 0xFF: Nothing */ /* 0: Basic logging */ /* 1: More advanced logging */ /* 2: All logging excluding MMIO */ diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp index 374730c8..bbaaeb97 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/oc_common.hpp @@ -31,8 +31,6 @@ #define HOC_UART_LOG 0 #endif -#define HOC_PCV_NVLOG_PATCH 1 - #include "customize.hpp" #include "oc_log.hpp" diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp index 9a1937c6..1a3d162c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko.cpp @@ -219,8 +219,10 @@ namespace ams::ldr::hoc::pcv::mariko { #if HOC_UART_LOG /* Force GetEffectiveVerbosityLevel to return a non-zero level so all NvLog runs. */ Result ForceVerbosity(u32 *ptr) { - PATCH_OFFSET(&ptr[0], AsmMakeMovzW(0, static_cast(C.pcvLogVerbosity))); /* movz w0,#level */ - PATCH_OFFSET(&ptr[1], RetIns); /* ret */ + if(C.pcvLogVerbosity != 0xff) { + PATCH_OFFSET(&ptr[0], AsmMakeMovzW(0, static_cast(C.pcvLogVerbosity))); /* movz w0,#level */ + PATCH_OFFSET(&ptr[1], RetIns); /* ret */ + } R_SUCCEED(); } #endif diff --git a/Source/hoc-clk/build.sh b/Source/hoc-clk/build.sh index dea28f0b..b3de7e5f 100644 --- a/Source/hoc-clk/build.sh +++ b/Source/hoc-clk/build.sh @@ -4,10 +4,20 @@ set -e ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIST_DIR="$ROOT_DIR/dist" CORES="$(nproc --all)" +OVERLAY_DEBUG=0 -if [[ -n "$1" ]]; then - DIST_DIR="$1" -fi +for arg in "$@"; do + case "$arg" in + -d|--debug) + OVERLAY_DEBUG=1 + ;; + "") + ;; + *) + DIST_DIR="$arg" + ;; + esac +done echo echo "*** Compiling hoc-clk ***" @@ -25,7 +35,7 @@ cp -vf "$ROOT_DIR/sysmodule/toolbox.json" "$DIST_DIR/atmosphere/contents/$TITLE_ echo echo "*** Compiling hoc-clk-overlay ***" pushd "$ROOT_DIR/overlay" -make -j$CORES +make -j$CORES OVERLAY_DEBUG=$OVERLAY_DEBUG popd > /dev/null mkdir -p "$DIST_DIR/switch/.overlays" diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index cbf37c06..0e6868c5 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -228,6 +228,8 @@ typedef enum { KipConfigValue_t6_tRTW_fine_tune, KipConfigValue_t7_tWTR_fine_tune, + KipConfigValue_PcvDebugVerbosity, + KipCrc32, HocClkConfigValue_EnumMax, } HocClkConfigValue; @@ -512,7 +514,7 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr case KipConfigValue_g_volt_e_1075200: return pretty ? "Erista GPU Volt 1075 MHz" : "g_volt_e_1075200"; case KipConfigValue_t6_tRTW_fine_tune: return pretty ? "t6 - tRTW Fine Tune" : "t6_tRTW_fine_tune"; case KipConfigValue_t7_tWTR_fine_tune: return pretty ? "t7 - tWTR Fine Tune" : "t7_tWTR_fine_tune"; - + case KipConfigValue_PcvDebugVerbosity: return pretty ? "Pcv Debug Verbosity" : "debug_verbosity"; case KipConfigValue_g_soc_volt_1866000: return pretty ? "Mariko SOC Volt 1866 MHz" : "g_soc_volt_1866000"; case KipConfigValue_g_soc_volt_2000000: return pretty ? "Mariko SOC Volt 2000 MHz" : "g_soc_volt_2000000"; case KipConfigValue_g_soc_volt_2133000: return pretty ? "Mariko SOC Volt 2133 MHz" : "g_soc_volt_2133000"; @@ -780,6 +782,7 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_AulaDisplayColorPreset: case HocClkConfigValue_AutoRamCpuCpuOCFreq: case HocClkConfigValue_AutoRamCpuRamOCThreshold: + case KipConfigValue_PcvDebugVerbosity: return true; case HocClkConfigValue_BatteryChargeCurrent: return ((input >= 1024) && (input <= 3072)) || !input; diff --git a/Source/hoc-clk/overlay/Makefile b/Source/hoc-clk/overlay/Makefile index 1542d854..dfa799a0 100644 --- a/Source/hoc-clk/overlay/Makefile +++ b/Source/hoc-clk/overlay/Makefile @@ -26,6 +26,8 @@ DATA := data ../assets INCLUDES := ../common/include EXEFS_SRC := exefs_src IS_MINIMAL := 0 +OVERLAY_DEBUG ?= 0 + APP_TITLE := Horizon OC NO_ICON := 1 @@ -46,6 +48,9 @@ TARGET_VERSION := $(APP_VERSION) # options for code generation #--------------------------------------------------------------------------------- DEFINES := -DDISABLE_IPC -DTARGET="\"$(TARGET)\"" -DTARGET_VERSION="\"$(TARGET_VERSION)\"" -DIS_MINIMAL=$(IS_MINIMAL) +ifeq ($(OVERLAY_DEBUG),1) + DEFINES += -DOVERLAY_DEBUG +endif ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE diff --git a/Source/hoc-clk/overlay/src/main.cpp b/Source/hoc-clk/overlay/src/main.cpp index 1024dac5..cfd977f1 100644 --- a/Source/hoc-clk/overlay/src/main.cpp +++ b/Source/hoc-clk/overlay/src/main.cpp @@ -96,6 +96,7 @@ class AppOverlay : public tsl::Overlay { ""); } + #ifndef OVERLAY_DEBUG HocClkContext context = {}; if (R_SUCCEEDED(hocclkIpcGetCurrentContext(&context)) && context.rebootRequired) { return initially("Horizon OC has been updated.\n\n" @@ -104,7 +105,8 @@ class AppOverlay : public tsl::Overlay { "to finish applying the update.", ""); } - + #endif + return initially(); } }; diff --git a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp index 894253e8..1d69efdc 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/base_gui.cpp @@ -71,6 +71,7 @@ std::string getVersionString() { static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color(7, 15, 15, 15); static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color(2, 8, 11, 15); static constexpr tsl::Color STATIC_TEAL = tsl::Color(7, 15, 15, 15); + const std::string name = " Horizon OC"; static s32 drawDynamicUltraText(tsl::gfx::Renderer *renderer, s32 startX, s32 y, u32 fontSize, const tsl::Color &staticColor, @@ -131,8 +132,11 @@ void BaseGui::preDraw(tsl::gfx::Renderer *renderer) { renderer->drawBitmap(LOGO_X, LOGO_Y_REAL - LOGO_LABEL_FONT_SIZE, LOGO_IMG_W, LOGO_IMG_H, hoc_rgba); drawDynamicUltraText(renderer, LOGO_TEXT_X, TEXT_Y, LOGO_LABEL_FONT_SIZE, STATIC_TEAL, false); - + #ifdef OVERLAY_DEBUG + static const std::string versionStr = "Version " + getVersionString() + " \"Athena (debug)\""; + #else static const std::string versionStr = "Version " + getVersionString() + " \"Athena\""; + #endif static constexpr tsl::Color versionColor(9, 9, 9, 15); static constexpr s32 vx = LOGO_TEXT_X + 15; static constexpr s32 vy = TEXT_Y + 18; diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 616f8e7e..399c9700 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -66,7 +66,9 @@ class CpuSubmenuGui; class GpuSubmenuGui; class GpuCustomTableSubmenuGui; class ExperimentalSettingsSubMenuGui; - +#ifdef OVERLAY_DEBUG +class DebugSettingsSubMenuGui; +#endif MiscGui::MiscGui() { this->configList = new HocClkConfigValueList{}; } @@ -735,7 +737,18 @@ void MiscGui::listUI() { experimentalSubMenu->setValue(R_ARROW); this->listElement->addItem(experimentalSubMenu); } - + #ifdef OVERLAY_DEBUG + tsl::elm::ListItem *debugSubMenu = new tsl::elm::ListItem("Debug Settings"); + debugSubMenu->setClickListener([](u64 keys) { + if (keys & HidNpadButton_A) { + tsl::swapTo(); + return true; + } + return false; + }); + debugSubMenu->setValue(R_ARROW); + this->listElement->addItem(debugSubMenu); + #endif if (!lastItemName.empty()) { this->listElement->jumpToItem(lastItemName); } @@ -928,6 +941,44 @@ class ExperimentalSettingsSubMenuGui : public MiscGui { } }; +#ifdef OVERLAY_DEBUG +class DebugSettingsSubMenuGui : public MiscGui { + public: + DebugSettingsSubMenuGui() { + } + + bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState leftJoyStick, + HidAnalogStickState rightJoyStick) override { + if (keysDown & KEY_B) { + triggerExitFeedback(); + lastItemName = "Debug Settings"; + tsl::swapTo(); + return true; + } + return false; + } + + protected: + void listUI() override { + Result rc = hocclkIpcGetConfigValues(this->configList); + if (R_FAILED(rc)) [[unlikely]] { + FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); + return; + } + this->listElement->addItem(new CompactCategoryHeader("Debug Settings")); + ValueThresholds thresholdsDisabled(0, 0); + std::vector VerbosityList = { + NamedValue("Disabled", 0xff), NamedValue("0", 0), NamedValue("1", 1), + NamedValue("2", 2), NamedValue("3", 3), + }; + + addConfigButton(KipConfigValue_PcvDebugVerbosity, "PCV Log Verbosity", ValueRange(0, 0, 1, "", 0), + "Verbosity", &thresholdsDisabled, {}, VerbosityList, false, true); + } +}; + +#endif + class GovernorSettingsSubMenuGui : public MiscGui { public: GovernorSettingsSubMenuGui() { diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 46a5cfb8..45aa22bd 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -145,6 +145,7 @@ namespace kip { CUST_WRITE_FIELD_BATCH(&table, t6_tRTW_fine_tune, config::GetConfigValue(KipConfigValue_t6_tRTW_fine_tune)); CUST_WRITE_FIELD_BATCH(&table, t7_tWTR_fine_tune, config::GetConfigValue(KipConfigValue_t7_tWTR_fine_tune)); + CUST_WRITE_FIELD_BATCH(&table, pcvLogVerbosity, config::GetConfigValue(KipConfigValue_PcvDebugVerbosity)); if (!cust_write_table_f(fp, &table)) { fclose(fp); @@ -329,6 +330,8 @@ namespace kip { configValues.values[KipConfigValue_t7_tWTR_fine_tune] = cust_get_tWTR_fine_tune(&table); configValues.values[KipConfigValue_t6_tRTW_fine_tune] = cust_get_tRTW_fine_tune(&table); + configValues.values[KipConfigValue_PcvDebugVerbosity] = cust_get_log_verbosity(&table); + if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) { if (config::SetConfigValues(&configValues, true)) { fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], diff --git a/Source/hoc-clk/sysmodule/src/file/kip.hpp b/Source/hoc-clk/sysmodule/src/file/kip.hpp index 408047ee..75f802dd 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.hpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.hpp @@ -99,8 +99,10 @@ namespace kip { u32 t6_tRTW_fine_tune; u32 t7_tWTR_fine_tune; + + u32 pcvLogVerbosity; - u32 reserved[60]; + u32 reserved[58]; } CustomizeTable; #define CUST_MAGIC "CUST" @@ -505,6 +507,10 @@ namespace kip { return CUST_GET_FIELD(t, t7_tWTR_fine_tune); } + static inline u32 cust_get_log_verbosity(const CustomizeTable *t) { + return CUST_GET_FIELD(t, pcvLogVerbosity); + } + static inline u32 cust_get_read_latency_1333(const CustomizeTable *t) { return CUST_GET_FIELD(t, readLatency1333); } diff --git a/build.sh b/build.sh index 98c816e7..95846d70 100644 --- a/build.sh +++ b/build.sh @@ -5,7 +5,7 @@ LDR_MAKE="nx_release" LDR_SET=0 NO_EXO=0 JOBS="" -UART_LOGGING=0 +DEBUG_BUILD=0 ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIST_DIR="$ROOT_DIR/dist" @@ -19,8 +19,8 @@ while [ $# -gt 0 ]; do LDR_MAKE="${1#*=}" LDR_SET=1 ;; - -u|--uart) - UART_LOGGING=1 + -d|--debug) + DEBUG_BUILD=1 ;; --no-exo) NO_EXO=1 @@ -40,7 +40,7 @@ while [ $# -gt 0 ]; do shift done -if [ "$UART_LOGGING" -eq 1 ] && [ "$LDR_SET" -eq 0 ]; then +if [ "$DEBUG_BUILD" -eq 1 ] && [ "$LDR_SET" -eq 0 ]; then LDR_MAKE="nx_audit" fi @@ -55,8 +55,8 @@ if [ "$NO_EXO" -eq 1 ]; then echo "NO_EXO = 1" fi -if [ "$UART_LOGGING" -eq 1 ]; then - echo "UART_LOGGING = 1 (loader build: $LDR_MAKE, UART logging enabled)" +if [ "$DEBUG_BUILD" -eq 1 ]; then + echo "DEBUG_BUILD = 1 (loader build: $LDR_MAKE, debug build =)" fi CORES="$(nproc --all)" @@ -144,7 +144,7 @@ done echo echo "*** Compiling loader ***" cd build/atmosphere/stratosphere/loader || exit 1 -make -j$JOBS HOC_UART_LOG=$UART_LOGGING "$LDR_MAKE" +make -j$JOBS HOC_UART_LOG=$DEBUG_BUILD "$LDR_MAKE" hactool -t kip1 "out/nintendo_nx_arm64_armv8a/$LDR_BUILD_PATH/loader.kip" --uncompress=hoc.kip cd "$ROOT_DIR" # exit cp -v build/atmosphere/stratosphere/loader/hoc.kip dist/atmosphere/kips/hoc.kip @@ -165,7 +165,11 @@ if [ -n "$ATMOSPHERE_CCACHE" ]; then fi cd Source/hoc-clk/ -./build.sh +if [ "$DEBUG_BUILD" -eq 1 ]; then + ./build.sh "" -d +else + ./build.sh +fi cp -r dist/ ../../ cd "$ROOT_DIR"